ホームページ  >  記事  >  php教程  >  シェル プログラミング: Bash スペースに関するもの

シェル プログラミング: Bash スペースに関するもの

高洛峰
高洛峰オリジナル
2016-11-23 12:57:281193ブラウズ

まず、bash でスペースを使用する場合と使用しない場合を理解します。

1. 等号の割り当ての両側にスペースを入れることはできません

2. コマンドとオプションの間にはスペースが必要です

3. パイプの両側のスペースはオプションです

よくある問題を見てみましょう

1. 値を割り当てるときの等号 両側または左側にのみ余分なスペースがあります
test@pythontab.com ~ $ var1 = test
bash: var1: command not found
test@pythontab.com ~ $ echo ${ var1:?error}
bash: var1: error
test @pythontab.com ~ $ echo ${var1?error}
bash: var1: error
test@pythontab.com ~ $ var2 =test
bash: var2: コマンドではありませんfound
test@pythontab.com ~ $ echo ${var2 :?error}
bash: var2: error
test@pythontab.com ~ $ echo ${var2?error}
bash: var2: error

ここでは bash を使用しました変数展開、${var1:?error} の場合 var1 が未設定または null (未定義または空) の場合は、指定されたエラーが報告されます。 ${var1?error} var1 が未設定の場合は、指定されたエラーが報告されます。実行結果から見て、等号の左側にスペースがある場合は変数名がコマンドとして実行され、結果はcommand not foundとなり、変数は代入されません。 , 等号の左側にはスペースがありませんが、右側にはスペースがあります (この状況は少し、特に 2 つの状況が見つかります)
test@pythontab.com ~ $ var= test
test@pythontab.com ~ $ var= nocmd
bash: nocmd: command not found

1 つのコマンドではエラーが報告されませんでしたが、2 番目のコマンドではエラーが報告されました。

これは、シェルでコマンドを実行する次のような方法があるためです: var=string command

コマンド command は変数 var の値を取得します (コマンド実行後に変数 var の値が保持されるかどうかについては)実行しても bash4 には保持されませんが、ダッシュで見つけたときは保持しておきました。test はコマンドであり nocmd ではないため、コマンドが見つからないことを報告しました。
test@pythontab.com ~ $ var=newtest eval echo $var
newtest
test@pythontab.com ~ $ echo $var

注: ここで eval を使用したのは、最初の解析中に $var が空の文字列に置き換えられるのを避けるためです。そうしないと、次の状況が発生します。 (以下は間違ったテスト方法です。echo実行前に$varが空の文字列に置き換えられています)

コードは以下の通りです:
test@pythontab.com ~ $ var=newtest echo $var
test@pythontab .com ~ $ echo $var

この時点で、等号の代入では左側と右側にスペースを入れることはできないことは誰もが理解していると思いますが、右側にスペースがあると必ずしもエラーが発生するわけではありません。あなたが望む結果。

3. コマンドとオプションの間にはスペースが必要です

