bash(for 循环与位置参数( $*、$@))
word splitting(分词)
如果没有在双引号中,变量在进行参数扩展、命令替换和算术扩展之后,shell 会对变量进行分词,比如:
$ echo abcd
a b c d
shell 将
$IFS
的每个字符作为分隔符,如果 $IFS
是 unset 的,则有默认值
。分词的时候,首先忽略变量首位的空白符
,再分隔得到单词。判断
$IFS
是否 unset 的方法。// 文件test
#!/usr/bin/bash
if [ -v IFS ];
then
echo ==\$IFS=$IFS==
else
echo ==\$IFS is unset==
fi$ ./test
==$IFS= ==
for 循环中的 $* 与 $@
$*
与 $@
都能表示所有的位置参数。- 未在双引号中:二者用法一致,都会进行分词。
// 文件test #!/usr/bin/bash echo '==$*==' for name in $* do echo $name doneecho '==$@==' for name in $@ do echo $name done$ ./test asd fff ==$*== a s d fff ==$@== a s d fff
- 在双引号中:
$*
会先分词,再以 $IFS
的第一个字符为分隔符,合并成一个字符串;
"$*"
相当于 "$1c$2c…"
,c
表示 $IFS
的第一个字符。【bash(for 循环与位置参数( $*、$@))】
$@
也会分词,但不会合并成一个字符串;"$@"
相当于 "$1" "$2"…
,跟不加双引号其甩出是一样的。// 文件test
#!/usr/bin/bash
echo '==$*=='
for name in "$*"
do
echo $name
doneecho '==$@=='
for name in "$@"
do
echo $name
done$ ./test asd fff
==$*==
a s d fff
==$@==
a
s
d
fff
参考
- Bash Reference Manual:https://www.gnu.org/software/...
推荐阅读
- Shell-Bash变量与运算符
- whlie循环和for循环的应用
- ffmpeg源码分析01(结构体)
- 能力和自信的良性循环
- 【WORKFOR】最真的自己
- R|R for data Science(六)(readr 进行数据导入)
- performSelectorOnMainThread:withObject:waitUntilDone:参数设置为NO或YES的区别
- 误删/清空.bashrc文件/内容
- JavaScript|JavaScript — 初识数组、数组字面量和方法、forEach、数组的遍历
- 时间管理的任务模型