Копировать файл по переменной, если ее еще нет

Копировать файл по переменной, если ее еще нет

Я создаю шаблон скрипта оболочки для проекта, одна функция, которая является обязательной, это возможность сделать копию файла конфигурации шаблона как новый файл. Однако, это не будет обрабатываться статически, я создаю и устанавливаю переменную времени выполнения( $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в любом случае нужно предварительное значение.

Связанный контент