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

Seb*_*b S 9 script shell-script bash-scripting

举个例子:

List="A B C D"
for I in $List
do
    OUT=$OUT" -$I"
done
Run Code Online (Sandbox Code Playgroud)

当我运行它时,结果是:

" -A -B -C -D"
Run Code Online (Sandbox Code Playgroud)

但希望它是:

"-A -B -C -D"
Run Code Online (Sandbox Code Playgroud)

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

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

Mar*_*eed 14

使用条件参数扩展

List="A B C D"
for I in $List
do
    OUT=${OUT:+$OUT }-$I
done
Run Code Online (Sandbox Code Playgroud)

${OUT:+$OUT }如果 OUT 未设置或为空,则表达式扩展为空;如果它被设置为某物,那么它会扩展为后跟一个空格的某物。

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

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

根据您正在使用的内容$OUT,将其设置为数组也可能是有意义的:

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

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

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

OUT=$(sed -E 's/^| /&-/g' <<<"$List")
Run Code Online (Sandbox Code Playgroud)