Невозможно установить переменные в 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. Любая помощь будет большой, спасибо!
Ответы
Ответ 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 и посмотрите обратную связь.