私はこのサイトでWeb検索と検索を試しましたが、bashの文字列にスペースを使用することに関連する問題だけが見つかりました。しかし、正しい使い方(必須事項とその逆)をよりよく覚えるために、bashスクリプトでスペースを使用する一般的なロジックを理解したいと思います。
いくつかの例:強制[ $i == b ]
、反対var1="foo"
ベストアンサー1
しかし、Bashスクリプトでスペースを使用する一般的なロジックを理解したいと思います。
コマンド引数とコマンドを区切るときはスペースを使用する必要があります。キーワード(またはソースに応じて予約語)。これらは{
、、、、、、、、、などです。}
!
if
for
do
done
周囲のスペースは必須ではありません。オペレーター。これは少なくともステートメントターミネーター;
と&
;すべてのリダイレクト演算子&&
と括弧とです。リダイレクト演算子の前のオプションのファイル記述子番号はスペースで区切ることはできませんが、演算子の周りの余分なスペースは通常重要ではありません。||
>
<<
(
)
したがって、以下はすべて良いです。
true;true
cat<<file
true&&false
tac|rev
f()(echo foo)
これらは以下ではありません:
if !somecmd; then ...
f(){echo foo}
最初は、コマンドを!somecmd
実行するのではなく、コマンドを検索してsomecmd
終了状態を反転します。 2番目は、キーワード '{'と '{'が}
別々の単語でなければならず、コマンドの先頭でのみ認識されるため、機能しません。f(){ echo foo;}
例えば
if
コースをステートメントとして使用できない場合は、単語の先頭から選択すると、呼び出されif
たプログラムを使用するのが難しくなります。ifconfig
ifsomecmd;then ...
(Fortranに慣れていない場合は、これは明らかです。)
それでは、これが(
演算子では{
なく演算子であるかどうかはどうすればわかりますか?暗記学習で学習します。これらの違いは、多くの場合と同様に、歴史的な理由による可能性があります。望むより:POSIX Shell Grammarの中括弧コマンドグループで開く中括弧の後にスペースが必要なのはなぜですか?
これらの質問に対する回答には、参照とともに演算子とキーワードに関する詳細な議論があるので、読んでください。
しかし、上記のいずれも、課題と試験foo=bar
の違いを区別するのに実際には役に立ちません[ "$foo" = bar ]
。
ここで重要なのは、[
通常のコマンドと同様に、演算子とオペランドを別の引数として使用し、実際に内部を見ていないことです。ls -l /somedirectory
引数(-l
および/somedirectory
)を区切るために空白が必要な場合と同様です[
。この括弧のペアはシェル構文の一部ではありません(または構文)とis notは、ほとんど=
の実際のプログラミング言語の対応する構文とは異なります。
ミッションの場合は少しトリッキーです。割り当てはコマンドラインに単独で表示される必要はなく(コマンドで使用できます)、1行に複数の割り当てがあります。このように:
$ foobar=123 foofoo=456 env|grep foo
foofoo=456
foobar=123
おおまかに動作する方法は、シェルがコマンドを単語(上記の単語は、およびfoobar=123
)foofoo=456
にenv
分割し、最初の単語を調べて割り当てのように見えることを確認することです。両方とも、ここには割り当てがなく、一般的なパラメータのみがありますecho
。
$ echo foo=bar
foo=bar
この点でシェル構文が異なる可能性があると思いますが、2つの割り当てがあり、引数のないコマンドがある場合は、次のようなものをサポートすると奇妙に見えます(もちろんLuaに慣れていない場合)。
foobar = 123 foofoo = 456 env