2

Вот скрипт, который я запускаю

#$1 - Argument
declare IPATH="sample/"
declare F=$IPATH$1
echo $F
ls $F

Входные данные ./script.sh "Fil*"

Эхо-выход -

sample/Fil*

когда я запускаю команду ls sample/Fil* я получаю требуемый вывод - список файлов, имена которых начинаются с FIL и находятся в папке с примерами, как это -

sample/File  sample/File1  sample/File2

Но скрипт выдает следующее исключение. Что я делаю неправильно?

ls: sample/Fil*: No such file or directory ls: $IPATH: No such file or directory

3 ответа3

8

Глобусы не раскрываются в кавычках. Вы можете расширить их в сценариях, но это действительно плохая практика (Что делать , если кто - то имел имя файла , содержащего * ? Они не смогут использовать ваш скрипт для манипулирования им). Рекомендуется заключать в кавычки все ссылки на переменные в скриптах и передавать фактические пути к скриптам:

$ mkdir sample
$ touch sample/File1 sample/File2
$ cat script.sh 
#!/bin/sh
F="$1"
echo "$F"
ls "$F"
$ ./script.sh sample/Fil*
sample/File1
sample/File1

Или, что еще лучше, переберите все файлы:

$ cat script.sh 
#!/bin/sh
for path
do
    echo "$path"
    ls "$path"
done
$ ./script.sh sample/Fil*
sample/File1
sample/File1
sample/File2
sample/File2

Если вы хотите жестко запрограммировать часть пути, вы можете использовать find для его расширения:

while IFS= read -r -d '' -u 9 path
do
    ls -- "$path"
done 9< <( find "sample" -name "$1" -exec printf '%s\0' {} + )
-1

ls работает в отдельной оболочке. В этой оболочке IPATH не определен, так как вы не экспортировали его.

Измените "объявить" на "экспорт", и это будет работать.

-1

Уберите ключевое слово объявления , и оно будет работать. Нет необходимости печатать на Bash:

   #!/bin/sh
   IPATH="sample/"
   F=$IPATH$1
   echo $F
   ls $F

Это будет работать, как вы ожидаете.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .