0

「grep」コマンドを使用して、文字列にスラッシュが含まれているかどうかを確認したい。最初は簡単で、次のスクリプトを書きました。

foo=someone/books
if [ `echo "$foo" | grep '/'` ]
then
    echo "has forward slash"
fi

ただし、変数「foo」を次の文字列に設定すると、問題は隅にあります。

foo="someone/books in stack"

変数fooに「スペース」があるため、上記のスクリプトは失敗します。コマンドを展開すると、ifステートメントの条件は次のようになります。

grep '/' someone/books in stack

「スペース」のため、上記の「grep」コマンドには、不正な引数が多すぎます。参考までに、caseステートメントを使用してこの問題を解決しようとしています。

case $foo in
    */*)
        echo "has forward slash"
        ;;
    *)
        ;;
esac

ただし、caseステートメントは冗長なので、使用したくありません。では、grepコマンドなどを使用してこの問題をどのように解決できますか?

4

3 に答える 3

2

ifステートメントを正しく使用していません。if条件のコマンドは、展開時に単一の文字列になるように引用符で囲む必要があります。このような:

if [ "`echo "$foo" | grep '/'`" ]
then
    echo "has forward slash"
fi

または、if-conditionでgrepのリターンコードを確認すると、さらに良い結果が得られます。

if $(echo "$foo" | grep -q '/')
then
    echo "has forward slash"
fi

grepを廃止して、代わりにこれを使用することもできます。

foo="someone/books in stack"
if [[ "$foo" == */* ]]
then
  echo "has forward slash"
fi
于 2012-11-12T15:47:06.273 に答える
0
foo="someone/books with spaces"
bar=`echo $foo | grep '/'`
if [ $? -eq 0 ]
then
    echo "$foo has forward slash"
fi

これは私にとってはうまくいきます。

このように終了ステータスを使用することに頼りたくない場合は、dogbane の回答を見て、より正しい回答を確認することをお勧めします。

于 2012-11-12T15:56:52.867 に答える
0

冗長であることには何の問題もありません。多くの場合、保守性に役立ちます。ただし、簡潔にすることはできます。すべての改行は必要ありません。また、何もしない場合はデフォルト ブランチも必要ありません。

case "$foo" in
    */*) echo "has forward slash" ;;
esac

grep の使用を主張する場合は、出力ではなく、grep からの戻りステータスを使用してください。

if echo "$foo" | grep -q /; then
    echo "has forward slash"
fi
于 2012-11-12T17:42:41.657 に答える