2017-05-22 11 views
2

私は、使用されているかどうかをテストするために使用される小さなシェルスクリプトを持っています。findユーザーがログインしているかどうかを確認するシェルスクリプト

#!/bin/bash 

if [ $# -ne 1 ] 
then 
     echo "Argument required" 
     echo "Usage: on user" 
else 
     user="$1" 

     if who | grep ^"$user " > /dev/null 
     then 
       echo "$user is logged in" 
     else 
       echo "$user is not logged in" 
     fi 
fi 

これは正しく動作します。

ここに私の質問があります:私はこれを試してみると、以下のような条件の場合、シェル端末がエラーを意味します。

if [ who | grep ^"$user " > /dev/null ] 

> Error ./user.sh: line 10: [: missing `]' 
    grep: ]: No such file or directory 

これらの2つのテスト条件の違いは何ですか?簡単な言葉で

+0

なぜ中括弧がありますか? '['。あなたが持っていたスクリプトとは違って、端末で試してみると '' '?あなたが問題になるかもしれないと結論づけるのは明らかではありませんか? – Inian

答えて

2

[またはtest表現、ないコマンドリストの結果をテストします。ここ

testifの構文である:

テスト式expr [expr]は

リストであれば、リストします。 [elif list;リストします。 ] ... [elseリスト; 】Fiの

そしてif構築物で、それはcommmandリスト続くことができます。

if who | grep ^"$user " > /dev/nullでは、コマンドwho | grep ^"$user " > /dev/nullを実行してから、コマンドの戻り状況のをテストします。

しかしif [ who | grep ^"$user " > /dev/null ]では、最初のコマンド[ who | grep ^"$user " > /dev/null ]を実行するが、なぜなら|(パイプライン)、commmandがは、2つの部分として解析されるの
1:[ who、文句であろう:「10行目:[:missing `] '"
2番目:grep ^"$user " > /dev/null ] "grep:]:そのようなファイルやディレクトリはありません"。 発現[又はtestの形式として

The classic test commandを指します。そして、メインの4 expressoinsは以下のとおりです。 ファイルテスト文字列テスト算数のテストmiscのテスト

0

関数を使用します。

#!/bin/bash 

logged_in() { who | grep ^"$1 " > /dev/null; } 

if [ $# -ne 1 ] 
then 
    echo "Argument required" 
    echo "Usage: on user" 
else 
    user="$1" 

    if logged_in "$user" 
    then 
     echo "$user is logged in" 
    else 
     echo "$user is not logged in" 
    fi 
fi 
関連する問題