bashスクリプト[x$1 = x]

bashスクリプト[x$1 = x]

bashスクリプトを読んでいますが、何が起こっているのかわかりません。

#!/bin/sh
[ x$1 = x ] 

2行目では何が起こりますか?[ x$1 = x ] これはどういう意味ですか?

答え1

$1引用符で囲む必要がありますが、nullであることを確認してください(と同じ[ -z "$1" ])。一部の非常に古いシェルは空の文字列を正しく処理しなかったため、移植可能なスクリプト作成者はこのチェックを実装しました。何十年もの間、これは必要ではありませんでしたが、人々はまだそうするので、人々はそれをやっています。

答え2

角かっこは次のことを示します。テスト、文法的には大丈夫ですが、そのようなものがなければ[ x$1 = x]意味がありません。if

x$1に拡張された場合はtrueと評価され、xそれ以外の場合はfalseと評価されます。ただし、引用されていないため、$1シェルは(たとえば)「hey x」の場合はこれを見るため、x = xこの設定はまだ安全ではありません。

検査の目的は、x = x変数が空であることを確認することです。より一般的なアプローチは、引用符を使用することです。

if [ "$1" = "" ]; then

Bashテスト演算子-z-n使用できますが、他の種類のシェルには移植性がありません。1

引用符を使用する理由は、x$1左側がnullに拡張されないようにするためです。これは構文エラーです。

if [  = x ]  # No good!
if [ "" =  "" ] # Okay.
if [ x = x ] # Also okay.

1.実際にはスタンドアロンのtestユーティリティであるかもしれませんが、ほとんどのシェルはそれを組み込みに実装します。 GNU / Linuxは組み込み関数を参照すると主張していますが、(たとえば)呼び出すと、ユーティリティはおよびを含むマニュアルページに文書化された機能を実装しているように見えます。which testtype testman test/usr/bin/test-z-n

答え3

[ x$1 = x ]

でのみzsh。これはx接続をスクリプトの最初の引数と比較しますx。したがって、空であるか提供されていない場合、[コマンドはtrueを返します。$1

[ $1 = "" ]

zshリストコンテキストで空の変数が参照されていない場合は、空の引数の代わりに引数がまったくないように拡張されるため、コマンドは設定されていないか空の$1場合にのみ引数として受け取られるため、機能しません。空の文字列を理解しました。それともPOSIXシェルと同じです。[[=][ -z "$1" ][ "$1" = "" ]

Bourneのような/ POSIXシェルでは[ x$1 = x ]これは意味がありません。これは、スクリプトの最初の引数に何らかの方法で適用された分割+glob演算子を連結したものでx、結果と=xおよびコマンドの有効なテスト式を]構成したいと思います。[

たとえば、スクリプトに" = x -o x ="パラメータが渡されると、、、、、、、、、、、、、、、、、、、、、、などのパラメータを[受け取り、これと比較してtrueを返すことがわかります。[x=x-ox=x][xxxx

この場合、シェルは、名前が(glob拡張)で始まる現在のディレクトリのファイルのリストと非表示のファイルのリスト(拡張)を$1コマンドに渡します...これは意味がありません。 。意味のある唯一のケースは、ワイルドカードやスペース文字が含まれていない場合です。"* *"[xx**[$1

今度は、次のコードを見つけることができます。

[ "x$1" = x ]

$1空であるか設定されていないかをテストするために使用されます。

空または設定されていない変数をテストする一般的な方法は次のとおりです。

[ -z "$1" ]

しかし、いくつかの(POSIXではない)実装のいくつかの値$1(たとえば、Solaris 10以前のBourneシェルの組み込み値)、またはいくつかの以前のバージョン(最大0.5.4)、または一部のBSDの場合、その方法は失敗します。=[/bin/shdashsh

これは、、、およびが文字列に適用される単項演算子として理解されるのではなく、二項演算子に対する引数の欠落について不平を言うように[見えるためです。[-z=]=-z=

同様に[ "$1" = "" ]、ifのいくつかの実装は失敗します。[$1!(

これらのシェル/[実装では:

[ "x$1" = x ]

値に関係なく常に有効なテストなので、$1次のようになります。

[ "" = "$1" ]

そして:

[ -z "${1:+x}" ]

そして

case $1 in "") ...; esac

もちろん、引数が指定されていないことを確認するには、次のようにします。

[ "$#" -eq 0 ]

つまり、スクリプトに渡された引数の数を確認します。

最近は[ -z "$var" ]POSIXで明示的に指定されており、適合性の実装に失敗しません[(そして何十年もやってきbashました[)。したがって、bashPOSIX shまたはスクリプトでそれを使用できる必要があります。

答え4

[ x$1 = x ]$1設定されていない、null、空の場合は真です。
試してみてください:
TEST= ;[ x$TEST = x] && echo "TEST is unset"
そして
TEST=lolz ;[ x$TEST = x ] && echo "TEST is unset"

関連情報