角括弧の左側に「if」がないことはどういう意味ですか? [コピー]

角括弧の左側に「if」がないことはどういう意味ですか? [コピー]

私が知っている限り、角括弧は通常、if else文で式を囲むために使用されます。

しかし、次のように角括弧を使用するときは「if」が使用されていないことがわかりました。

[ -r /etc/profile.d/java.sh ] && . /etc/profile.d/java.sh

以下のスクリプトで。

#!/bin/bash### BEGIN INIT INFO  
# Provides:          jbossas7  
# Required-Start:    $local_fs $remote_fs $network $syslog  
# Required-Stop:     $local_fs $remote_fs $network $syslog  
# Default-Start:     2 3 4 5  
# Default-Stop:      0 1 6  
# Short-Description: Start/Stop JBoss AS 7  
### END INIT INFO  
# chkconfig: 35 92 1  

## Include some script files in order to set and export environmental variables  
## as well as add the appropriate executables to $PATH.  
[ -r /etc/profile.d/java.sh ] && . /etc/profile.d/java.sh  
[ -r /etc/profile.d/jboss.sh ] && . /etc/profile.d/jboss.sh  

JBOSS_HOME=/sw/AS7  

AS7_OPTS="$AS7_OPTS -Dorg.apache.tomcat.util.http.ServerCookie.ALLOW_HTTP_SEPARATORS_IN_V0=true"   ## See AS7-1625  
AS7_OPTS="$AS7_OPTS -Djboss.bind.address.management=0.0.0.0"  
AS7_OPTS="$AS7_OPTS -Djboss.bind.address=0.0.0.0"  

case "$1" in  
    start)  
        echo "Starting JBoss AS 7..."  
        #sudo -u jboss sh ${JBOSS_HOME}/bin/standalone.sh $AS7_OPTS           ##  If running as user "jboss"  
        #start-stop-daemon --start --quiet --background --chuid jboss --exec ${JBOSS_HOME}/bin/standalone.sh $AS7_OPTS   ## Ubuntu  
        ${JBOSS_HOME}/bin/standalone.sh $AS7_OPTS &  
    ;;  
    stop)  
        echo "Stopping JBoss AS 7..."  
        #sudo -u jboss sh ${JBOSS_HOME}/bin/jboss-admin.sh --connect command=:shutdown            ##  If running as user "jboss"  
        #start-stop-daemon --start --quiet --background --chuid jboss --exec ${JBOSS_HOME}/bin/jboss-admin.sh -- --connect command=:shutdown     ## Ubuntu  
        ${JBOSS_HOME}/bin/jboss-cli.sh --connect command=:shutdown  
    ;;  
    *)  
        echo "Usage: /etc/init.d/jbossas7 {start|stop}"; exit 1;  
    ;;  
esac  

exit 0  

「if」なしで角括弧は何をしますか?私の言葉は、この文脈で使用されるときに正確に何を意味しますか?

これは重複ではありませんそれOPが「if」を使用した場合、問題はありません。この質問では、括弧が直観に反する方法で使用されます。この質問とこの質問は同じ回答を持つことができますが、2つの異なる質問です。

答え1

角括弧は、条件付きテストを実行するための省略表記です。信じたり、括弧[はUnixの実際のコマンドです。[[

考える:

$ [ -f /etc/rc.local ] && echo "real file"
real file

-and-

$ test -f /etc/rc.local && echo "real file"
real file

Bashでは、[組み込みコマンドと実行可能ファイルです。[[Bashのキーワードです。

はい

以下を使用してこれを確認できますtype

$ type -a [
[ is a shell builtin
[ is /usr/bin/[

$ type -a [[
[[ is a shell keyword

ここで実際の実行可能ファイルを見ることができます。

$ ls -l /usr/bin/[
-rwxr-xr-x 1 root root 37000 Nov  3  2010 /usr/bin/[

組み込み関数とキーワード

Bashのマニュアルページを見ると、man bash2の次の定義があります。

  • キーワード- 予約語はシェルに特別な意味を持つ単語です。次の単語は、引用符がない場合は予約語として認識され、単純なコマンド(以下のSHELL GRAMMARを参照)の最初の単語、または大文字と小文字またはコマンドの3番目の単語です。

    ! case  do done elif else esac fi for function if in select then until while { } time [[ ]]
    
  • 組み込み機能– コマンド名にスラッシュが含まれていない場合、シェルはスラッシュを見つけようとします。同じ名前のシェル関数が存在する場合は、上記の関数で説明されているように呼び出されます。名前が関数と一致しない場合、シェルはシェル組み込み関数のリストから関数を検索します。一致するものが見つかると、組み込み関数が呼び出されます。

    名前がシェル関数でも組み込み関数でもなく、スラッシュを含まない場合、bashはPATHの各要素を検索して、その名前の実行可能ファイルを含むディレクトリを見つけます。 Bashは、実行可能ファイルのフルパス名を記憶するためにハッシュテーブルを使用します(以下のSHELL BUILTIN COMMANDSの下のハッシュを参照)。ハッシュテーブルでコマンドが見つからない場合にのみ、PATHのディレクトリ全体の検索が行われます。検索に失敗すると、シェルはcommand_not_found_handleという定義されたシェル関数を検索します。関数が存在する場合、関数は元のコマンドと元のコマンドの引数を引数として呼び出され、関数の終了状態はシェルの終了状態になります。この関数が定義されていない場合、シェルはエラーメッセージを出力し、終了ステータス127を返します。

マニュアルページ

Bashのマニュアルページを見ると、これに関する詳細な情報を見つけることができます。

test expr
[ expr ]
          Return a status of 0 or 1 depending on the evaluation of the 
          conditional expression expr.  Each operator and operand must be
          a separate argument.  Expressions are composed of the  primaries 
          described  above  under  CONDITIONAL EXPRESSIONS.   test does not 
          accept any options, nor does it accept and ignore an argument of 
          -- as signifying the end of options.

最後に、マニュアルページで:

          test and [ evaluate conditional expressions using a set of rules
          based on the number of arguments.

編集#1

OPに関するフォローアップの質問です。

さて、それではなぜ「if」が必要ですか?私の言葉は、「[」で十分であれば、「if」がなぜ存在するのでしょうか?

if条件文の一部です。コマンドtestまたは[ ... ]コマンドは単に条件を評価し、0または1を返します。 if文は0または1で動作します。 2つを一緒に使用すると、一緒に動作します。

はい

if [ ... ]; then
   ... do this ...
else 
   ... do that ...
fi

答え2

ああ、私のお気に入りのテーマの一つです! !

角括弧は「test」コマンドと同義語です。テストのマニュアルページを読むと、次のコマンドを使用してテストコマンドを呼び出すことができます。

test -r /etc/profile.d/java.sh

または

[ -r /etc/profile.d/java.sh ]

括弧の間と括弧の内側と外側のすべての内容が必要です。

この例の「test」コマンドは、現在のユーザーが/etc/profile.d/java.shファイルを読み取ることができるかどうかを確認します。もちろん Implicit は存在​​を確認することです。 :-)

これは&&、「左側のコマンドが成功すると右側のコマンドを実行する」という意味のbash構文の短縮語です。したがって、この複合コマンドは「if-then」の略語であり、次のようになります。

if test -r /etc/profile.d/java.sh
then
  /etc/profile.d/java.sh
fi

bash のマニュアルページに角かっこの説明もあります。これはテスト機能を拡張するbashビルドです。これはまったく同じではありません。 「test」コマンドと「[」同義語で実行できる操作がありますが、実行できないものがあります。

関連情報