2012-03-20 6 views
0

私はそれでこの機能を持っているbashスクリプトを持っています。私の問題は、2つのif文が独立して動作することです。例えば、それらのうちの1つをコメントアウトすると、テストが機能し、必要なものが実行されます。しかし、たとえば、プロンプトでディレクトリを入力すると、viはファイルとしてファイルを開きます。このファイルでは、テストは単独で機能するときと同じように、ディレクトリであるというエコーを返さなければなりません。Bashの機能コンポーネントの作業は独立したが未一緒

これはなぜですか?私はまだbashスクリプトでは比較的新しいので、プロにとってはおそらく簡単ですが、私はしばらくの間、頭に頭を叩いています。

ありがとうございます。

答えて

3

最初if/thenreturnのステートメントを追加します。

function start_vi() 
{ 
    echo "Please enter a file name with complete path to open in vi:" 
    read input_file 

    if [ -d "$input_file" ] 
    then 
     echo "You entered a directory." 
     echo "Please try again and enter a readable/writable file." 
     return 
    fi 

    grep_var="file $input_file | grep -c data" 

    if [ $? -eq 0 ] 
    then 
     vi $input_file 
    else 
     echo "File not found or invalid file type. Please try again." 
    fi 
} 

をそれ以外の場合は、印刷してから開きますとにかく、あなたの2番目のテストは次のようになります:

file $input_file | grep -c data 

    if [ $? -eq 0 ] 

$?は、最後に実行したコマンドの終了コードです。変数(つまりgrep_var="...")に割り当てると$?が0に設定されます。終了コードはgrep -c dataです。その場合、以下のようにコマンドを実行するには引用符ではなくバッククォートを使用します。この:

grep_var=`file $input_file | grep -c data` 

    if [ $grep_var != 0 ] 

文字列値を比較する(つまり、何grep -c dataリターン - data行数)あなたはループを必要とする

上記の問題を解決する必要がありますのいくつかを行う

+0

良いアドバイスをありがとう。リターンはうまくいき、まさに私が望んでいたものでした。奇妙なことに、目盛りを付け加えて '$ grep_var!= 0'テストをしても、別のシェルスクリプトのように有効なファイルを入力したときに結果が得られませんでした。だから私はどのように私はそれを(あなたのリターンで)持っていたに戻り、それは私がそれをしたい方法で動作しています。 – nicorellius

+0

奇妙な - これは期待どおりに動作するはずです。 'a'という名前のファイルがないところでこれを試してみましょう:echo hello> a; if ['grep -c hello a'!= 0];エコーがあります。 fi –

+0

それは印刷されました: 'There is hello'。おそらく私はその部分をコーディングするときにエラーを出しました。私はもう一度やり直します。 – nicorellius

1

必要なのは、ループです:

....

read input_file 
while [ ! -f "$input_file" ] 
do 
     echo "You did not enter a file" 
     echo "Please try again and enter a readable/writable file." 
     read input_file 
done 

grep_var="file $input_file | grep -c data" 

if [ $? -eq 0 ] 
then 
    vi $input_file 
else 
    echo "File not found or invalid file type. Please try again." 
fi 
+0

...これはあなたが何をしたいかに近いかもしれないと思うが、その後のスクリプトちょうどそこにサイト。私がEnterを押すと、空のファイルにviが開きます。私が何か間違っていたかどうかは分かりません... – nicorellius

+1

@nicorellius、私はそれをループでチェックする方が良いと思います。 – perreal

+0

whileループでまだぶら下がっています... – nicorellius

1

function start_vi() 
{ 
    echo "Please enter a file name with complete path to open in vi:" 
    read input_file 

    while [ -d "$input_file" ] 
    do 
     echo "You entered a directory." 
     echo "Please try again and enter a readable/writable file." 
     read input_file 
    done 

    grep_var="file $input_file | grep -c data" 

    if [ $? -eq 0 ] 
    then 
     vi $input_file 
    else 
     echo "File not found or invalid file type. Please try again." 
    fi 
} 
+0

この回答には同じコメントが適用されます。 perrealの答えの下で上記を参照してください。私はこのループワークを見たいと思っていますが、今のところリターンは仕事を終わらせています。 – nicorellius

0

私はこれがどのように動作するか確認し、それが理にかなっているが、実装された場合、echo文が起こる

function start_vi() 
{ 
    echo "Please enter a file name with complete path to open in vi:" 
    read input_file 
    grep_var=`file $input_file 2>&1 | grep -c data` 
    while [ $? -ne 0 ] 
    do 
     echo "File not found or invalid file type. Please try again." 
     read input_file 
     grep_var=`file $input_file 2>&1 | grep -c data` 
    done 
    vi $input_file 
} 
関連する問題