0

Не удается установить переменные в bash-скрипте [дублирующий вопрос]

9

Я пытаюсь автоматизировать перемещение файлов из одной папки в другую каждую ночь с помощью 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

Теперь у меня есть несколько проблем:

  1. Я не могу установить переменные. Даже если я просто пытаюсь присвоить переменной какое-то значение, все мои echo выводят пустые строки. Я также не могу получить день, месяц или год - они тоже приходят пустыми.

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

  3. Я получаю ошибку о неожиданном конце файла.

Я создал файл и выполнил команду chmod u+x scriptname.sh.

Я не понимаю, почему ничего не работает. Я совершенно новичок в bash-скриптах на OSX и имею опыт только с vbscript на Windows. Буду благодарен за любую помощь, спасибо!

3 ответ(ов)

0

Ваша проблема заключается в том, что присваивания в 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

Обратите внимание на изменения:

  1. Заменил ECHO на echo.
  2. Удалил пробелы вокруг знака = при присваивании переменных.
  3. Обрамил команды date в $().
  4. Добавил пробелы после 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, если она вам нужна.

0

Вот пять рекомендаций, которые помогут вам избежать распространенных ошибок в скриптах:

  1. Не ставьте пробел перед или после знака равенства (=).
  2. Используйте конструкцию "$(...)", чтобы получить вывод команды как текст.
  3. Знайте, что [ является командой. Обязательно ставьте пробел между ней и аргументами.
  4. Учтите, что команды чувствительны к регистру. Вам требуется использовать echo.
  5. Оборачивайте переменные в двойные кавычки, например: rm "$folderToBeMoved".

Следуя этим рекомендациям, вы сможете избежать многих типичных ошибок при написании скриптов.

0

Вот ваш исправленный скрипт:

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

Обратите внимание на следующие изменения:

  1. Используйте echo с маленькой буквы, вместо ECHO с заглавной, так как в bash команды обычно пишутся в нижнем регистре.
  2. Убедитесь, что mkdir создает директорию без ошибки, добавив флаг -p, чтобы не получали ошибку, если директория уже существует.
  3. Соблюдайте пробелы в квадратных скобках в условии if и всегда заключайте переменные в кавычки, чтобы избежать ошибок с пробелами и специальными символами.

Таким образом ваш скрипт станет более надежным и читабельным.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь