Один параметр командной строки не работает, если оператор
Я пишу сценарий bash для организации файла.txt, который загружается сценарием bash с использованием параметра командной строки:
bash ./myScript.sh textfile.txt
У меня есть оператор if (ниже, не функциональный), который должен определить, существует ли файл.txt в том же каталоге. Если это так, он подтверждает это с пользователем, и сценарий продолжается. Если он не существует, сценарий должен непрерывно проверять, является ли ввод пользователя существующим файлом в рабочем каталоге, прежде чем продолжить.
Вот что у меня так далеко:
#CS101 Assignment BASH script
CARFILE=$1
wc $CARFILE
if [ -f $CARFILE ]
then
echo "$CARFILE exists, please continue"
else
echo "This file does not exist, please enter the new filename and press [ENTER]"
read CARFILE
echo "We have detected that you're using $CARFILE as your cars file, please continue."
fi
Это просто выводит: exists, please continue
если вы не запускаете его с.txt (т.е. bash jag32.sh
вместо bash jag32.sh textfile.txt
).
Кто-нибудь может помочь, пожалуйста?
Благодарю.
1 ответ
Здесь есть две проблемы. Во-первых, ты звонишь wc $CARFILE
прежде чем проверить, если $CARFILE
существует. Если указать без параметров (bash jag32.sh
), то это становится просто wc
, который будет ждать ввода на стандартный ввод.
Прежде чем идти дальше, bash -x
это ваш друг: он будет отслеживать выполнение вашего скрипта, показывая вам, какие именно команды запускает скрипт. Это часто поможет осветить проблемы:
bash -x jag32.sh
Проблема с вашим тестом:
if [ -f $CARFILE ]
Это если $CARFILE
пусто становится просто:
if [ -f ]
Который оценивает true
, Какие!? Это потому, что тест существования файла принимает два параметра (-f FILE
), и когда $CARFILE
пуст, у вас есть только один, так что он оценивается как простой is-this-string-empty? тестовое задание.
И именно поэтому вы всегда указываете переменные:
if [ -f "$CARFILE" ]
Если $CARFILE
пусто, это становится:
if [ -f "" ]
Который будет оценивать false
,
В дополнение к проверке на наличие файла, вы также можете сначала проверить, если $1
имеет какое-либо значение, или если вашему сценарию были переданы какие-либо аргументы. bash(1)
а также test(1)
На страницах man есть подробности, которые должны указывать вам правильное направление.