当我处理shell脚本时,我对$ @和" $ @"感到很沮丧。问题。所以,我编写了一个shell脚本来做一些测试。喜欢以下
func()
{
local a="$@"
for i in "$a"; do
echo "$i ****"
done
}
func000()
{
local a="$@"
for i in $a; do
echo "$i ****"
done
}
func0()
{
local a=$@
for i in "$a"; do
echo "$i ****"
done
}
func00()
{
local a=$@
for i in $a; do
echo "$i ****"
done
}
func1()
{
for i in "$@"; do
echo "$i ****"
done
}
func2()
{
for i in $@; do
echo "$i ****"
done
}
func "a b c"
func a b c
echo "-----------"
func0 "a b c"
func0 a b c
echo "-----------"
func00 "a b c"
func00 a b c
echo "-----------"
func000 "a b c"
func000 a b c
echo "-----------"
func1 "a b c"
func1 a b c
echo "-----------"
func2 "a b c"
func2 a b c
a b c ****
a b c **** func
-----------
a b c **** func0
a b c ****
-----------
a **** func00
b ****
c ****
a ****
b ****
c ****
------------
a **** func000
b ****
c ****
a ****
b ****
c ****
-----------
a b c **** func1 //this has the result that I want.
a ****
b ****
c ****
-----------
a **** func2
b ****
c ****
a ****
b ****
c ****
据我记得,当使用$ @时,我们必须使用双重quoate,否则会出现问题。因此,我知道一些功能肯定不能正常工作。 (无论如何我仍在测试)
只有func1给了我一个渴望的结果,但是,我想要分配" $ @"变量。通过查看func0,func000,func0,func00结果,这些都没有给我正确的东西。所以,我希望有人可以帮助我。
另外,我知道sh和bash有区别。如果有人能指出我哪些情况会破坏我会很高兴。感谢。
更新
我应该说,这个脚本的结果,它来到bash或sh的版本,或者freebsd sh vs linux sh。
我可能错了,如果是这样,请指出来,非常感谢。
在旧的sh,freebsd sh,其中我们没有数组,显然,数组赋值无法正常工作,另一种方法是使用字符串,就像我在func000中所做的那样,本地a =" $ a&# 34 ;;因为我在$ a;做......
如果使用linux sh 4.5(已测试)或bash,请参阅下面的答案。
答案 0 :(得分:5)
更新,感谢@jordanm,我意识到这是bash和老sh版本之间的区别。
这是bash或sh 4.2中的解决方案。在老sh,这可能不起作用。
33 func3()
34 {
35 local a=("${@}")
36
37 for i in "${a[@]}"; do
38 echo "$i ****"
39 done
40 }
答案 1 :(得分:0)
虽然我不是他,但我第一次听说以这种方式保存"${@}"
是因为 Rich's sh tricks 随机发生的事情。 Rich提供了许多同样有用且最重要的便携式安全方法来解决他网站上的许多常见问题,但这里有一个摘录来解决您当前的问题:
使用数组
与Bash之类的“增强型”Bourne shell不同,POSIX shell没有数组类型。但是,由于效率低下,您可以使用纯POSIX sh在紧要关头获得类似数组的语义。诀窍是你有一个(也是唯一一个)数组 - 位置参数“$1”
,“$2”
等等 - 你可以在这个数组之间交换内容。
更换“$@”
数组的内容非常简单:
set -- foo bar baz boo
或者,或许更有用:
set -- *
目前尚不清楚如何保存“$@”
的当前内容,以便在更换后可以将其取回,以及如何以编程方式生成这些“数组”。根据之前的引用尝试此功能:
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
用法类似于:
myarray=$(save "$@")
set -- foo bar baz boo
eval "set -- $myarray"
答案 2 :(得分:-2)
如果你想把所有内容都保留在引号中,你可以试试这个:
test() {
local args="$@"
for i in `echo "$args"`; do
echo "$i ****"
done
}
test 1 2 3 4
输出:
~ $ ./test.sh
1 ****
2 ****
3 ****
4 ****