Цікаво, що в багатьох оболонках getopts
дуже вірогідний кандидат на таку роботу. Спочатку це може здатися протиінтуїтивним, але якщо ви вважаєте, що getopts
"основна функція полягає в тому, щоб розпізнати та запропонувати для інтерпретації стільки заданих параметрів командного рядка одного символу, які можуть бути знайдені в одній і тій же зв'язаній серії, це може почати робити мало більше сенсу.
Для демонстрації з bash
оболонки:
x=$(printf '\n\r%010s\t' hello)
OPTIND=1
while getopts : na "-$x"
do printf %q\\n "$OPTARG"
done
$'\n'
$'\r'
\
\
\
\
\
h
e
l
l
o
$'\t'
Таким чином іноді може бути зручно дозволити getopts
обробляти розбирання як своєрідний автопілот оболонки для подібних випадків. Коли ви це зробите, ви можете просто екранувати непотрібні байти w / a case
або [
протестувати ]
і створити резервну копію рядка з байту 1:
OPTIND=1 y=$(printf \\n\\r) z=
while getopts : na "-$x"
do case $OPTARG in ([!$y])
z=$z$OPTARG
esac
done
printf %q\\n "$z"
$' hello\t'
З огляду на цей простий приклад випадку - і надавши оболонку, яка підтримує розширення параметрів, що вже були згадані в іншому місці, - зазначені розширення, ймовірно, будуть служити вам тут краще. Але я подумав, getopts
що варто також згадати, якщо ви не знали про його можливості в цьому відношенні. Звичайно, коли я дізнався про це, я все-таки знайшов для нього багато корисних додатків.
printf '%q\n' "$string"
отримати уникнуту версію будь-якого рядка. Наприклад:printf '%q\n' 'foo\n'
->foo\\n
;printf '%q\n' $'foo\n'
->$'foo\n'