Thật kỳ lạ, trong nhiều vỏ getoptslà một ứng cử viên rất có thể cho một công việc như thế này. Điều này thoạt nghe có vẻ trái ngược, nhưng nếu bạn cho rằng getopts'chức năng chính là nhận ra và đưa ra để giải thích như nhiều tùy chọn dòng lệnh được chỉ định như có thể được tìm thấy trong một chuỗi nối liền nhau, thì nó có thể bắt đầu tạo ra một chút Ý nghĩa hơn.
Để chứng minh, từ một bashvỏ:
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'
Theo cách đó, đôi khi có thể thuận tiện để cho phép getoptsxử lý việc tháo gỡ như một loại tự động điều khiển vỏ cho các trường hợp như thế này. Khi bạn làm như vậy, bạn chỉ có thể sàng lọc các byte không mong muốn casehoặc [kiểm tra ]và xây dựng chuỗi sao lưu của bạn từ 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'
Với trường hợp ví dụ đơn giản này - và được cung cấp một vỏ hỗ trợ các mở rộng tham số đã được đề cập ở nơi khác - các mở rộng cho biết có thể sẽ phục vụ bạn tốt hơn ở đây. Nhưng tôi nghĩ getoptscó lẽ cũng đáng được đề cập trong trường hợp bạn không nhận thức được khả năng của nó trong khía cạnh này. Chắc chắn khi tôi biết về nó, tôi đã tìm thấy nhiều ứng dụng hữu ích cho nó.
printf '%q\n' "$string"được một phiên bản thoát của bất kỳ chuỗi nào. Ví dụ:printf '%q\n' 'foo\n'->foo\\n;printf '%q\n' $'foo\n'->$'foo\n'