Не удается установить переменные в bash-скрипте [дублирующий вопрос]
Я пытаюсь автоматизировать перемещение файлов из одной папки в другую каждую ночь с помощью bash-скрипта, который запускается из AppleScript по расписанию. Я пишу bash-скрипт на 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-скриптах на OSX и имею опыт только с vbscript на Windows. Буду благодарен за любую помощь, спасибо!
3 ответ(ов)
Ваша проблема заключается в том, что присваивания в Bash-скриптах не могут содержать пробелы вокруг знака =
. Кроме того, вы, вероятно, хотите обрамить команды date
в конструкцию $()
, чтобы корректно получить вывод. Также обратите внимание, что команда ECHO
с большой буквы не сработает, так как в Bash она регистронезависимая и должна быть написана как 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"
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
наecho
. - Удалил пробелы вокруг знака
=
при присваивании переменных. - Обрамил команды
date
в$()
. - Добавил пробелы после
if
и перед[
в условии, и заключил имена файлов и папок в кавычки, чтобы избежать потенциальных проблем с пробелами в путях.
Если вы закомментируете последние три строки, то вывод будет таким:
Network is
day is 16
Month is March
YEAR is 2023
source is /users/test/Documents/Archive/Primetime.eyetv
dest is /Volumes/Media/Network/ABC/March162023
Не забудьте проверить, правильно ли указаны пути к файлам и директориям, а также наличие переменной network
, если она вам нужна.
Вот пять рекомендаций, которые помогут вам избежать распространенных ошибок в скриптах:
- Не ставьте пробел перед или после знака равенства (
=
). - Используйте конструкцию
"$(...)"
, чтобы получить вывод команды как текст. - Знайте, что
[
является командой. Обязательно ставьте пробел между ней и аргументами. - Учтите, что команды чувствительны к регистру. Вам требуется использовать
echo
. - Оборачивайте переменные в двойные кавычки, например:
rm "$folderToBeMoved"
.
Следуя этим рекомендациям, вы сможете избежать многих типичных ошибок при написании скриптов.
Вот ваш исправленный скрипт:
#!/bin/bash
folder="ABC" # не добавляйте пробелы в присваивании
useracct='test'
day=$(date "+%d") # используйте $() для присвоения результата команды date переменной
month=$(date "+%B")
year=$(date "+%Y")
folderToBeMoved="/users/$useracct/Documents/Archive/Primetime.eyetv"
newfoldername="/Volumes/Media/Network/$folder/$month$day$year"
echo "Сеть: $network"
echo "День: $day"
echo "Месяц: $month"
echo "Год: $year"
echo "Исходная папка: $folderToBeMoved"
echo "Папка назначения: $newfoldername"
mkdir -p "$newfoldername"
cp -R "$folderToBeMoved" "$newfoldername"
if [ -f "$newfoldername/Primetime.eyetv" ]; then # <-- ставьте пробелы внутри квадратных скобок и заключайте переменные в кавычки.
rm "$folderToBeMoved"
fi
Обратите внимание на следующие изменения:
- Используйте
echo
с маленькой буквы, вместоECHO
с заглавной, так как в bash команды обычно пишутся в нижнем регистре. - Убедитесь, что
mkdir
создает директорию без ошибки, добавив флаг-p
, чтобы не получали ошибку, если директория уже существует. - Соблюдайте пробелы в квадратных скобках в условии if и всегда заключайте переменные в кавычки, чтобы избежать ошибок с пробелами и специальными символами.
Таким образом ваш скрипт станет более надежным и читабельным.
Как объявить и использовать логические переменные в shell-скрипте?
Как работает "cat << EOF" в bash?
Как в Bash-скрипте выйти из всего скрипта при выполнении определенного условия?
Как задать текущую рабочую директорию как директорию скрипта в Bash?
Как отключить индикатор прогресса в cURL?