Thật kỳ lạ, trong nhiều vỏ getopts
là 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 bash
vỏ:
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 getopts
xử 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 case
hoặ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ĩ getopts
có 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'