it-swarm-ja.com

bashスクリプトのリストから文字列を連結するにはどうすればよいですか?

例として:

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

これを実行すると、結果は次のようになります。

" -A -B -C -D"

しかし、それをしたい:

"-A -B -C -D"

先頭のスペースなしで連結するにはどうすればよいですか?

このところで、スクリプトの引数リストです。

5
Seb S

条件付きパラメーター展開 を使用します。

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")
10
Mark Reed

次のようなforループの後のコマンドを使用して、先頭のスペースを削除できます。

OUT=${OUT# }

につながる

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