Я хочу проверить наличие нескольких каталогов, скажем dir1
, dir2
и dir3
в рабочем каталоге.
У меня есть следующее
if [ -d "$PWD/dir1" ] && [ -d "$PWD/dir2" ] && [ -d "$PWD/dir3" ]; then
echo True
else
echo False
fi
Но я подозреваю, что есть более элегантный способ сделать это. Не думайте, что в именах каталогов есть шаблон.
Цель состоит в том, чтобы проверить наличие нескольких каталогов и отсутствие других.
Я использую Bash, но переносимый код предпочтительнее.
shell-script
shell
files
directory
control-flow
утонченность
источник
источник
$PWD
, кстати.[ -d "$PWD/dir1"]
эквивалентно[ -d "dir1" ]
.Ответы:
Если вы уже ожидаете, что они будут каталогами и просто проверяете, все ли они существуют, вы можете использовать код выхода из
ls
утилиты, чтобы определить, произошла ли одна или несколько «ошибок» :Я перенаправляю вывод и stderr для
/dev/null
того, чтобы он исчез, так как нам важен только код выходаls
, а не его вывод. Все, что написано,/dev/null
исчезает - оно не записывается на ваш терминал.источник
1
это стандартный вывод,2
это стандартный вывод, и я знаю, что такое перенаправление. Я не понимаю значения/dev/null
, и я не знаю, как разобрать команду.&>filename
перенаправляет как stdout и stderrfilename
. Так нельзя ли упростить команду (по крайней мере, для меня это проще) какls "$PWD/dir1" "$PWD/dir2" "$PWD/dir2" &>/dev/null && echo All there
?-d
опцию (а), поэтому онаls
требует только для статистики каталогов, а не их чтения, и (б), чтобы команда выполнялась успешно, даже если у пользователя нет доступа на чтение к каталогам. (2) Я не вижу никакой причины для использования,"$PWD/"
кроме как для защиты от каталогов, имена которых начинаются с-
(и, конечно, есть лучшие способы сделать это).Я бы зациклился
break
Вызывает петлю к короткому замыканию, так же , как ваша цепь&&
источник
Цикл может быть более элегантным:
Это Баш. Более портативным является Ш. Там вы можете использовать позиционный массив:
Затем зациклить его использовать
"$@"
.источник
Почему бы просто:
источник
But I suspect there is a more elegant way of doing this
-a
: «-a
и-o
бинарные операторы первичных (...) помечены как устаревшие»: pubs.opengroup.org/onlinepubs/9699919799test
(иначе[
) три раза, это вызывает его один раз,Что касается вопроса, две переносимые функции оболочки, которые проверяют наличие и отсутствие нескольких каталогов:
Пример:
источник
Основываясь на ответе Гленна Джекмана , мы можем проверить отсутствие других имен:
Я имел обыкновение[ -e "$dir" ]
проверять,"$dir"
существует ли ; то есть, еслиdir5
существует, но является файлом, результатом являетсяFalse
. Если вы хотите только проверить, являются ли имена во второй группе каталогами, используйте[ -d "$dir" ]
, как в первом цикле.Поскольку мы говорим о проверке наличия вещей в текущем рабочем каталоге, возможно, нет необходимости указывать
$PWD/
имена; просто делатьисточник