将字符串附加到bash数组中的元素,但如果数组为空则不会

时间:2014-05-08 14:52:12

标签: bash

我想在bash中为数组中的每个元素附加一个字符串,但如果数组为空则不是。

目前这适用于非空数组:

$ cat this.sh
#!/bin/bash
lst=$@
lst[0]="a"
lst[1]="b"
echo ${lst[@]/%/.ext}
$ bash this.sh
a.ext b.ext

但它没有一个空数组:

$cat that.sh 
#!/bin/bash
lst=$@
echo ${lst[@]/%/.ext}
$ bash that.sh 
.ext

所以这失败了,因为我希望字符串为空,如果数组为空。

限制:在这种特殊情况下,我不能使用if语句或循环结构。

2 个答案:

答案 0 :(得分:2)

在第二种情况下,lst不是一个空数组:它只是一个空字符串。使用

确保lst是一个数组
ls=( "$@" )

在第一种情况下,lst是一个数组,因为您通过使用以下索引分配覆盖它来忽略对lst的初始分配。

答案 1 :(得分:2)

您的OP存在轻微的误解。在第二个示例中,lst 不是一个空数组。检查一下:在脚本末尾添加行declare -p lst(与declare选项一起使用的-p内置将打印出有关给定变量的信息):

#!/bin/bash
lst=$@
declare -p lst

然后运行你的脚本:

$ ./myscript
declare -- lst=""

因此,对于Bash,您的lst只是一个空字符串(但它已设置)。看一下空数组是什么:

$ a=()
$ declare -p a
declare -a a='()'

看看如果我运行你的echo命令会发生什么:

$ echo ${a[@]/%/.ext}

$
你看到了吗?它真的很空!

我想说,当我在没有引号的情况下写echo ${a[@]/%/.ext}时,这真的让我很伤心!正确的方法是:

$ echo "${a[@]/%/.ext}"

$

(仍然是空的,呃)。

现在你的意思是:

#!/bin/bash
lst=( "$@" )
echo "${lst[@]/%/.ext}"

我调用了这个脚本banana,我chmod +x banana,我玩了它:

$ ./banana

$ ./banana one two
one.ext two.ext
$ ./banana "one one" two
one one.ext two.ext
$ ./banana one ""
one.ext .ext