Подтвердить что ты не робот

Невозможно установить переменные в bash script

Я пытаюсь автоматизировать перенос файлов из папки в новую папку автоматически каждую ночь, используя bash script, запускаемый из AppleScript по расписанию. Я пытаюсь написать bash script на Mac OSX, и он продолжает терпеть неудачу. Короче говоря, это то, что у меня есть (все мои echo предназначены для проверки ошибок):

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

Теперь моя первая проблема заключается в том, что я вообще не могу устанавливать переменные. Даже буквальные, где я просто делаю это равным буквально. Все мои echo выдаются пустым. Я не могу схватить день, месяц или год, он тоже не работает.

Я получаю сообщение об ошибке, что -f не найден.

Я получаю сообщение об ошибке, когда есть неожиданный конец файла.

Я сделал файл и сделал chmod u+x scriptname.sh

Я не уверен, почему ничего не работает. Я очень новичок в этом bash script на OSX и имею только опыт работы с Windows vbscript. Любая помощь будет большой, спасибо!

4b9b3361

Ответ 1

Назначение в сценариях bash не может содержать пробелы вокруг =, и вам, вероятно, нужны команды даты, заключенные в backticks $():

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

Когда последние три строки закомментированы, для меня это выдает:

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

Пять проблем:

  • Не помещайте пробел до или после знака равенства.
  • Используйте "$(...)", чтобы получить вывод команды в виде текста.
  • [ - это команда. Поместите пробел между ним и аргументами.
  • Команды чувствительны к регистру. Вы хотите echo.
  • Используйте двойные кавычки вокруг переменных. rm "$folderToBeMoved"

Ответ 3

здесь ваши измененные script

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

folder = "ABC" пытается запустить команду с именем folder с аргументами = и "ABC". Формат команды в bash:

command arguments separated with space

в то время как назначение выполняется с помощью:

variable=something

  • В [ -f $newfoldername/Primetime.eyetv], [ - это команда (test) и -f и $newfoldername/Primetime.eyetv] - два аргумента. Это ожидает третий аргумент (]), который он не может найти (аргументы должны быть разделенных пробелом) и, таким образом, будет показывать ошибку.
  • [-f $newfoldername/Primetime.eyetv] пытается выполнить команду [-f с аргументом $newfoldername/Primetime.eyetv]

Как правило, для таких случаев вставьте свой код в shellcheck и посмотрите обратную связь.