Anehnya, dalam banyak cangkang getopts
adalah kandidat yang sangat mungkin untuk pekerjaan seperti ini. Ini mungkin tampak berlawanan dengan intuisi pada awalnya, tetapi jika Anda menganggap bahwa getopts
'fungsi utama adalah untuk mengenali dan menawarkan untuk penafsiran sebanyak opsi opsi baris perintah karakter tunggal yang ditentukan seperti yang dapat ditemukan dalam serangkaian yang sama, mungkin mulai membuat sedikit lebih masuk akal.
Untuk menunjukkan, dari bash
shell:
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'
Dengan cara itu kadang-kadang bisa lebih mudah untuk memungkinkan getopts
menangani pembongkaran sebagai semacam pilot otomatis shell untuk kasus-kasus seperti ini. Ketika Anda melakukannya, Anda bisa menyaring byte yang tidak diinginkan dengan case
atau [
menguji ]
dan membangun kembali string Anda dari byte 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'
Dengan contoh kasus sederhana ini - dan diberi shell yang mendukung ekspansi parameter yang telah disebutkan di tempat lain - mengatakan ekspansi mungkin akan melayani Anda lebih baik di sini. Tapi saya pikir getopts
mungkin layak disebut juga jika Anda tidak menyadari kemampuannya dalam hal ini. Tentu saja ketika saya mengetahuinya, saya menemukan banyak aplikasi yang berguna untuk itu.
printf '%q\n' "$string"
mendapatkan versi apa pun dari string apa pun. Misalnya:printf '%q\n' 'foo\n'
->foo\\n
;printf '%q\n' $'foo\n'
->$'foo\n'