コンテンツXを含む行でファイルが準備されているかどうか、それ以外の場合は行が追加されたかどうかを知る必要があります。私が試したコードは次のとおりです。
if ! $(grep 'eval $(perl -I$HOME/foo/lib/perl5 -Mlocal::lib=$HOME/foo)' ~/.bashrc)
then
echo 'eval $(perl -I$HOME/foo/lib/perl5 -Mlocal::lib=$HOME/foo)' >> ~/.bashrc
fi
答え1
#!/bin/bash
LINE='eval $(perl -I$HOME/foo/lib/perl5 -Mlocal::lib=$HOME/foo)'
if ! grep -qF "$LINE" file.txt ; then echo "$LINE" >> file.txt ; fi
$(...) は、エラーレベルの値ではなくコマンドの結果を返します。正しい戻りコードを取得するために、コマンドを置き換えることなく使用できます。
答え2
リテラル文字列を検索するには:
line='eval $(perl -I$HOME/foo/lib/perl5 -Mlocal::lib=$HOME/foo)'
file=~/.bashrc
if ! grep -q -x -F -e "$line" <"$file"; then
printf '%s\n' "$line" >>"$file"
fi
-q
出力を抑制しますgrep
(リターン状態にのみ興味があります)。-x
一致するには完全な行が必要です。-F
正規表現の代わりにリテラル文字列を検索します。場合に備えて開始する予防措置です-e
。$line
-
答え3
awk
s関数を使用すると、index
運が良くなる可能性があります。と同じであるため(パターンマッチングでstrstr
はなく)比較に適している必要があります。grep
答え4
これを行うには、sedを使用できます。問題は、コードに文字列を2回含める必要があることです。一度テストした後、再接続してみてください。
sed -i '/eval \$(perl -I\$HOME\/foo\/lib\/perl5 -Mlocal::lib=\$HOME\/foo)/!{ ${ s/$/\neval \$(perl -I\$HOME\/foo\/lib\/perl5 -Mlocal::lib=\$HOME\/foo)/; }; }' /path/to/file