これは誰もが理解しているようですが、なぜ私はまだこんなに冗長なのでしょうか?そういえば、非常に特別なコマンドについて触れなければなりません: [ コマンド (正しく読みます、[ ) です。これはテスト コマンドです (もちろん bash では、これは組み込みコマンドですが、影響はありません)私たちの理解はここにあります))。おそらく、[コマンドに見覚えがあると思われるでしょう。はい、見たことがあるはずです。次の例を見てください
test@pythontab.com ~ $ if [ "abc" = "abc" ];は同じです '; fi
それらは同じです
test@pythontab.com ~ $ type -a [
[はシェル組み込みです
[は/usr/bin/[

覚えていますか? [コマンドは if 判定でよく使用されます。もちろん、次のように記述することを好む人もいます
test@pythontab.com ~ $ [ "abc" = "cba" ] || 'それらは同じではありません' || 彼らは同じです同じではありません
test @pythontab.com ~ $ type -a [
[ はシェル組み込みです
[ は /usr/bin/[

[ このコマンドは test コマンドと呼ばれます。なぜ同じではないのですか。まったく同じ?これを見てみましょう
test@pythontab.com ~ $ [ "abc" = "cba"
bash: [: missing `]'
test@pythontab.com ~ $ [ "abc" = "cba" ]
test @pythontab .com ~ $test "abc" = "cba" ]
bash: test: 引数が多すぎます
test@pythontab.com ~ $test "abc" = "cba"

[コマンド,末尾を付ける必要があります]、test コマンドを使用する場合、末尾を追加することはできません。 Tail] は [コマンドの終わりを表す最後のパラメータであり、必須のパラメータです

ここまでお話してきましたが、これとスペースはどう関係するのでしょうか?皆さんに理解していただくために、最初にこれを言っておきます: [これはシェル内のコマンドであり、前後にスペースが必要です。 ] は [ の最後の必須パラメータであり、両側にスペースも必要です (ps など一部のコマンドのパラメータは接続できますが、[ コマンドは接続できません。パラメータ間にスペースが必要です)。 [よくある間違い

a. if と [
test@pythontab.com ~ $ if[ "$HOME" = "/home/igi"];then echo 'equal'
bash: 構文を見てみましょう。予期しないトークン `then' 付近のエラー
test@pythontab.com ~ $ if[ "$HOME" = "/home/igi" ];then echo 'equal'; fi
bash: 予期しないトークン ` then'
test 付近の構文エラー@pythontab.com ~ $ if["$HOME" = "/home/igi"];then echo 'equal'; fi
bash: 予期しないトークン `then' 付近の構文エラー
test@pythontab.com ~ $ if[" $HOME" = "/home/igi" ];then echo 'equal'; fi
bash: 予期しないトークン `then' 付近で構文エラーが発生しました

明らかに、構文解析エラーです。 if[ bash の場合、それが一体何なのかわかりません

b. [ と次のパラメータの間にスペースがありません
test@pythontab.com ~ $ if ["$HOME " = "/ home/igi" ];then echo 'equal'; fi
bash: [/home/igi: そのようなファイルまたはディレクトリはありません
test@pythontab.com ~ $ if ["$HOME" = "/home/ igi"]; then echo 'equal'; fi
bash: [/home/igi: そのようなファイルやディレクトリはありません

["$HOME" bash については、一体何なのかわかりません

c. [ ] 間のパラメータ
test@pythontab.com ~ $ if [ "abc"="abc" ] then echo 'equal'; fi
equal
test@pythontab.com ~ $ if [ "abc"=" cba" ] ; then echo 'equal'; fi
equal

最初のコマンドは正しいようです (実際には単なる偶然です)。2 番目のコマンドを見ると、「abc」と「cba」は明らかに異なりますが、それらは異なります。同一であると判断されます。これは、パラメータ間にスペースが不足しており、[コマンドは内部値を単なる値とみなしているためです。次のコマンドを見てください。安心します
test@pythontab.com ~ $ if [ 0 ]; then echo 'equal'; fi
equal
test@pythontab.com ~ $ if [ "1" ]; echo ' 等しい'; fi
equal
test@pythontab.com ~ $ if [ "" ]; then echo 'equal'; in [ ] 内部的には、空の文字列ではない値が 1 つだけある場合 (欠落したスペースで連結された値もカウントされます)、true になります。したがって、[ ] の間のパラメータも両側にスペースが必要であり、積み重ねることはできません

d パラメータとテールの間にスペースがありません

これは冗長ではありません、テール] も [ のパラメータです。前述したように、パラメーターの間にはスペースが必要です

[コマンドとスペース] についてはここまでですが、もちろん、これは運が良ければ正しく実行できる場合もありますので、見てみましょう
。 @pythontab.com ~ $ var='abc'
test@pythontab.com ~ $ if [$var = "abc" ];then echo 'equal'; fi
equal
test@pythontab.com ~ $ if ["$ var" = "abc" ];then echo 'equal'; fi
bash: [ abc: command not found

全体を二重引用符で囲み、二重引用符がない場合は前後のスペースまたはタブ弦はカットされています。文字列の前後のスペースやタブを偶然見つけた場合、または意図的に破棄したい場合は、不可能ではありませんが、これを記述することは強くお勧めできません。コードは非常に脆弱になります。

または、追加する必要があるスペースをすべて追加したにもかかわらず、エラーが発生する場合もあります。これは、二重引用符の欠如に関連している可能性があります。この状況は非常に一般的です。最後に見てみましょう
test@pythontab.com ~ $ var=''
test@pythontab.com ~ $ if [ "$var" = "abc" ]; then echo 'equal' ; fi
test@pythontab.com ~ $ if [ $var = "abc" ]; then echo 'equal'; fi
bash: [: =: 単項演算子が期待されます
test@pythontab.com ~ $ dvar='a b c '
test @pythontab.com ~ $ if [ $dvar = "ab c" ];then echo 'equal'; fi
bash: [: 引数が多すぎます
test@pythontab.com ~ $ if [ "$dvar" = " a b c" ] ;then echo 'equal'; fi
equal

また冗長になりますが、二重引用符を安易に省略しないでください。明らかですか?それでも理解できない場合は、

最後に、パイプの両側のオプションのスペースについてはくだらない話はしません。これについて疑問を持っている人に会ったことがないからです。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。