我显然明白可以为内部字段分隔符变量添加值。例如:
$ IFS=blah
$ echo "$IFS"
blah
$
Run Code Online (Sandbox Code Playgroud)
我也明白这read -r line
会将数据保存stdin
到名为的变量line
:
$ read -r line <<< blah
$ echo "$line"
blah
$
Run Code Online (Sandbox Code Playgroud)
但是,命令如何分配变量值?它是否首先存储来自stdin
to 变量的数据line
,然后赋予line
to 的值IFS
?
我知道可以"$@"
使用数组进行反转:
arr=( "$@" )
Run Code Online (Sandbox Code Playgroud)
并使用此答案,反转数组。
但这需要一个具有数组的外壳。
也可以使用tac
:
set -- $( printf '%s\n' "$@" | tac )
Run Code Online (Sandbox Code Playgroud)
但是,断裂,如果参数有空格,制表符或换行符(假设的缺省值$IFS
),或者包含通配符(除非通配符被禁用预先)并移除空元素,并需要GNUtac
命令(使用tail -r
是GNU系统的稍微更便携式外但某些实现在大输入时失败)。
有没有一种方法可以在不使用数组的情况下可移植地反转 shell 位置参数,即使参数包含空格、换行符或通配符或可能为空也能正常工作?