49

我正在尝试在 Shell 脚本中声明一个空数组,但遇到错误。

#!/bin/bash

list=$@

newlist=()

for l in $list; do

        newlist+=($l)

done

echo "new"
echo $newlist

当我执行它时,我得到test.sh: 5: test.sh: Syntax error: "(" unexpected

4

5 回答 5

27

用 bash 运行它:

bash test.sh

看到错误,您似乎实际上是在用破折号运行它:

> dash test.sh
test.sh: 5: test.sh: Syntax error: "(" unexpected

只有这一次您可能使用了它的链接(/bin/sh -> /bin/dash)。

于 2013-09-20T16:22:39.553 回答
20

我发现以下语法更具可读性。

declare -a <name of array>

有关更多详细信息,请参阅Bash 初学者指南:10.2。数组变量

于 2016-12-12T19:25:19.470 回答
20

在 BASH 4+ 中,您可以使用以下内容声明一个空数组:

declare -a ARRAY_NAME=()

然后,您可以通过以下方式附加新项目 NEW_ITEM1 和 NEW_ITEM2:

ARRAY_NAME+=(NEW_ITEM1)
ARRAY_NAME+=(NEW_ITEM2)

请注意,添加新项目时需要括号 ()。这是必需的,以便将新项目作为 Array 元素附加。如果您确实错过了 (),NEW_ITEM2 将成为附加到第一个数组元素 ARRAY_NAME[0] 的字符串。

上面的示例将导致:

echo ${ARRAY_NAME[@]}
NEW_ITEM1 NEW_ITEM2

echo ${ARRAY_NAME[0]}
NEW_ITEM1

echo ${ARRAY_NAME[1]}
NEW_ITEM2

接下来,如果您执行了(注意缺少的括号):

ARRAY_NAME+=NEW_ITEM3

这将导致:

echo ${ARRAY_NAME[@]}
NEW_ITEM1NEW_ITEM3 NEW_ITEM2

echo ${ARRAY_NAME[0]}
NEW_ITEM1NEW_ITEM3

echo ${ARRAY_NAME[1]}
NEW_ITEM2

感谢@LenW 纠正我的附加操作。

于 2018-10-27T02:01:49.803 回答
4

试试这个,看看你是否倾向于 dash 或 bash

ls -al /bin/sh

如果它说/bin/sh -> /bin/dash,然后输入:

sudo rm /bin/sh
sudo ln -s /bin/bash /bin/sh

然后再次输入:

ls -al /bin/sh*

然后必须说这样的话:

/bin/sh -> /bin/bash

这意味着现在sh正确地面向 Bash 并且您的数组将工作。

于 2015-09-08T01:37:01.210 回答
-4

如果数组为空,请执行以下操作:

NEWLIST=

您可以通过以下方式进行检查:

if [ $NEWLIST ] ; then
   # do something
fi

非空数组声明如下所示:

NEWLIST=('1' '2' '3')

在过程中填充数组:

ARRAY=("$(find . -name '*.mp3')")

希望这可以帮助

于 2013-09-20T16:32:25.520 回答