Oz1*_*123 298 bash command-line-arguments
在许多SO问题和bash教程中,我看到我可以通过两种方式访问bash脚本中的命令行参数:
$ ~ >cat testargs.sh
#!/bin/bash
echo "you passed me" $*
echo "you passed me" $@
Run Code Online (Sandbox Code Playgroud)
结果如下:
$ ~> bash testargs.sh arg1 arg2
you passed me arg1 arg2
you passed me arg1 arg2
Run Code Online (Sandbox Code Playgroud)
$*
和之间有什么区别$@
?
应该何时使用前者,何时使用后者?
gle*_*man 395
引用特殊参数时会出现差异.让我说明一下差异:
$ set -- "arg 1" "arg 2" "arg 3"
$ for word in $*; do echo "$word"; done
arg
1
arg
2
arg
3
$ for word in $@; do echo "$word"; done
arg
1
arg
2
arg
3
$ for word in "$*"; do echo "$word"; done
arg 1 arg 2 arg 3
$ for word in "$@"; do echo "$word"; done
arg 1
arg 2
arg 3
Run Code Online (Sandbox Code Playgroud)
关于引用重要性的另一个例子:注意"arg"和数字之间有2个空格,但如果我没有引用$ word:
$ for word in "$@"; do echo $word; done
arg 1
arg 2
arg 3
Run Code Online (Sandbox Code Playgroud)
在bash中,"$@"
是迭代的"默认"列表:
$ for word; do echo "$word"; done
arg 1
arg 2
arg 3
Run Code Online (Sandbox Code Playgroud)
Ser*_*ndt 225
来自Bash Hackers Wiki的一个非常方便的概述表:
其中c
第三行中是的第一个字符$IFS
,内部字段分隔符; 环境变量.
如果参数要存储在脚本变量中并且参数应该包含空格,我全心全意地建议使用一个"$*"
技巧,将内部字段分隔符$IFS
设置为tab.
Muf*_*ffo 43
$*
从1开始扩展到位置参数.当扩展发生在双引号内时,它会扩展为单个单词,每个参数的值由IFS特殊变量的第一个字符分隔.也就是说,"$*"相当于"$ 1c $ 2c ...",其中c是IFS变量值的第一个字符.如果未设置IFS,则参数由空格分隔.如果IFS为null,则连接参数时不会插入分隔符.
$ @
从1开始扩展到位置参数.当扩展发生在双引号内时,每个参数都会扩展为单独的单词.也就是说,"$ @"相当于"$ 1""$ 2"...如果双引号扩展发生在一个单词中,则第一个参数的扩展与原始单词的开头部分连接,并且扩展最后一个参数与原始单词的最后一部分连接在一起.当没有位置参数时,"$ @"和$ @扩展为空(即,它们被删除).
资料来源:Bash man
rko*_*egi 15
$ @与$*相同,但每个参数都是带引号的字符串,也就是说,参数是完整传递的,没有解释或扩展.这意味着,参数列表中的每个参数都被视为一个单独的单词.
当然,应该引用"$ @".
http://tldp.org/LDP/abs/html/internalvariables.html#ARGLIST