Shell脚本:声明空数组的正确方法

lui*_*fzs 27 arrays bash shell

我试图在Shell脚本中声明一个空数组,但我遇到了错误.

#!/bin/bash

list=$@

newlist=()

for l in $list; do

        newlist+=($l)

done

echo "new"
echo $newlist
Run Code Online (Sandbox Code Playgroud)

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

TMT*_*TMT 17

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

declare -a ARRAY_NAME=()
Run Code Online (Sandbox Code Playgroud)

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

ARRAY_NAME+=(NEW_ITEM1)
ARRAY_NAME+=(NEW_ITEM2)
Run Code Online (Sandbox Code Playgroud)

请注意,添加新项目时需要括号 ()。这是必需的,以便将新项目作为 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
Run Code Online (Sandbox Code Playgroud)

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

ARRAY_NAME+=NEW_ITEM3
Run Code Online (Sandbox Code Playgroud)

这将导致:

echo ${ARRAY_NAME[@]}
NEW_ITEM1NEW_ITEM3 NEW_ITEM2

echo ${ARRAY_NAME[0]}
NEW_ITEM1NEW_ITEM3

echo ${ARRAY_NAME[1]}
NEW_ITEM2
Run Code Online (Sandbox Code Playgroud)

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


kon*_*box 14

用bash运行它:

bash test.sh
Run Code Online (Sandbox Code Playgroud)

看到错误,似乎你真的用破折号运行它:

> dash test.sh
test.sh: 5: test.sh: Syntax error: "(" unexpected
Run Code Online (Sandbox Code Playgroud)

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

  • `#!` 仅当您将其作为命令运行时才有效 - 通过使文件可执行(`chmod +x test.sh`),然后只需键入文件名,前面不带任何类型的 *sh:`./测试.sh`。如果您显式键入 shell 的名称(如“sh”或“bash”)作为要运行的命令,那么这就是要运行的命令;对于 shell 来说,‘#!’行只是一个注释。 (2认同)

sha*_*ooo 8

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

declare -a <name of array>
Run Code Online (Sandbox Code Playgroud)

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