Bash有一个特殊变量$@
,它将发送到脚本或函数的所有参数存储到数组中。如何将此变量的值存储到只读数组中?
说我有一个脚本/home/jason/bourne
:
#!/bin/bash
declare -ar Args="$@";
运行它会抛出此错误:
$ /home/jason/bourne --help memory;
/home/jason/bourne: line 3: Args: readonly variable
这是一个语法错误还是在bash中不可能?
写这篇文章的中途我找到了解决方案。我认为这是一个有用的问题,所以我会给它一个答案。
答案 0 :(得分:2)
要将"$@"
变量存储为数组,您需要像使用文字数组一样用()
包装它。
#!/bin/bash
declare -ar Args=("$@");
for arg in "${Args[@]}"; do
echo "${arg}";
done;
示例输出:
$ /home/jason/bourne --help memory "quoted phrase";
--help
memory
quoted phrase
注意: $@
应始终包裹""
。 (这可能是此规则的一个例外,但至少应该遵循99.9%的时间。)在这种情况下,请使用("$@")
而不是{{1} }。
要在bash中从头开始创建文字数组,您可以这样做:
($@)
declare -ar array=("a" "b" "c d");
变量扩展为字符串列表,每个字符串都用引号括起来。使用"$@"
包装此列表会将其转换为bash数组。
()
例如,如果declare -ar array=("$@");
扩展为"$@"
,则"a" "b" "c d"
将变为("$@")
。
("a" "b" "c d")
这是一个并排的代码示例。
将"$@" == "a" "b" "c d"
("$@") == ("a" "b" "c d")
脚本设置为:
/home/jason/bourne
将输出:
#!/bin/bash
declare -ar array=("$@");
for val in "${array[@]}"; do
echo "${val}";
done;
将$ /home/jason/bourne "a" "b" "c d";
a
b
c d
脚本设置为:
/home/jason/bourne
将输出相同的内容:
#!/bin/bash
declare -ar array=("a" "b" "c d");
for val in "${array[@]}"; do
echo "${val}";
done;