bash:for 循环与位置参数( $*$@)
Posted 夜游神
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bash:for 循环与位置参数( $*$@)相关的知识,希望对你有一定的参考价值。
word splitting(分词)
如果没有在双引号中,变量在进行参数扩展、命令替换和算术扩展之后,shell 会对变量进行分词,比如:
$ echo a b c d
a b c d
shell 将 $IFS
的每个字符作为分隔符,如果 $IFS
是 unset 的,则有默认值 <space><tab><newline>
。
分词的时候,首先忽略变量首位的空白符 <space><tab><newline>
,再分隔得到单词。
判断 $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 done echo \'==$@==\' for name in $@ do echo $name done $ ./test a s d fff ==$*== a s d fff ==$@== a s d fff
- 在双引号中:
$*
会先分词,再以 $IFS
的第一个字符为分隔符,合并成一个字符串; "$*"
相当于 "$1c$2c…"
,c
表示 $IFS
的第一个字符。
$@
也会分词,但不会合并成一个字符串;"$@"
相当于 "$1" "$2"…
,跟不加双引号其甩出是一样的。
// 文件test
#!/usr/bin/bash
echo \'==$*==\'
for name in "$*"
do
echo $name
done
echo \'==$@==\'
for name in "$@"
do
echo $name
done
$ ./test a s d fff
==$*==
a s d fff
==$@==
a
s
d
fff
参考
- Bash Reference Manual:https://www.gnu.org/software/...
以上是关于bash:for 循环与位置参数( $*$@)的主要内容,如果未能解决你的问题,请参考以下文章
[Linux Shell学习系列七]Bash循环——1for循环
Linux基础之bash脚本进阶篇-循环语句(for,while,until)及其特殊用法
Linux mysql shell脚本 变量和环境变量 位置参数 预定义变量 运算符 判断 流程控制 for循环 与用户交互 函数