シェルプログラミング:Bashスペースのこと

6049 ワード

まずbashの中でいつスペースを使うべきですか?いつ使うべきですか?
1.等号は両側にスペースがないようにしてください。
2.コマンドとオプションの間にスペースが必要です。
3.パイプの両側にスペースがありますか?
よくある問題を見てみましょう。
1.値を賦課するときは、等号の両側または左側だけがスペースが多くなります。

igi@gentoo ~ $ var1 = test
bash: var1: command not found
igi@gentoo ~ $ echo ${var1:?error}
bash: var1: error
igi@gentoo ~ $ echo ${var1?error}
bash: var1: error
igi@gentoo ~ $ var2 =test
bash: var2: command not found
igi@gentoo ~ $ echo ${var2:?error}
bash: var2: error
igi@gentoo ~ $ echo ${var2?error}
bash: var2: error
ここでbashの変数を使って拡張しました。error}var 1がunsetまたはnull(未定義または空)の場合、エラーを指定します。var 1error}var 1がunsetの場合、エラーを指定します。実行結果から、等号の左側にスペースがあると変数名がコマンドとして実行され、結果としてcommand not foundが報告され、変数が割り当てられていませんでした。
2.評価時には等号の左側にスペースがなく、右側にスペースがあります。

igi@gentoo ~ $ var= test
igi@gentoo ~ $ var= nocmd
bash: nocmd: command not found
同じ等号の右側にスペースがあります。第一条の命令は間違っていません。第二条の新聞は間違っています。
これはshellに命令を実行する方式があるからです。var=string command
コマンドcommandは変数varの値を取得します。(コマンド実行後、変数varの値は保留されていますか?bash 4には保留されていませんが、dashで発見された時は保留されています。shellによってこれに対する処理が異なります。)testはコマンドであり、nocmdはないので、command not foundを報告しました。

igi@gentoo ~ $ var=newtest eval echo \$var
newtest
igi@gentoo ~ $ echo $var
注意:ここで私はevalを使っています。最初の解析で$varが空の文字列に置き換えられないようにしたいです。そうしないと次のようなことがあります。(以下は間違ったテスト方法です。echoが実行されていない場合、varは空の文字列に置き換えられました。)

igi@gentoo ~ $ var=newtest echo $var
igi@gentoo ~ $ echo $var
ここに来て、皆さんは分かりましたよね。等号に対しては、左右の両側にスペースがあってはいけません。右側にスペースがありますが、必ずしも間違えたとは限りません。
3.コマンドとオプションの間にスペースが必要です。
これはみんなわかっているようですが、なぜ私はまだくどいですか?ここでは、非常に特殊な命令を出さなければなりません。
私たちの理解。「見覚えのある命令です。間違いないです。見たことがあると保証します。次の例を見に来てください。

