Существует специальный синтаксис для этого:
for i do
printf '%s\n' "$i"
done
В более общем плане список параметров текущего сценария или функции доступен через специальную переменную $@
.
for i in "$@"; do
printf '%s\n' "$i"
done
Обратите внимание необходимость в двойных кавычках вокруг $@
, иначе параметры подвергаются подстановочному расширению и полевому разделению. "$@"
является волшебным: несмотря на двойные кавычки, это расширяется в столько же полей, сколько существуют параметры.
print_arguments () {
for i in "$@"; do printf '%s\n' "$i"; done
}
print_arguments 'hello world' '*' 'special !\characters' '-n' # prints 4 lines
print_arguments '' # prints one empty line
print_arguments # prints nothing
] Попробуйте настроить вывод []showkey[
] на небуферизацию командой [][]stdbuf[
][] :[
stdbuf -o0 showkey -a | cat -
]
[]Покажет вывод как нажаты клавиши, а не как буферизация строки. [
] [][]stdbuf[
] может настроить буферизацию []stdin[
], []stdout[
] и [] stderr[
], установив их на []none[], []буферизованную строку[], или []буферизованный блок[], при этом размер блока может быть выбран. Очень удобно. [
Он буферизирует, потому что ваш терминал настроен на линейно-ориентированную линейно-дисциплину. Вам нужно stty raw
. Попробуйте следующее:
state=$(stty -g)
key=$( (stty raw ; dd bs=1 count=1; stty $state) </dev/tty 2>/dev/null)
Но это будет работать только для однобайтовых клавиш. Может быть хорошей идеей сначала сделать LC_ALL=C
, если есть вероятность, что вход может содержать многобайтовые кепрессы. Более сложный пример может выглядеть следующим образом:
{ exit=$(printf '\003')
tty_state=$(stty -g)
stty raw istrip
while key=$(
dd bs=1 count=1
) ; do : "${key:=
}"; printf " %03o %03d %#x\n\r" \
"'$key" "'$key" "'$key"
[ -z "${key#"$exit"}" ] && {
stty "$tty_state"
break
}
done 2>/dev/null
} </dev/tty