Bashスクリプトで変数の割り当てが機能しません。

Bashスクリプトで変数の割り当てが機能しません。

問題があり、シェルスクリプトを使用してプログラムを書く必要があるので、Linuxに関する本を開いてBashスクリプトの章がありました。コマンドに出会ったときにコマンドをテストするためのテストスクリプトを書くのは良い考えのようですが、最初のスクリプトはうまくいきませんでした。

例に示すスクリプトは次のとおりです。

#!/bin/bash
count=10
nextcount=$count + 1
echo $count
echo $nextcount

このスクリプトを実行した結果は何ですか?

[Carl@localhost bin]$ testscript
10
11

しかし、実際の結果は

[Carl@localhost bin]$ testscript
/home/Carl/bin/testscript: line 3: +: command not found
10

エラーメッセージは、「+」記号がプラス演算子ではなくコマンドとして解釈されることを示します。

「+」記号の周囲のスペースを削除すると、スクリプトは次のようになります。

#!/bin/bash
count=10
nextcount=$count+1
echo $count
echo $nextcount

[Carl@localhost bin]$ testscript
10
10+1

11を得るために10に1を加える代わりに、3行のステートメントは「10」、「+」、および「1」を連結します。

line3を読むように変更したり、nextcount=$count +1何のnextcount=$count+ 1効果もありません。

スクリプト教科書の最初の例では、解決できない問題を見つけることは起こりません。私が狂っていますか?

答え1

いつものように、シェルから割り当てます。確かにスペースを許可します(参照:シェルスクリプトの変数代入のスペースvar=foo bar):コマンドを実行してbar設定varするのと同じですfoo。あるいは、あなたの場合、コマンドはシェルに特別な意味がないので、+大丈夫です(とにかくこの場合ではありません)。+また、プラス記号は通常の文字なので、var=1+1右側を文字列として扱います。1+1特別な意味(例えば、、;または()がある場合は引用する必要があります。

シェルで算術を実行する標準的な方法は拡張であるため、$(( ... ))数値を追加して変数に割り当てるには、次のようにします。

anothervar=$((var + 1))

Bash/ksh/zsh を使用していて、一定の繰り返し回数だけ繰り返す場合は、次を使用できます。

for (( i = 0; i < 10 ; i++)); do something ; done

for i in {1..10}また、可能ですが、Bashでは中括弧拡張の内部では変数拡張は機能しません。)

答え2

算術式構文を使用して数学演算を実行します。

count=10
(( nextcount = count + 1 ))

答え3

次のコマンドを使用して、表示されているものと同様の操作を実行できますdeclare -i

declare -i nextcount
nextcount=$count+1

変数宣言nextcount整数属性を持つ変数を宣言します。算術評価割り当てられるたびに自動的に実行されます。 (help declarebashで実行するか、ねえもっと学ぶ。 )これは標準のPOSIXシェル機能ではありませんが、bashはそれをサポートしています。

declareこのタスクにはコマンドをすぐに実行する必要はありません。その場合は、declare次のコマンドで実行することをお勧めします。

declare -i nextcount=$count+1

整数の合計を含むすべての算術式算術演算子サポートされます。演算子がシェルで異なる方法で解釈されるリスクがある場合は、これを防ぐために式を引用することができます。変数にテキストを割り当てることを覚えておいてください。そのテキストの算術評価を実行してください。別の例として、このコマンドは次の$xように拡張されます13

declare -i x='2 * 7 - 1'

スペースを削除しても引用したいと思います。*そうしないと、次のように解釈される可能性があります。全体的な状況、トリガーファイル名拡張子。それでも周囲のスペースはありません=

ただし、通常はこれを行わないことがあります。一般的に使いやすく、エレガントで読みやすいです。算術拡張(と共に$)または算術評価(いいえ$)逆に、他の答えからわかるように。私はあなたがそれを好むように奨励するためにここに示された方法を取り出したのではなく、主にあなたの本に示されているように実際にシェル算術を実行するのに最も近いからです。

算術式 - シェル算術を使用して評価される式を意味します。これは$(( ))or内にあるため、(( ))周囲に=スペースを使用できます。構文的には、=コマンド内では((count = 10))コマンド内とは異なる動作をします。=count=10


x整数属性()がある場合は、次のdeclare -i xようなコードを作成して複数の変数に値を割り当てることもできますが、混乱しているのでお勧めしません。

x=y=z=10

それが何であるか疑問に思うなら、ここにヒントがあります。同じことをします:

x='y = z = 10'

これにより、文字列y = z = 10(または最初の例ではy=z=10)がに割り当てられますx。少なくともx整数属性を持つことが重要です。このような場合であると仮定すると、テキストは算術式として評価されます。サブ式はにz = 10割り当てられますが、そのサブ式にはに割り当てられる値もあります。それ10z10yいっぱい式は、ystill値を持つペアの割り当てです10

最初のものは=一般的なシェル変数の割り当てを実行し、他のものは算術割り当て演算子です。これはいいえ2番目の形式は特別です(参照としてスペースを含めることができます)。のx=y=z=10最初のesは同じ目標を達成するために使用されますが、他の2つとは異なる意味を=持ちます。=これは混乱する可能性があります。実験的な目的のためにインタラクティブに書かれていない限り、このような内容を書かないことをお勧めします。代わりに、次のコマンドを作成できます。

((x = y = z = 10))

これは簡単な算術評価です。 3 つの記号はすべて=算術代入演算子です。変数の一部または全部を整数属性(私が頻繁に主張する方法)として宣言しても問題はありませんが、必要はありません。


同様に、bashには+=通常テキストを追加する演算子があります。

$ x=foo
$ x+=bar
$ echo "$x"
foobar

(一部の行の先頭文字$はプロンプトです。bashに提供する入力と生成される出力を区別するためにここに含めます。)

ただし、変数に割り当てられた属性は+=実行される操作に影響します。+=通常、インデックス配列を拡張するために使用されます。

$ a=(foo bar baz)
$ a+=(quux)
$ echo "${a[@]}"
foo bar baz quux

整数属性を持つ変数がwithに割り当てられると、+=内部追加が行われます。

$ declare -i y=7
$ y+=2
$ echo "$y"
9

+=ただし、Bashには算術演算子もあるため、ほとんどの場合使用をお勧めします。つまり、y値を保存すると、2次のように作成して値を2ずつ増やすことができますy

((y += 2))

また、他の従来の複合割り当て演算子(Cに存在する演算子)もあります。たとえば、私が欲しいとしましょう。減らすyに3を掛けます。これはうまくいきません:

$ y-=3
y-=3: command not found

しかし、これはうまくいきます:

$ ((y -= 3))
$ echo "$y"
6

yまたは、新しい値を変更して印刷してこれを行うこともできます。

$ echo "$((y -= 3))"
6

関連情報