问一个shell编程的问题:如何正确地对$@进行赋值?

假设有一个test脚本

for var in "$@";do
    echo $var
done

那么执行 test 1 "2 3"可以正确地得到结果:

1
2 3

然而,如果我把shell改成

commands=$@
for var in "$commands";do
    echo $var
done

得到的结果是

1 
2
3

如果我把shell改成

commands="$@"
for var in "$commands";do
    echo $var
done

得到的结果是

1 2 3

把commands设置成数组:

commands=($@)
for var in ${commands[*]};do
    echo $var
done

得到的结果还是

1 
2
3

现在的问题是,要怎么做才能让遍历$commands的效果跟$@一样呢?

commands=("$@")
echo ${commands[1]}

没遍历这个

说起来,处理字符串的时候经常要为一个双引号该打几根斜杠陷入深深的思考中

应该不好处理, $@ 比较特殊,跟一般的 $VAR 都不一样。可以试试把 $@ 转换成 Bash 特有的数组,之后再遍历数组。

#!/bin/bash

declare -a args=("$@")

for i in "${args[@]}"; do
    echo $i
done
~$ ./foo.sh 1 '2 3' 4
1
2 3
4