実行ファイル内の角かっこの目的は何ですか

実行ファイル内の角かっこの目的は何ですか

「[」という実行ファイルがあることを確認しました/usr/bin。その目的は何ですか?

ここに画像の説明を入力してください。

答え1

ほとんどの場合、[これは同等のシェル組み込みですtest。ただし、同様に、スタンドアロンの実行可能testファイルとしても存在します。これが/bin/[まさにあなたが見るものです。次のコマンドを使用してこれをテストできますtype -a [(Arch Linuxシステムでは実行bash)。

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

したがって、私のシステムには2つの方法があります[。マイシェルの組み込みファイルと、次の/bin場所に書き込まれた.executableファイルman test

TEST(1)                          User Commands                         TEST(1)

NAME
       test - check file types and compare values

SYNOPSIS
       test EXPRESSION
       test

       [ EXPRESSION ]
       [ ]
       [ OPTION

DESCRIPTION
       Exit with the status determined by EXPRESSION.

[ ... ]

上で引用したマニュアルページに見られるように とtest[同じです。そして/bin/[/bin/testPOSIXで指定多くのシェルが組み込み機能としても提供されていますが、これがまさにあなたが見つけることができる理由です。これらの存在は、次の構造を保証します。

[ "$var" -gt 10 ]  && echo yes

実行中のシェルに組み込み機能がなくても[機能します。たとえば、次のようになりますtcsh

> which [
/sbin/[
> set var = 11
> [ "$var" -gt 10 ]  && echo yes
yes

答え2

シェルスクリプトの条件付きテストに使用されます。このプログラムの他の名前は次のとおりですtest

if [ 1 -lt 2 ]; then ...

これはシェル構文のように見えますが、そうではありません。通常は[シェル組み込みコマンドですが、代わりに外部コマンドとして存在することもできます。

の「条件式」ブロックを参照してくださいman bash

答え3

[同じコマンドでtest。一部の* nixシステムでは、1つは別のシステムへのリンクにすぎません。たとえば、次を実行する場合:

strings /usr/bin/test 
strings /usr/bin/[

同じ出力が表示されます。

ほとんどのsh-shells / posix-shellsには​​組み込みコマンド[testコマンドが含まれています。についても同様ですecho/bin/echoほとんどのシェルにはコマンドと組み込み機能があります。これが時々echo他のシステムで状況が異なるように動作するように感じる理由です。

testまたは[単に終了コードを返す01。テストが成功すると、終了コードは0です。

# you can use [ command but last argument must be ] 
# = inside joke for programmers 
# or use test command. Args are same, but last arg can't be ] :)
# so you can't write 
#    [-f file.txt] because [-f is not command and last argument is not ]
# after [ have to be delimiter as after every commands
[ -f file.txt ] && echo "file exists" || echo "file does not exist"
test -f file.txt && echo "file exists" || echo "file does not exist"
[ 1 -gt 2 ] && echo yes || echo no
test 1 -gt 2  && echo yes || echo no
# use external command, not builtin
/usr/bin/[ 1 -gt 2 ] && echo yes || echo no

[以下も使用できますif

if [ -f file.txt ] ; then
  echo "file exists" 
else 
  echo "file does not exist"
fi
# is the same as
if test -f file.txt  ; then
  echo "file exists" 
else 
  echo "file does not exist"
fi

ififただし、終了コードをテストするためにすべてのコマンドでこれを使用できます。たとえば、

cp x y 2>/dev/null && echo cp x y OK ||  echo cp x y not OK

または以下を使用してくださいif

if cp x y 2>/dev/null ; then
   echo cp x y OK
else
   echo cp x y not OK
fi

test次のコマンドを使用して変数に保存されている終了コードをテストすると、同じ結果が得られますstat

cp x y 2>/dev/null 
stat=$?
if test "$stat" = 0 ; then
   echo cp x y OK
else
   echo cp x y not OK
fi

[[ ]]テストにはandを使用することもできますが、(( ))構文はほとんど同じですが、andと同じではありません。[test

最後に、コマンドが何であるかを確認するには、次のものを使用できます。

type -a command

関連情報