2017-04-14 9 views
-2

私はシェルスクリプトの初心者です。ユーザが入力したファイルを検索するためにlocateコマンドを使用する簡単なスクリプトを実行しようとしています。その名前のファイルが見つかった場合にtrueを返すifステートメントを実装しようとしていますが、コマンドラインにそのファイルを出力しますが、if文にエラーがあると思いますか?bashスクリプト - 文がデータを返すかどうかを確認するif文

#!/usr/bin/bash 
echo -n "Enter filename: " 
read fileToFind 

if [ -z $fileToFind ] 
then 
    echo "Error! No filename entered] 
else 
    fileSearch=`locate -i $fileToFind 

    if [ $fileSearch ] 
    then 
     echo $fileSearch 
    else 
     echo "No such file" 
    fi 
fi 
+1

ご覧ください:http://www.shellcheck.net/ – Cyrus

答えて

1

主な問題はここにある:

if [ $fileSearch ] 

locateが複数の一致するファイルを見つけると、あなたはそれを複数の文字列を与えている間[は、単一の文字列を想定しているため、これはエラーになります。これを防止するために

は、変数を引用:

if [ "$fileSearch" ] 

あなたができないという事実のために知っていない限りあなたは、すべての変数を必ず引用すべきです。

#!/usr/bin/bash 
echo -n "Enter filename: " 
read fileToFind 

if [ -z "$fileToFind" ]     # 1 
then 
    echo "Error! No filename entered" 
else 
    fileSearch=`locate -i "$fileToFind"` # 2 

    if [ "$fileSearch" ]     # 3 
    then 
     echo "$fileSearch"    # 4 
    else 
     echo "No such file" 
    fi 
fi 

#1と#2は、スペースや特殊文字を含むファイルの検索に役立ちます。 #3は、複数のファイルに対してエラーが発生しないようにします。 #4は、複数の一致が1行に書き込まれないようにします。

+0

恐ろしいです!助けてくれてありがとう、これは私が実行してきた共通の問題ですが、bashスクリプトを学ぶのは引用符を適切に使うことです。 – mmiller05

1

@ Cyrusのコメントによると、あなたのコードはhttp://shellcheck.netで実行されました。結果は次のとおりです。

#!/usr/bin/bash 
echo -n "Enter filename: " 
read -r fileToFind 

if [ -z "$fileToFind" ] 
then 
    echo "Error! No filename entered" 
else 
    fileSearch=$(locate -i "$fileToFind") 

    if [ "$fileSearch" ] 
    then 
     echo "$fileSearch" 
    else 
     echo "No such file" 
    fi 
fi 

このWebページの構文ハイライトに注意してください。あなたのコードには赤/マゼンタがたくさんあります。これはあなたがどこかで引用符を閉じていないことを示しています。あなたの質問に今

:私はその名前を持つ任意のファイル が発見された場合はtrueを返し、コマンドラインにそれを印刷し、if文を実装しようとしている

...

ここに興味のあるスタイルがあります:実行中のコマンドが0の終了コードを返す(つまり正常に返る)なら、ifステートメントは真と評価されます。 locate(私の大規模な研究に基づいてhttps://linux.die.net/man/1/locateに基づいて)の場合、ファイルが返された場合、locateは呼び出しを成功と見なします。 locateは結果をコマンドライン(またはLinux用語ではstdout)に出力します。で結果この場合

# other code omitted for focus/brevity 
    if 
     ! locate -i "$fileToFind" 
    then    
     echo "No such file" 
    fi 

、私は否定しました:言ったことすべては、あなたがこのような文があれば再書くことができます!。したがって、locateがファイルを見つけることに失敗すると、プログラムは "No such file"を出力します。 locateがファイルを見つけたら、locateをstdoutに出力します。

このコードを書くのわずかterser方法があり:上記の文で

locate -i "$fileToFind" || echo "No such file" 

は、論理ORを評価するためにはbashを求めている、||短絡論理を持つ。式が真であれば、bashは文の実行を停止します。したがって、上記の場合、locateが成功してファイルが見つかると、||の後にbashは正しい式を実行しません。これは書くのが楽しい簡潔なイディオムですが、他人が理解するのが少し難しいかもしれません。if文は、通常、あなたのロジックをより明確に表現し、その場合はそれに固執します。

+0

ありがとう!これは多くの助けになりました!私はあなたがそれを行うためにORステートメントを実行できることを知らなかった。学習しながら私は基本的なif/elseを見つけただけです – mmiller05

関連する問題