回答:
ほとんどの場合、[
は組み込みのシェルで、と同等test
です。ただし、のようにtest
、スタンドアロンの実行可能ファイルとしても存在し/bin/[
ます。見たとおりです。これをテストするにはtype -a [
(Arch Linuxシステムでを実行bash
):
$ type -a [
[ is a shell builtin
[ is /bin/[
したがって、私のシステムには[
、シェルの組み込みコマンドと実行可能ファイルの2つがあり/bin
ます。実行可能ファイルのドキュメントは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.
[ ... ]
あなたはmanページの抜粋で見ることができるように上記引用し、test
かつ[
等価です。/bin/[
そして/bin/test
コマンドがされているPOSIXによって指定されたあなたは多くのシェルでも組み込みコマンドとしてそれらを提供するという事実にもかかわらず、それらを見つける理由です。それらが存在することで、次のような構造が保証されます。
[ "$var" -gt 10 ] && echo yes
それらを実行するシェルに[
組み込み機能がない場合でも機能します。例えば、中tcsh
:
> which [
/sbin/[
> set var = 11
> [ "$var" -gt 10 ] && echo yes
yes
sh
は知っているdash
が、レスキューシステムは/bin/sh
busybox ではなく使用していると思った。本気ですか?
これは、シェルスクリプトでの条件テストに使用されます。このプログラムの別の名前はtest
次のとおりです。
if [ 1 -lt 2 ]; then ...
それはシェル文法のように見えますが、そうではありません。通常[
はシェル組み込みですが、おそらくフォールバックとして外部コマンドとして存在します。
のブロック「条件式」を参照してくださいman bash
。
[
と同じコマンドtest
です。一部の* nixシステムでは、一方は他方への単なるリンクです。たとえば、次を実行する場合:
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
cmp /usr/bin/[ /usr/bin/test
ハッシュを使用するか、ハッシュを使用する必要sha256sum /usr/bin/[ /usr/bin/test
がありstrings
ます。私のシステム(openSUSE Tumbleweed)では、これらは同じではありません(しかし)。
[
組み込みのないシェルは、作成者が追加しないことにしたシェルにすぎません。たとえば、組み込みtcsh
機能はありません[
。