Существуют команды false
и true
, которые удобны для выражения логических значений в оболочках. Для многословности общепринятым подходом является использование уровня журнала, при котором каждое вхождение -v
увеличивает уровень журнала, а -q
уменьшает его.
interactive=false
log_level=1
log() {
local level="$1"
if [ "$level" -ge "$log_level" ]; then
shift
local IFS=" "
printf '%s\n' "$*"
fi
}
while getopts iqv option; do
case $option in
i)
log 2 "interactive mode set"
interactive=true;;
v)
log 2 "increasing log level"
log_level=$((log_level + 1));;
q)
log 2 "decreasing log level"
log_level=$((log_level - 1));;
*)
exit 1 ;;
esac
done
shift "$((OPTIND - 1))"
log 2 'This is a verbose message'
log 3 'This is a debug message'
if "$interactive"; then
# interactive code
fi
# or:
ask() { # args: var default question
if "$interactive"; then
printf %s "$3"
IFS= read -r "$1"
else
eval "$1=\$2"
fi
}
yesno() { # args: default question
local answer="$1"
ask answer "$1" "$2"
case $answer in
([yY][eE][sS] | y | Y) return 0;;
([nN][oO] | n | N) return 1;;
(*) case $1 in
([yY][eE][sS] | y | Y) return 0;;
([nN][oO] | n | N) return 1;;
(*) log >&2 -1 "Wrong default value $default"; exit 1;;
esac;;
esac
}
if yesno no "Are you OK with that (yes/[no])? "; then
log 1 OK do it
...
fi
Приведенный выше код (непроверенный )соответствует политике Debian -, поэтому будет работать с Debian sh
, независимо от того, настроен ли он как dash
, lksh
или bash
(, также будет POSIX, если нет дляlocal
).
При условии, что я понял, чего вы пытаетесь достичь, это могло быть (частично )ответом здесь:
Возможно, вы сможете делать то, что хотите, в зависимости от вашего оборудования + программного обеспечения + того, насколько вы готовы взломать и то, и другое.
Вам потребуется хост-адаптер USB RasPi не только для работы в режиме устройства (, что можно выполнить, в соответствии с этим вопросом на RaspberryPi.SE , но и оба в режиме устройства (для автомобильной стереосистемы)и в режиме хост-адаптера (для фактического USB-накопителя)одновременно . Я не уверен, что аппаратное обеспечение может это сделать