2017-01-19 7 views
3
1 #!/bin/bash 
    2 
    3 declare -r NUM1=5 
    4 NUM2 =4 
    5 
    6 num3=$((NUM1 + NUM2)) 
    7 num4=$((NUM1 - NUM2)) 
    8 num5=$((NUM1 * NUM2)) 
    9 num6=$((NUM1/NUM2)) 
10 
11 echo "$num3" 
12 echo $((5**2)) 
13 echo $((5%4)) 
14 

Iamはこのbashスクリプトを使用し、IAMながら、私はエラー変数割り当て間のスペースがなぜBashでエラーになるのですか?

./bash_help 
./bash_help: line 4: NUM2: command not found 
./bash_help: line 9: NUM1/NUM2: division by 0 (error token is "NUM2") 
5 
25 
1 

ので、私はこれにコードを変更してしまったと、エラーがなくなってスクリプトを実行しています。

 1 #!/bin/bash 
     2 
     3 declare -r NUM1=5 
     4 NUM2=4 
     5 
     6 num3=$((NUM1 + NUM2)) 
     7 num4=$((NUM1 - NUM2)) 
     8 num5=$((NUM1 * NUM2)) 
     9 num6=$((NUM1/NUM2)) 
    10 
    11 echo "$num3" 
    12 echo $((5**2)) 
    13 echo $((5%4)) 
    14 

我々は変数に値を代入しながら、code.Can誰が私これを説明するの可視性をより良く理解するためのスペースを与えるために慣例であるので、我々は、スペースを与えるのはなぜカント?

任意の提案や明確化を歓迎している...

+1

「bash」のパラダイムのほんの1つですが、それは疑問です。 – Inian

+2

シェルでは、スペースは重要な区切り文字です。ほとんどの場合、コマンドラインの意味が変わるため、**の追加や削除はできません。 –

+0

ありがとう、それは小さなissue.clarityエラーが少ないですが。 –

答えて

6

これはbashで大会(または、より一般的には、POSIXファミリーシェル)ではありません。

「なぜ」と言えば、さまざまなやり方で間違っていることはすべて、有効な意味をコマンドとして持つからです。 NUM2 = 4を代入すると、引用符なしで=を文字引数として渡すことができませんでした。 したがって、このような変更は、未定義のスペース(POSIX sh標準への拡張がその標準の違反を構成しないようにする必要がある)に置かれるのではなく、後方互換性のないになります。

NUM2= 4 # runs "4" as a command, with the environment variable NUM2 set to an empty string 
NUM2 =4 # runs "NUM2" as a command, with "=4" as its argument 
NUM2 = 4 # runs "NUM2" as a command, with "=" as its first argument, and "4" as another 
+0

"NUM2 = 4#は" NUM3 "を実行しますか? – some

3

bashでは、関数は引数を空白で区切られた単語として渡します。ドキュメントから

「各演算子とオペランドは別々の引数でなければなりません。」

変数割り当てが異なっており、bashのコマンドとしてこれを解釈するので、あなたが等号の周りに引用符で囲まれていない空白を置くことができない理由があるname=[value]

この構文を使用しています。

2

理由は、単純に、シェルがこのように動作するように構築されているからです。他のプログラミング言語で経験を積んだ人にとっては意味がないかもしれません(ある意味ではシェル構文を "言語"と呼びます)。

シェルスクリプトを使用すると、多くの場合、単純に文字列を引用しないようにすることができます(1つの文字列に一連の文字にスペースや特殊文字が含まれていない限り)。これのおかげで、あなたが書くことができます。その代わり、ほとんどの言語で

"my_command" "-n" "-X" "arg1" "arg2" 

(架空の疑似コードのいくつかの種類で)、それは他の方法で回避されの

my_command -n -X arg1 arg2 

を:リテラル文字列が引用され、そのシェルスクリプトで$のような特殊文字を使用せずに変数を使用するための "構文スペース"を解放します。

シェル構文では、他の処理を行うときに、頻繁に、便利に、利便性が低く、読みやすくなります。それは呪いと祝福の両方です。いいことは、対話型のシェルを持っているなら、ある種の(おそらく美味しくない)プログラムを処理するインタプリタを100%確実に持つことができるということです。その普遍的な入手可能性(さまざまな味が存在しているにもかかわらず)のため、シェルは学習に値する価値があるほど充分なプラットフォームの一種です。

関連する問題