bashスクリプト - 構文の助けが必要です

bashスクリプト - 構文の助けが必要です

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

  1. すべての変数置換を引用する必要があります。そうしないと、値の空白やその他のシェル魔法文字がそれを別々のパラメータに分割したり、望ましくない効果をもたらしたりします。
  2. grepには、2番目の文字列の前ではなく、各検索文字列の前に「-e」が必要です。文字列は同じように見えるので、もちろん1つは省略できます。
  3. コメントで述べたように、「cp」から「to」を削除します。
  4. $ 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

関連情報