Проверка наличия нескольких каталогов

Магия заключается в функции _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

8
02.03.2019, 17:13
5 ответов

Я бы зациклился:

result=True
for dir in \
        "$PWD/dir1" \
        "$PWD/dir2" \
        "$PWD/dir3" 
do
    if ! [ -d "$dir" ]; then
        result=False
        break
    fi
done
echo "$result"

breakвызывает короткое замыкание -контура, точно так же, как ваша цепочка из&&

10
27.01.2020, 20:08

Цикл может быть более элегантным:

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"

Затем, чтобы перебрать его, используйте "$@".

5
27.01.2020, 20:08

Если вы уже ожидаете, что это каталоги, и просто проверяете, все ли они существуют, вы можете использовать код выхода из утилиты ls, чтобы определить, произошла ли одна или несколько «ошибок»:

ls "$PWD/dir1" "$PWD/dir2" "$PWD/dir3" >/dev/null 2>&1 && echo All there

Я перенаправляю вывод и stderr в /dev/null, чтобы они исчезли, поскольку нас интересует только код выхода из ls, а не его вывод. Все, что записано в /dev/null, исчезает — оно не записывается на ваш терминал.

5
27.01.2020, 20:08

Почему бы просто не:

if [ -d "dir1" -a -d "dir2" -a -d "dir3" ]; then
    echo True
else
    echo False
fi
5
27.01.2020, 20:08

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
      ︙
1
27.01.2020, 20:08

Теги

Похожие вопросы