Есть ли в bash / bourne оператор «in»?

Обычная TAB не работает, потому что она привязана к завершению табуляции в поле имени файла. Вы можете выйти из него CTRL + TAB, а затем TAB (с CTRL или без него, как только вы выйдете из поля имени), а затем использовать клавиатуру оттуда (стрелки / пробел).

Тем не менее, если вы просто выделите весь текст в поле имени (CTRL-A), введите путь, например / home / (с обеими косыми чертами), и нажмите клавишу ВВОД, диалоговое окно переключится на правильную папку, которая является моей предпочтительный способ сделать это. Если вы точно знаете, где хотите сохранить, вы также можете просто ввести абсолютный путь в поле имени, как только вы наберете начальное / у вас даже будет завершение табуляции для папок.

Чтобы сохранить что-нибудь как /home/Bristol/Downloads/a.pdf, я могу сделать [CTRL + A] (выбрать все) / h [TAB] B [TAB] D [TAB] a.pdf [ENTER]

Примечание: это работает в моей системе Ubuntu 10.04 / Gnome 2.30.2, я думаю, что это применимо ко всем Gnome, но я не уверен.

18
06.06.2018, 04:56
4 ответа

Usar un caseestá muy bien si tienes un conjunto fijo de mascotas con las que quieres emparejar. Pero no funcionará si necesita construir el patrón en tiempo de ejecución, ya que caseno interpreta la alternancia desde los parámetros expandidos.

Esto coincidirá solo con la cadena literalcat|dog|mouse:

patt='cat|dog|mouse'
case $1 in 
        $patt) echo "$1 matches the case" ;; 
esac

Sin embargo, puede utilizar una variable con la coincidencia de expresión regular. Siempre que la variable no esté entre comillas, cualquier operador de expresiones regulares dentro de ella tiene sus significados especiales.

patt='cat|dog|mouse'
if [[ "$1" =~ ^($patt)$ ]]; then
        echo "$1 matches the pattern"
fi

También puede utilizar matrices asociativas. Comprobar si existe una clave en uno es lo más parecido a un operador inque ofrece Bash. Aunque la sintaxis es un poco fea:

declare -A arr
arr[cat]=1
arr[dog]=1
arr[mouse]=1

if [ "${arr[$1]+x}" ]; then
        echo "$1 is in the array"
fi

(${arr[$1]+x}se expande a xsi arr[$1]está configurado, vacío de lo contrario.)

8
27.01.2020, 19:45

grep enfoque.

if echo $1 | grep -qE "^(cat|dog|mouse)$"; then 
    echo "dollar 1 is either a cat or a dog or a mouse"
fi
  • -qpara evitar cualquier salida a la pantalla (más rápida de escribir que>/dev/null).
  • -Epara expresiones regulares extendidas (cat|dog|mouse)aspectos necesita esto.
  • ^(cat|dog|mouse)$coincide con cualquier línea que comience(^)con gato, perro o ratón((cat|dog|mouse))seguido del final de la línea($)
4
27.01.2020, 19:45

No hay una prueba "in" en bash, pero hay una prueba de expresiones regulares (no en bourne):

if [[ $1 =~ ^(cat|dog|mouse)$ ]]; then
    echo "dollar 1 is either a cat or a dog or a mouse"
fi

Y generalmente escrito usando una variable (menos problemas con las comillas):

regex='^(cat|dog|mouse)$'

if [[ $1 =~ $regex ]]; then
    echo "dollar 1 is either a cat or a dog or a mouse"
fi

Para un shell Bourne más antiguo, debe usar una coincidencia de mayúsculas y minúsculas:

case $1 in
    cat|dog|mouse)   echo "dollar 1 is either a cat or a dog or a mouse";;
esac
11
27.01.2020, 19:45

Вы могли бы использовать оператор caseв тесте if, но код выглядел бы немного неуклюжим:

if case "$1" in (cat|dog|mouse) true ;; (*) false; esac; then
    printf '"%s" is one of cat, dog or mouse\n' "$1"
else
    printf '"%s" is unknown\n' "$1"
fi

или чуть короче,

if ! case "$1" in (cat|dog|mouse) false; esac; then
    printf '"%s" is one of cat, dog or mouse\n' "$1"
else
    printf '"%s" is unknown\n' "$1"
fi

Предложение caseиспользуется только для сопоставления с образцом для предложения if. Он вводит ненужный тест на истинность/ложь.

Лучше просто использоватьcase:

case "$1" in
    cat|dog|mouse)
        printf '"%s" is one of cat, dog or mouse\n' "$1"
        ;;
    *)
        printf '"%s" is unknown\n' "$1"
esac

Не делай этого:

is_one_of () {
    eval "case $1 in ($2) return 0; esac"
    return 1
}

if is_one_of "$1" 'cat|dog|mouse'; then
    printf '"%s" is one of cat, dog or mouse\n' "$1"
else
    printf '"%s" is unknown\n' "$1"
fi

или это:

is_one_of () (
    word=$1
    shift
    IFS='|'
    eval "case $word in ($*) return 0; esac"
    return 1
)

if is_one_of "$1" cat dog mouse; then
    printf '"%s" is one of cat, dog or mouse\n' "$1"
else
    printf '"%s" is unknown\n' "$1"
fi

... потому что вы просто добавляете еще больше опасного хлама, просто чтобы иметь возможность использовать оператор ifв своем коде вместо вполне разумного оператора case.

5
27.01.2020, 19:45

Теги

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