位置参数数组$ @的只读变量

时间:2016-12-01 03:23:06

标签: bash shell arguments parameter-passing

Bash有一个特殊变量$@,它将发送到脚本或函数的所有参数存储到数组中。如何将此变量的值存储到只读数组中?

说我有一个脚本/home/jason/bourne

#!/bin/bash

declare -ar Args="$@";

运行它会抛出此错误:

$ /home/jason/bourne --help memory;
/home/jason/bourne: line 3: Args: readonly variable

这是一个语法错误还是在bash中不可能?

写这篇文章的中途我找到了解决方案。我认为这是一个有用的问题,所以我会给它一个答案。

1 个答案:

答案 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;