Один параметр командной строки не работает, если оператор

Я пишу сценарий 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 есть подробности, которые должны указывать вам правильное направление.

Другие вопросы по тегам