igi@gentoo ~ $ if [ "abc" = "abc" ]; then echo ‘they are the same'; fi
they are the same
igi@gentoo ~ $ type -a [
[ is a shell builtin
[ is /usr/bin/[
思い出しましたか命令は常にifで判断しますが、もちろん好きな人もいます。

igi@gentoo ~ $ [ "abc" = "cba" ] || echo ‘they are not the same'
they are not the same
igi@gentoo ~ $ type -a [
[ is a shell builtin
[ is /usr/bin/[
[命令正名はtest命令といいますが、両者はほぼ同じです。なぜ全く同じではないですか?これを見に来てください

igi@gentoo ~ $ [ "abc" = "cba"
bash: [: missing `]‘
igi@gentoo ~ $ [ "abc" = "cba" ]
igi@gentoo ~ $ test "abc" = "cba" ]
bash: test: too many arguments
igi@gentoo ~ $ test "abc" = "cba"
分かりました。「命令する時は尻尾を与えなければなりません。」とtest命令を使う時は、尻尾をつけてはいけません。しっぽは「最後のパラメータ、不可欠なパラメータ、[コマンドの終了]を表します。
こんなにたくさん引っ張ったら、これはスペースと毛の関係がありますか?これらを言って、まずみんなに分かります。「shellには命令があります。左右にスペースがあります。」は「最後に欠かせないパラメータです。両側にもスペースが必要です。「よくある間違い」について見てみましょう。
a.ifと[間にスペースがない]

igi@gentoo ~ $ if[ "$HOME" = "/home/igi"];then echo 'equal'; fi
bash: syntax error near unexpected token `then'
igi@gentoo ~ $ if[ "$HOME" = "/home/igi" ];then echo 'equal'; fi
bash: syntax error near unexpected token `then'
igi@gentoo ~ $ if["$HOME" = "/home/igi"];then echo 'equal'; fi
bash: syntax error near unexpected token `then'
igi@gentoo ~ $ if["$HOME" = "/home/igi" ];then echo 'equal'; fi
bash: syntax error near unexpected token `then'
文法の解析ミスが明らかで、if
b.[後ろのパラメータとの間にスペースがない。

igi@gentoo ~ $ if ["$HOME" = "/home/igi" ];then echo 'equal'; fi
bash: [/home/igi: No such file or directory
igi@gentoo ~ $ if ["$HOME" = "/home/igi"];then echo 'equal'; fi
bash: [/home/igi: No such file or directory
「$HOME」もbashにとっては何の幽霊か分かりません。
c.[]間のパラメータの間にスペースがない

igi@gentoo ~ $ if [ "abc"="abc" ]; then echo 'equal'; fi
equal
igi@gentoo ~ $ if [ "abc"="cba" ]; then echo 'equal'; fi
equal
第一条命令は正しいようです。第二条命令「abc」と「cba」は明らかに違っていますが、同じと判断されます。これはパラメータ間にスペースがないため、「コマンドは内部の値と考えられています。下の命令を見れば安心します。

igi@gentoo ~ $ if [ 0 ]; then echo 'equal'; fi
equal
igi@gentoo ~ $ if [ "1" ]; then echo 'equal'; fi
equal
igi@gentoo ~ $ if [ "" ]; then echo 'equal'; fi
igi@gentoo ~ $ if [ ]; then echo 'equal'; fi
内部には、一つの値(スペースがないので、一緒に計算してもいいです)だけがあれば、空の文字列ではないのが本当です。だから[]間のパラメータも、両側にスペースがあり、一緒に積んではいけません。
d.パラメータとしっぽ」の間にスペースがありません。
これはうるさくないです。尻尾も「命令のパラメータは、上に述べたように、パラメータの間にスペースが必要です。」
これだけ引っ張ってきました。「命令と空欄のことですが、スペースが足りなくても正確に運行できます。もちろんこれはあなたの幸運です。一緒に見に来てください。

igi@gentoo ~ $ var=' abc'
igi@gentoo ~ $ if [$var = "abc" ];then echo 'equal'; fi
equal
igi@gentoo ~ $ if ["$var" = "abc" ];then echo 'equal'; fi
bash: [ abc: command not found
前のBash引用符について述べましたが、二重引用符で囲まれているのは全体です。二重引用符がない場合は、文字列の前後のスペースやタブが切り裂かれます。偶然に会った場合や、わざと文字列の前後のスペースやタブを捨てることは不可能ではありませんが、このように書くことをお勧めしません。コードは非常に脆弱です。
あるいは、入れるべきスペースは全部入れましたが、やはり間違えました。これもダブルクォーテーションの欠如と関係があります。このような状況は普遍的です。最後にもう一度見ます。

igi@gentoo ~ $ var=''
igi@gentoo ~ $ if [ "$var" = "abc" ];then echo 'equal'; fi
igi@gentoo ~ $ if [ $var = "abc" ];then echo 'equal'; fi
bash: [: =: unary operator expected
igi@gentoo ~ $ dvar='a b c'
igi@gentoo ~ $ if [ $dvar = "a b c" ];then echo 'equal'; fi
bash: [: too many arguments
igi@gentoo ~ $ if [ "$dvar" = "a b c" ];then echo 'equal'; fi
equal
二重引用符は簡単に省略しないでください。よく分かりましたよね?まだ分からないなら、
Bash引用符の件を読んでください
最後に、パイプの両側の可否のスペースについては、言い逃れをしませんでした。