Обычная 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, но я не уверен.
Usar un case
está 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 case
no 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 in
que 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 x
si arr[$1]
está configurado, vacío de lo contrario.)
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
-q
para evitar cualquier salida a la pantalla (más rápida de escribir que>/dev/null
). -E
para 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($
)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
Вы могли бы использовать оператор 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
.