質問: 'grep'の後の変数と文字列を連結します これが私のファイルの構造です:g-4.n.g.fr 10.147.243.63 g-4.n.g.fr-w1 これが私のスクリプトです: #! /bin/sh ip=10.147.243.63 worker=$(grep -e $ip $1 | awk '{ print $3; }') echo "[hostname: ]" echo $worker echo "[before concat]" echo $worker echo "[after concat]" echo "$worker.v.1" 私はこの出力を持っています:[hostname: ] g-4.n.g.fr-w1 [before concat] g-4.n.g.fr-w1 [after concat] .v.1n.g.fr-w1 次のように、.v.1の後にg-4.n.g.fr-w1を置換せずに使用したい。g-4.n.g.fr-w1.v.1 この出力を持つようにスクリプトを変更するにはどうすればよいですか?
回答: 弦やその一部で遊んだときの奇妙な結果まず、行末をテストします。$ file test.txt test.txt: ascii text, with crlf line terminators 上記を取得し、実際にdos行末が必要ない場合は、 dos2unix ツールを使用できます。$ dos2unix test.txt dos2unix: converting file test.txt to unix format ... $ file test.txt test.txt: ascii text さて、一貫した形式で私のデータを取得しましたスクリプトは、多かれ少なかれ意図したとおりに機能するはずです(ここでは機能します)。[hostname: ] g-4.n.g.fr-w1 [before concat] g-4.n.g.fr-w1 [after concat] g-4.n.g.fr-w1.v.1 それでも問題が解決しない場合は、次のことを試してください。printf "%s.v.1" "$worker" スクリプトを変更して、ファイル内の文字列を検索するためにgrepを使用していることを明確にし、 bashの落とし穴 に従ってプレーンなecho $varsを削除することをお勧めします。ip="10\.147\.243\.63" worker=$(grep -e $ip $1 | awk '{ print $3; }') printf "[hostname: ]\n" printf '%s\n' "$worker" printf "[before concat]\n" printf '%s\n' "$worker" printf "[after concat]\n" printf '%s.v.1\n' "$worker"