2010-03-17 18 views
17

Estoy intentando automatizar el movimiento de archivos de una carpeta a una nueva carpeta de forma automática todas las noches utilizando una secuencia de comandos bash ejecutada desde AppleScript en un horario. Estoy intentando escribir un script bash en Mac OSX, y sigue fallando. En resumen, esto es lo que tengo (todos mis echo s son para la comprobación de errores):No se pueden establecer variables en el 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 

Ahora mi primer problema es que no puedo establecer variables en absoluto. Incluso literales donde simplemente lo hago igual a algo literal. Todos mis echo salen en blanco. No puedo tomar el día, el mes o el año tampoco, también aparece en blanco.

Me sale un error al decir que -f no se encuentra.

Me sale un error al decir que hay un final inesperado de archivo.

hice el archivo y lo hicieron un chmod u+x scriptname.sh

No estoy seguro de por qué no funciona en absoluto. Soy muy nuevo en este script bash en OSX y solo tengo experiencia con Windows vbscript. ¡Cualquier ayuda sería genial, gracias!

Respuesta

40

Asignación de scripts bash no puede tener espacios alrededor del = y es probable que desee que sus comandos fecha encerrados en acentos abiertos$():

#!/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 

Con las tres últimas líneas comentadas, para mí esto salidas :

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

Las garrapatas traseras son malvadas (no encajables). Yo usaría $() yo mismo. Pero +1 para una buena respuesta. – paxdiablo

+0

@paxdiablo Estoy aprendiendo muy lentamente a usar '$()', pero es un poco difícil volver a programar un hábito de 15 años. – Isaac

+0

@Isaac: vale la pena. Escribí un script de pelusa que periódicamente rastrea '~/bin' y yammers sobre los backticks. Expírelos! –

20

cinco problemas:

  1. no ponga un espacio antes o después del signo igual.
  2. Utilice "$(...)" para obtener la salida de un comando como texto.
  3. [ es un comando. Pon un espacio entre eso y los argumentos.
  4. Los comandos distinguen entre mayúsculas y minúsculas. Quiere echo.
  5. Utilice comillas dobles para las variables. rm "$folderToBeMoved"
+1

+1, que prácticamente lo cubre. # 4 no es preciso para la mayoría de los sistemas OS X sin embargo. Como la configuración estándar tiene un sistema de archivos insensible a mayúsculas y minúsculas, ECHO funcionará perfectamente. Todavía no lo recomendaría, pero no causará problemas con este script. –

+0

El sistema de archivos predeterminado en Mac OS X no distingue entre mayúsculas y minúsculas. 'ECHO' funciona tan bien como' echo', aunque para la portabilidad no es una buena idea. – dreamlax

+1

Lo suficiente, pero luego 'ECHO' ejecuta el ejecutable, y no el bash incorporado. –

3

aquí está la secuencia de comandos modificada

#!/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" intenta ejecutar un comando llamado folder con argumentos = y "ABC". El formato del comando de bash es:

command arguments separated with space 

mientras que la asignación se realiza con:

variable=something 

  • En [ -f $newfoldername/Primetime.eyetv], [ es un comando (test) y -f y $newfoldername/Primetime.eyetv] son dos argumentos.Es espera un tercer argumento (]) que no puede encontrar (los argumentos deben ser separados por espacio) y por lo tanto mostrará el error.
  • [-f $newfoldername/Primetime.eyetv] trata de ejecutar un comando con el argumento [-f$newfoldername/Primetime.eyetv]

En general, para casos como este, pegue el código en shellcheck y ver los comentarios.

Cuestiones relacionadas