この問題を解決するのに助けが必要です。名前のリストを含むファイルがあります。
名前.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行は*
現在のディレクトリ内のすべてのファイルに展開されます。