4つの異なるファイルの最後の行を読み、特定の文字列を探しています。その文字列に基づいてソースファイルの名前を変更する必要があります。 4つのファイルはすべてgrep文字列と最終的な宛先名が異なります。
if tail -n1 $f | grep $string -e $string; then cp $f to file.new
else tail -n1 $f |grep $sting2 -e $string2; then cp $f to file2.new
答え1
- すべての変数置換を引用する必要があります。そうしないと、値の空白やその他のシェル魔法文字がそれを別々のパラメータに分割したり、望ましくない効果をもたらしたりします。
- grepには、2番目の文字列の前ではなく、各検索文字列の前に「-e」が必要です。文字列は同じように見えるので、もちろん1つは省略できます。
- コメントで述べたように、「cp」から「to」を削除します。
- $ string2の最初のエントリにタイプミス(rがありません)があります。コピーして貼り付けると、元のコードに同じタイプミスがある可能性があります。
if tail -n1 "$f" | grep -e "$string"; then cp "$f" file.new
else tail -n1 "$f" |grep -e "$string2"; then cp "$f" file2.new
else ... string3 file3
else ... string4 file4
fi
答え2
tail -n1 $f
パスが保存されているファイルの最後の行を取得する正しい構文ではありません$f
。正しい構文はtail -n1 -- "$f"
次のとおりです(したがって名前付きファイルでも機能します-
)tail -n1 < "$f"
。
同様に、行に$string
含まれているかどうかを確認するには、$string2
構文は次のとおりですgrep -F -e "$string" -e "$string2"
。
とにかくbashと他のほとんどのBourne様シェルでは、引用符なしで引数を拡張することはほとんど意味がありません。
ここでは、次の文を使用する必要がありますcase
。
case "$(tail -n1 < "$f")" in
(*"$string"*) cp -- "$f" file.new;;
(*"$string2"*) cp -- "$f" file2.new;;
esac