区切り文字を使用して変数に文字列を追加する

区切り文字を使用して変数に文字列を追加する

この問題を解決するのに助けが必要です。名前のリストを含むファイルがあります。

名前.txt

roger
peter
henry

:各名前の後に接続したいです。

for i in $(cat names.txt); do
   $i+=$i":"
done 

私が望む出力はこれですroger:peter:henry

しかし、私はこの出力を得ます。roger:peter:henry:

答え1

これを行うためのツールがあります。paste

$ paste -sd: names.txt
roger:peter:henry

答え2

sed以下を使用した代替ソリューションtr:

sed '$!s/$/:/' names.txt | tr -d '\n'

出力:

roger:peter:henry

答え3

paste作業に適したツールです。ただし、完全性を期すために実行したいことを行う方法は次のとおりです。

k="$(head -n1 names.txt)";
for i in $(tail -n+2 names.txt); do 
    k="$k:$i"; 
done

これで以下が生成されます。

$ echo "$k"
roger:peter:henry

答え4

$i+=$i":"

これはあなたが望むことをしません。代わりに、$i表示された場所から展開され、結果をコマンドとして実行しようとします。シェル割り当ては左側のドル記号を使用しません(変数値を使用すると考えてください。ここでは必要ありませんが、保存する場所は必要です)。そのi+=$i":"逆でなければなりません。あるいは、i+="$i:"シェル変数拡張を引用する習慣を挙げる方が良いでしょう。

また、ループ変数として使用される変数に追加しようとしています。これはループの次のラウンドで上書きされるため、あまり役に立ちません。また、最後の項目を含む各項目の後にコロンを追加して、最後にコロンが表示されるようにします。ただし、${var%suffix}拡張後は削除できます。

だから:

s=
for i in $(cat names.txt); do
   s+="$i:"
done 
s=${s%:}

ただし、引用符なしで拡張すると、$(cat)すべてのファイル名ワイルドカードパターン(globs)が処理されるため、ファイルの1行は*現在のディレクトリ内のすべてのファイルに展開されます。

関連情報