如何连接 Bash 脚本中列表中的字符串?

如何连接 Bash 脚本中列表中的字符串?

举个例子:

List="A B C D"
for I in $List
do
    OUT=$OUT" -$I"
done

当我运行它时结果是:

" -A -B -C -D"

但希望它是:

"-A -B -C -D"

如何在没有前导空格的情况下进行连接?

顺便说一下,这是脚本的参数列表。

答案1

使用条件参数扩展

List="A B C D"
for I in $List
do
    OUT=${OUT:+$OUT }-$I
done

如果 OUT 未设置或为空,则表达式${OUT:+$OUT }扩展为无;如果将其设置为非空值,则表达式扩展为该值后跟一个空格。

但是,这种操作 - 将空格分隔的字符串视为列表 - 充满了可能的问题:引用、值本身意外包含空格等。最好使用数组:

List=(A B C D)
for I in "${List[@]}"
do    
    OUT=${OUT:+$OUT }-$I
done

根据您要执行的操作$OUT,将其设为数组也可能是有意义的:

List=(A B C D)
OUT=()
for I in "${List[@]}"; do
  OUT+=("-$I")
done

然后,您可以"${OUT[@]}"将数组的元素作为单独的参数传递给另一个命令。

要返回到原始版本,在这种特定情况下,您也可以直接使用sed并完全跳过 bash 循环:

OUT=$(sed -E 's/^| /&-/g' <<<"$List")

正则表达式^|匹配字符串的开头或空格;替换&-意味着“正则表达式匹配的内容”(开头的空字符串或空格)后跟减号。

答案2

您可以使用 for 循环后的命令删除前导空格,例如

OUT=${OUT# }

导致

List="A B C D"
for I in $List
do
    OUT=$OUT" -$I"
done
OUT=${OUT# }

相关内容