如何在Shell脚本中操作数组

6
我希望我的脚本能够定义一个空数组。如果预定义的条件成立,应该添加数组值。为此,我所做的是:
declare -a FILES
file_count=0
if [ "$file_ext" != "$SUPPORTED_FILE_TYPE" ] ; then
        echo "$file_ext is not supported for this task."
else
        $FILES[$file_count] = $filename
        file_count=$file_count+1
fi

执行此脚本时,我遇到了一些错误,类似于这样:
linux-softwares/launchers/join_files.sh: 51: [0]: not found

有关Bash数组的更多阅读,请查看http://tldp.org/LDP/abs/html/arrays.html。 - Enrico Carlesso
3个回答

3

当使用数组设置数据时,不要忘记加 $ 符号:

declare -a FILES
file_count=0
if [ "$file_ext" != "$SUPPORTED_FILE_TYPE" ] ; then
        echo "$file_ext is not supported for this task."
else
        FILES[$file_count]=$filename
        file_count=$file_count+1
fi

没有$符号的文件。


这对我有效:

#!/bin/bash
declare -a FILES
file_count=0

file_ext='jpg'
SUPPORTED_FILE_TYPE='jpg'
filename='test.jpg'

if [ "$file_ext" != "$SUPPORTED_FILE_TYPE" ] ; then
        echo "$file_ext is not supported for this task."
else
        FILES[$file_count]=$filename
        file_count=$(($file_count+1))
fi

正如您所看到的,对于数学运算只需要进行一点修改 $(( )),但FILES赋值是相同的...


经过多次测试发现,Ubuntu默认使用的shell似乎是dash,这导致了错误。


1
还记得你几分钟前的问题吗?空格会导致错误 :) 只需在 FILES[$file_count] 后面删除空格即可。 - Enrico Carlesso
数组赋值似乎不起作用,"FILES[$file_count]=$filename" 导致错误消息 "files.sh: 61: FILES[0]=/home/vijay/reservoir.txt"。你能告诉我问题出在哪里吗? - vijay.shad
只需编辑 http://pastebin.org/99313 部分,它就可以在我的系统上运行...我没有看到错误提示... - Enrico Carlesso
对我来说不起作用。您是否看到其他原因? 我得到的错误是“linux-softwares/launchers/join_files.sh: 60: FILES[0]=/home/vijay/downloads/Reservoir/Reservoir.avi: not found”。 - vijay.shad
你的文件还是像发布的一样吗?因为 FILES[0] 看起来似乎不在第 60 行上。你发布的版本对我来说可以工作,返回: $ ./99305.download 准备合并 AVI 文件。 请输入文件名 > test.avi 你输入了:test.avi....正在验证文件完整性。 你是否要添加更多文件。请输入 yes 或 no no 准备加入命令 将执行命令 mencoder -oac copy -ovc copy -o joined-output.avi 大小 = 1 将执行命令 mencoder -oac copy -ovc copy -o joined-output.avi 将执行命令 mencoder -oac copy -ovc copy -o joined-output.avi test.avi - Enrico Carlesso
显示剩余12条评论

1
要将元素添加到数组的末尾,请使用 += 运算符(自2004年bash 3.1以来可用):
files+=( "$file" )

0

你也可以这样写

declare -a FILES
file_count=0
if [ "$file_ext" != "$SUPPORTED_FILE_TYPE" ] ; then
        echo "$file_ext is not supported for this task."
else
        FILES[((file_count++))]=$filename
fi

致:Vijay

小型演示,列出目录中的*.txt文件并将它们存入数组FILES

declare -a FILES
i=0
for file in *.txt
do
  FILES[((i++))]=$file 
done
# display the array
for((o=0;o<${#FILES};o++))
do
    echo ${FILES[$o]} $o
done

输出

$ ./shell.sh
A.txt 0
B.txt 1
file1.txt 2
file2.txt 3
file3.txt 4

这个不起作用。错误信息是“files.sh: 39: 语法错误: "(" 意外(期望 ")")”。 - vijay.shad
变量FILES中多了一个"$"符号,请将其删除。 - ghostdog74
我没有收到任何 $,它在哪里? - vijay.shad
我已经修改了它。请查看我的最新编辑。原本是$FILES[((file_count++))]=$filename,这是错误的。 - ghostdog74
看起来我的编辑演示可以使用。此外,你已经接受了恩里科的答案,在他的答案中,他使用了 FILES[$file_count]=$filename,没有使用 "$" 符号。所以我很困惑为什么你还是有问题。 - ghostdog74

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接