web-dev-qa-db-fra.com

Impossible de définir des variables dans le script bash

J'essaie d'automatiser le déplacement automatique des fichiers d'un dossier vers un nouveau dossier tous les soirs à l'aide d'un script bash exécuté à partir d'AppleScript selon un calendrier. J'essaie d'écrire un script bash sur Mac OSX, et il échoue toujours. En bref, voici ce que j'ai (tous mes echo sont pour la vérification des erreurs):

#!/bin/bash
folder = "ABC"
useracct = 'test'
day = date "+%d"
month = date "+%B" 
year = date "+%Y"
folderToBeMoved = "/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 du tout définir de variables. Même les littéraux où je le fais juste égal à un littéral. Tous mes echo sont vides. Je ne peux pas non plus saisir le jour, le mois ou l'année, il est également vierge.

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

Je reçois une erreur indiquant une fin de fichier inattendue.

J'ai créé le fichier et fait un chmod u+x scriptname.sh

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

40
cohortq

L'affectation dans les scripts bash ne peut pas avoir d'espaces autour du = Et vous voulez probablement que vos commandes de date soient incluses dans astuces $():

#!/bin/bash
folder="ABC"
useracct='test'
day=$(date "+%d")
month=$(date "+%B")
year=$(date "+%Y")
folderToBeMoved="/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, cela produit:

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
78
Isaac

Cinq problèmes:

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

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="/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
4
ghostdog74

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

command arguments separated with space

tandis que l'affectation se fait avec:

variable=something

  • Dans [ -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] essaie d'exécuter une commande [-f avec l'argument $newfoldername/Primetime.eyetv]

Généralement pour des cas comme celui-ci, collez votre code dans shellcheck et consultez les commentaires.

4
Jahid