Как заставить этот скрипт bash работать, если переменная fileName содержит пробел? - PullRequest
1 голос
/ 15 января 2010
#!/bin/bash -x

echo "Enter file name: "
read fileName
fileName=`pwd`"/$fileName"
if [ -f $fileName ]; then
    echo "file is present"
fi

Даже если я изменю значение fileName, добавив кавычки в начале и в конце. Сценарий по-прежнему не работает.

Ответы [ 6 ]

5 голосов
/ 15 января 2010

Вы также должны использовать кавычки в if:

if [ -f "$fileName" ]; then
4 голосов
/ 15 января 2010

Заключение в двойные кавычки работает для меня:

#!/bin/bash -x

echo "Enter file name: "
read fileName
fileName=`pwd`"/$fileName"
if [ -f "$fileName" ]; then
        echo "file is present"
fi

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

3 голосов
/ 15 января 2010

Измените if [ -f $fileName ]; then на if -f "$fileName" ];. В противном случае, если файл содержит пробел, операции -f будет передано более одного аргумента. Если вы передали файл с именем «этот файл», оболочка расширит его до:

if [ -f this file ]; then

вызывает ошибку.

2 голосов
/ 15 января 2010

Вы добавляете pwd, даже если пользователь ввел абсолютный путь. Попробуйте это:

case "$fileName" in
    /*) ;; # okay
    *)  fileName=`pwd`/"$fileName"
esac

Это будет только перед pwd, если fileName не начинается с /.

Кроме того, ваш if тест будет успешным, только если fileName является обычным файлом. Если вы хотите, чтобы это было успешно для каталогов и т.п., протестируйте с -e вместо -f.

2 голосов
/ 15 января 2010

Вы можете указать имя файла при выполнении теста -f. Попробуйте вместо этого

#!/bin/bash -x
echo "Enter file name: "
read fileName
fileName=`pwd`/$fileName
if [ -f "$fileName" ]; then
    echo "file is present"
fi
1 голос
/ 15 января 2010

Имя файла с кавычками:

if [ -f "$fileName" ]; then
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...