Магия заключается в функции _init_completion
, которая определена в файле bash_completion
пакета bash-completing. .
Нет простого выхода. Если вы хотите разумного завершения в bash, установите пакет bash-completing. Затем определите функцию:
. /etc/bash_completion
_my_mysql () {
local cur prev words cword
_init_completion || return
COMPREPLY=($(compgen -W 'firstdatabase databasetwo etc' "$cur"))
}
complete -F _my_mysql mysql
Я бы зациклился:
result=True
for dir in \
"$PWD/dir1" \
"$PWD/dir2" \
"$PWD/dir3"
do
if ! [ -d "$dir" ]; then
result=False
break
fi
done
echo "$result"
break
вызывает короткое замыкание -контура, точно так же, как ваша цепочка из&&
Цикл может быть более элегантным:
arr=("$PWD/dir1" "$PWD/dir2" "$PWD/dir2")
for d in "${arr[@]}"; do
if [ -d "$d"]; then
echo True
else
echo False
fi
done
Это Баш. Более портативный - Sh. Там вы можете использовать позиционный массив:
set -- "$PWD/dir1" "$PWD/dir2" "$PWD/dir2"
Затем, чтобы перебрать его, используйте "$@"
.
Если вы уже ожидаете, что это каталоги, и просто проверяете, все ли они существуют, вы можете использовать код выхода из утилиты ls
, чтобы определить, произошла ли одна или несколько «ошибок»:
ls "$PWD/dir1" "$PWD/dir2" "$PWD/dir3" >/dev/null 2>&1 && echo All there
Я перенаправляю вывод и stderr в /dev/null
, чтобы они исчезли, поскольку нас интересует только код выхода из ls
, а не его вывод. Все, что записано в /dev/null
, исчезает — оно не записывается на ваш терминал.
Почему бы просто не:
if [ -d "dir1" -a -d "dir2" -a -d "dir3" ]; then
echo True
else
echo False
fi
The goal is to check for the existence of a few directories and for the nonexistence of others. [Emphasis added]
Основываясь на ответе Гленна Джекмана , мы можем проверить отсутствие других имен, подобных этому :
result=True for dir in \ "$PWD/dir1" \ "$PWD/dir2" \ "$PWD/dir3" do if ! [ -d "$dir" ]; then result=False break fi done for dir in \ "$PWD/dir4" \ "$PWD/dir5" \ "$PWD/dir6" do if [ -e "$dir" ]; then # Note: no “!” result=False break fi done echo "$result"Я использовал
[ -e "$dir" ]
, чтобы проверить, существует ли "$dir"
; т. е. если dir5
существует, но является файлом, результатом будет False
. Если вы хотите только проверить, являются ли имена во второй группе каталогами, используйте [ -d "$dir" ]
, как и в первом цикле. Поскольку мы говорим о проверке существования вещей в текущем рабочем каталоге, возможно, нет необходимости указывать $PWD/
в именах; просто сделай
for dir in \ "dir1" \ "dir2" \ "dir3" do ︙