Если команда берет список файлов как аргументы и обрабатывает те файлы, как введено (или произведите, но не обычно), каждый из тех файлов может быть именованным каналом или/dev/fd псевдофайлом, обеспеченным прозрачно процессом subsitution:
$ sort -m <(command1) <(command2) <(command3)
Это "передаст вывод по каналу" трех команд к виду, поскольку вид может взять список входных файлов на командной строке.
Используя a case
несколько эквивалентно, но не прекрасен начиная с операторов как YE
приняты.
read -p 'Answer this question with yes: ' answer
case "${answer}" in
[yY]|[yY][eE][sS])
echo 'Surely this can be written better?' ;;
esac
Стандарт UNIX предоставляет пример кода для этого использования locale
утилита:
if printf "%s\n" "$response" | grep -Eq "$(locale yesexpr)"
then
affirmative processing goes here
else
non-affirmative processing goes here
fi
Значение для 'yesexpr' в POSIX
локаль (и на английских локалях в реальных системах) "^[yY]"
. Это должно быть интерпретировано как расширенное регулярное выражение. См. также noexpr.
locale
знает о? Страница справочника на моем поле Mac OS 10.5, кажется, не имеет их.
– dmckee --- ex-moderator kitten
22.05.2011, 23:48
locale -k LC_MESSAGES
(и для другого LC_whatever), или посмотрите здесь для, определенных стандартом. @Daniel, что источник кроме страницы утилиты локали, которую я действительно связывал?
– Random832
23.05.2011, 01:20
Пребывание в ударе (или любая другая оболочка, если Вы отображаете подсказку независимо):
case $answer in
[Yy]*) echo Ok;;
*) echo "Can't you read? I said to say yes.";;
esac
Это принимает ответы как yn
как да, y
(с начальным пространством) как не, и wlkjzuhfod
как не, который не может быть оптимальным, но согласовывается с типичными приглашениями оболочки: это то, как rm -i
, find -ok
и другие делают это.
Это сторонится целой проблемы интернационализации: на других языках необходимо было бы перевести ожидаемые ответы. Затем нет никакого стандартного метода оболочки; можно обратиться к диалоговому окну, но затем сценарий потребует, чтобы это было установлено (это доступно во многих дистрибутивах, но не всегда устанавливаемое по умолчанию).
if dialog --yesno "Choose yes" 0 0; then …
Я обычно использую простую функцию:
Confirm() { read -sn 1 -p "$* [Y/N]? "; [[ ${REPLY:0:1} = [Yy] ]]; }
Функция просто возвращается 0
если Y
или y
вводится и 1
если что-либо еще вводится. Это может использоваться с if...fi
:
if Confirm "Type y or n"; then
echo "You typed y"
else
echo "You typed n"
fi
Или точно так же, как это:
Confirm "Type y" && echo "You typed y"
Просто повторно измененный @faif ответ
YesOrNo() {
while :
do
read -p 'Do you want to Continue (yes/no?): ' answer
case "${answer}" in
[yY]|[yY][eE][sS]) exit 0 ;;
[nN]|[nN][oO]) exit 1 ;;
esac
done
}
if $( YesOrNo ); then
echo "Ans is yes.. Do something....."
else
echo "Ans is No... skip.."
fi
Тест
root@ubuntu:~# bash confirm.sh
Do you want to Continue (yes/no?): # if Blank Enter then ask again
Do you want to Continue (yes/no?):
Do you want to Continue (yes/no?):
Do you want to Continue (yes/no?): no
Ans is No... skip..
root@ubuntu:~# bash confirm.sh
Do you want to Continue (yes/no?):
Do you want to Continue (yes/no?):
Do you want to Continue (yes/no?): ye
Do you want to Continue (yes/no?): yes
Ans is yes.. Do something.....