2010-03-17 8 views
17

Je tente d'automatiser le déplacement automatique de fichiers d'un dossier vers un nouveau dossier chaque nuit à l'aide d'un script bash exécuté à partir d'AppleScript selon un planning. Je tente d'écrire un script bash sur Mac OSX, et il continue d'échouer. Bref ce que j'ai (tous mes echo s sont pour le contrôle d'erreur):Impossible de définir les variables dans le script bash

#!/bin/bash 
folder = "ABC" 
useracct = 'test' 
day = date "+%d" 
month = date "+%B" 
year = date "+%Y" 
folderToBeMoved = "https://stackoverflow.com/users/$useracct/Documents/Archive/Primetime.eyetv" 
newfoldername = "/Volumes/Media/Network/$folder/$month$day$year" 
ECHO "Network is $network" $network 
ECHO "day is $day" 
ECHO "Month is $month" 
ECHO "YEAR is $year" 
ECHO "source is $folderToBeMoved" 
ECHO "dest is $newfoldername" 
mkdir $newfoldername 
cp -R $folderToBeMoved $newfoldername 
if [-f $newfoldername/Primetime.eyetv]; 
    then rm $folderToBeMoved; 
fi 

Maintenant, mon premier problème est que je ne peux pas définir des variables du tout. Même littérales où je le fais juste égal au littéral. Tous mes echo sortent vides. Je ne peux pas saisir le jour, le mois ou l'année non plus, ça sort également vide.

Je reçois une erreur indiquant que -f est introuvable.

Je reçois une erreur disant qu'il y a une fin de fichier inattendue.

J'ai fait le dossier et a fait un chmod u+x scriptname.sh

Je ne sais pas pourquoi rien ne fonctionne pas du tout. Je suis très nouveau à ce script bash sur OSX, et n'ai qu'une expérience avec Windows vbscript. Toute aide serait géniale, merci!

Répondre

40

Affectation dans les scripts bash ne peut pas avoir des espaces autour du = et que vous voulez probablement vos commandes de date enfermés dans accents graves$():

#!/bin/bash 
folder="ABC" 
useracct='test' 
day=$(date "+%d") 
month=$(date "+%B") 
year=$(date "+%Y") 
folderToBeMoved="https://stackoverflow.com/users/$useracct/Documents/Archive/Primetime.eyetv" 
newfoldername="/Volumes/Media/Network/$folder/$month$day$year" 
ECHO "Network is $network" $network 
ECHO "day is $day" 
ECHO "Month is $month" 
ECHO "YEAR is $year" 
ECHO "source is $folderToBeMoved" 
ECHO "dest is $newfoldername" 
mkdir $newfoldername 
cp -R $folderToBeMoved $newfoldername 
if [-f $newfoldername/Primetime.eyetv]; then rm $folderToBeMoved; fi 

Avec les trois dernières lignes commentées, pour moi cette sortie :

Network is 
day is 16 
Month is March 
YEAR is 2010 
source is /users/test/Documents/Archive/Primetime.eyetv 
dest is /Volumes/Media/Network/ABC/March162010 
+2

Les ticks arrières sont mauvais (non-imbriquable). J'utiliserais $() moi-même. Mais +1 pour une bonne réponse. – paxdiablo

+0

@paxdiablo J'apprends très lentement à utiliser '$()' moi-même, mais il est un peu difficile de reprogrammer une habitude vieille de 15 ans. – Isaac

+0

@Isaac: ça en vaut la peine. J'ai écrit un script de charpie qui explore régulièrement '~/bin' et yammers à propos des backticks. Effacez-les! –

20

Cinq problèmes:

  1. Ne pas mettre un espace avant ou après le signe égal. Utilisez le "$(...)" pour obtenir la sortie d'une commande au format texte.
  2. [ est une commande. Mettez un espace entre elle et les arguments.
  3. Les commandes sont sensibles à la casse. Vous voulez echo.
  4. Utilisez des guillemets doubles autour des variables. rm "$folderToBeMoved"
+1

+1, cela couvre à peu près tout. # 4 n'est pas précis pour la plupart des systèmes OS X cependant. Etant donné que la configuration standard a un système de fichiers insensible à la casse, ECHO fonctionnera très bien. Je ne le recommanderais toujours pas, mais ça ne va pas causer de problème avec ce script. –

+0

Le système de fichiers par défaut de Mac OS X est insensible à la casse. 'ECHO' fonctionne aussi bien que' echo', bien que ce ne soit pas une bonne idée pour la portabilité. – dreamlax

+1

Assez juste, mais alors 'ECHO' exécute l'exécutable, et non le bash intégré. –

3

voici votre script modifié

#!/bin/bash  
folder="ABC" #no spaces between assignment  
useracct='test'  
day=$(date "+%d") # use $() to assign return value of date command to variable  
month=$(date "+%B")  
year=$(date "+%Y")  
folderToBeMoved="https://stackoverflow.com/users/$useracct/Documents/Archive/Primetime.eyetv"  
newfoldername="/Volumes/Media/Network/$folder/$month$day$year"  
ECHO "Network is $network" $network  
ECHO "day is $day"  
ECHO "Month is $month"  
ECHO "YEAR is $year"  
ECHO "source is $folderToBeMoved"  
ECHO "dest is $newfoldername"  

mkdir "$newfoldername"  
cp -R "$folderToBeMoved" "$newfoldername" 
if [ -f "$newfoldername/Primetime.eyetv" ]; then # <-- put a space at square brackets and quote your variables. 
rm "$folderToBeMoved"; 
fi 
1

folder = "ABC" tente d'exécuter une commande nommée folder avec des arguments = et "ABC". Le format de commande en bash est:

command arguments separated with space 

en mission se fait avec:

variable=something 

  • En [ -f $newfoldername/Primetime.eyetv], [ est une commande (test) et -f et $newfoldername/Primetime.eyetv] sont deux arguments.Il attend un troisième argument (]) qu'il ne peut pas trouver (les arguments doivent être séparés par un espace) et affichera donc une erreur.
  • [-f $newfoldername/Primetime.eyetv] tente d'exécuter une commande [-f avec l'argument $newfoldername/Primetime.eyetv]

En général, pour les cas comme celui-ci, collez votre code dans shellcheck et de voir les évaluations.

Questions connexes