答え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/test
POSIXで指定多くのシェルが組み込み機能としても提供されていますが、これがまさにあなたが見つけることができる理由です。これらの存在は、次の構造を保証します。
[ "$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
または[
単に終了コードを返す0
か1
。テストが成功すると、終了コードは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
if
if
ただし、終了コードをテストするためにすべてのコマンドでこれを使用できます。たとえば、
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