我想在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语句或循环结构。
答案 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