![如何连接 Bash 脚本中列表中的字符串?](https://linux22.com/image/1423444/%E5%A6%82%E4%BD%95%E8%BF%9E%E6%8E%A5%20Bash%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E5%88%97%E8%A1%A8%E4%B8%AD%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2%EF%BC%9F.png)
举个例子:
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# }