Я пытаюсь написать чрезвычайно простой скрипт в Ubuntu, который позволил бы мне передать ему имя файла или каталог, и иметь возможность делать что-то конкретное, когда это файл, и что-то еще, когда это каталог. Проблема в том, что в имени каталога или, возможно, в файлах также есть пробелы или другие экранируемые символы в имени.
Ниже приведен мой основной код и пара тестов.
#!/bin/bash
PASSED=$1
if [ -d "${PASSED}" ] ; then
echo "$PASSED is a directory";
else
if [ -f "${PASSED}" ]; then
echo "${PASSED} is a file";
else
echo "${PASSED} is not valid";
exit 1
fi
fi
И вот вывод:
andy@server~ $ ./scripts/testmove.sh /home/andy/
/home/andy/ is a directory
andy@server~ $ ./scripts/testmove.sh /home/andy/blah.txt
/home/andy/blah.txt is a file
andy@server~ $ ./scripts/testmove.sh /home/andy/blah\ with\ a\ space.txt
/home/andy/blah with a space.txt is not valid
andy@server~ $ ./scripts/testmove.sh /home/andy\ with\ a\ space/
/home/andy with a space/ is not valid
Все эти пути действительны и существуют.
if
-else
конструкции в Bash также поддерживаютelif
. Просто к вашему сведению.Ответы:
Это должно работать. Я не уверен, почему это терпит неудачу. Вы правильно цитируете свои переменные. Что произойдет, если вы используете этот скрипт с двойным
[[
]]
?Двойные квадратные скобки - это расширение bash для
[ ]
. Это не требует переменных в кавычках, даже если они содержат пробелы.Также стоит попробовать:
-e
проверить, существует ли путь, не проверяя тип файла.источник
По крайней мере, напишите код без густого дерева:
Когда я помещаю это в файл "xx.sh", создаю файл "xx sh" и запускаю его, я получаю:
Учитывая, что у вас возникли проблемы, вы должны отладить скрипт, добавив:
Это покажет вам, что
ls
думает об именах, которые вы передаете сценарию.источник
Использование команды «file» может быть полезно для этого:
Примеры вывода:
К вашему сведению: приведенные выше ответы работают, но вы можете использовать -s, чтобы помочь в странных ситуациях, проверив сначала действительный файл:
источник
-s
проверяет непустой файл, файл с ненулевым размером)? И вы не будете печатать какие-либо диагнозы для специальных блоков, специальных символов, FIFO и т. Д.? Симлинки, вероятно, разрешают то, что находится в дальнем конце ссылки; сломанные символические ссылки более проблематичны.--brief
флагfile
. Это просто выводит,directory
когда это так.Использование
-f
и-d
включает/bin/test
:источник
test
обычно это встроенная оболочка, хотя обычно есть также исполняемый файл, такой как/bin/test
, а также/bin/[
.)Более элегантное решение
источник
if [ -f "$x" ]
.источник
Это должно работать:
источник
источник
Один лайнер
результат равен true (0) (dir) или true (0) (файл) или false (1) (ни один)
источник
touch bob
наmkdir bob
, я получаю вывод:dir
иfile
на две строки.