Я создаю шаблон скрипта оболочки для проекта, одна функция, которая является обязательной, это возможность сделать копию файла конфигурации шаблона как новый файл. Однако, это не будет обрабатываться статически, я создаю и устанавливаю переменную времени выполнения( $modloader
)который берется из имени файла скриптов оболочки и копирует шаблон как это же имя. Я провел несколько тестов со статическими именами файлов и cp
работает нормально, но, похоже, разваливается при проверке, присутствует ли уже файл(строка 5). Если я запускаю это в терминале, он не видит файл, который он проверяет. Я полагаю, что он ищет его в более буквальном контексте и не'понимать'он использует переменную.
#!/bin/sh
modloader=`basename -s .sh "$0"`
if "./Settings/$modloader.ini"; then
cp "./Settings/Template.ini" "./Settings/$modloader.ini"
fi
решение1
похоже, что при проверке наличия файла происходит сбой
Я не вижу, что вы проверяете, присутствует ли уже файл. Ваши if "./Settings/$modloader.ini";
попыткибегатьini-файл. В общем, это может быть допустимым тестом для чего-либо, если файл предназначен для запуска таким образом и возврата статуса выхода в соответствии с тем, что вы хотите протестировать.
Даже если бы запуск рассматриваемого файла был возможен, не имело бы смысла делать файл тестером своего собственного (не)существования.
Правильный способ определить в оболочке, существует ли файл, следующий:
test -e "./Settings/$modloader.ini"
# or equivalently
[ -e "./Settings/$modloader.ini" ]
Примечания:
test -e
тесты для файлалюбой тип.test -e
или подобное даст вам ложный отрицательный результат (т.е. ненулевой код выхода), если разрешения для некоторого соответствующего каталога (например,Settings
в вашем случае) не позволяют проверить, существует ли файл.
Кроме того, вы хотите отменить тест. Строка в вашем коде будет выглядеть так:
if ! [ -e "./Settings/$modloader.ini" ]; then
if
хотя это не обязательно. GNU cp
с -n
( --no-clobber
) может быть всем, что вам нужно вместо этого if … fi
вашего. Опция непереносима, и вам, скорее всего, понадобится другая непереносимая опция -T
( --no-target-directory
) на случай, если цель окажется (символической ссылкой) на каталог.
cp -nT "./Settings/Template.ini" "./Settings/$modloader.ini"
Обратите внимание, если цель уже существует и, таким образом, cp -n
является пустой операцией, статус выхода будет 0
. Вы получите тот же статус выхода, если цель не существует и копирование прошло успешно. Это означает, что если вы хотите сделать больше (чем cp
) в зависимости от того, существовал файл или нет, вам if
в любом случае нужно предварительное значение.