答え1
var=value
主要なUnixシェルファミリだけを見ると、Bourneのようなシェルからのスカラー変数の割り当て、rcのようなシェルからの変数の割り当て(すべての変数はリストであり、ここでは1つの値のみを持つリスト)、fishとvar=value
cshに似たシェルでコマンドを実行します(詳細銀シェルスクリプトの変数代入のスペース)。
このような割り当てでは、変数の値を数値として扱うには、数値または算術式が予想されるコンテキストでそれを使用する必要があります$var
(またはKornなどのシェルで実行することもあります)。var
たとえば(すべてのシェルに適用されるわけではありません)
arr[var]=foo
printf '%g\n' "$var"
printf '%d\n' var
(( var++ ))
echo "$(( var ))"
[[ var -gt 2 ]]
shift var
echo "$var + 1" | bc
export var; awk '{print ENVIRON["var"] + 1}'
ksh
、bash
およびを含むKornなどのシェルでzsh
変数がtypeset -i var
、または同じ、または-E
、または、-F
または-X
(bash / pdkshには浮動小数点変数がない)とinteger var
宣言されている場合、代入時に数値として解釈されます。float var
192.168.0.40
ただし、すべてのデフォルトまたはロケールで有効な整数または浮動小数点数ではありません。192.168
はさまざまな状況で有効な浮動小数点数であり、1000単位の区切り文字を持つロケールでは有効な整数にすることができます.
。
192.168.123.123
192168123123
(各グループは最初の数字を除いて常に3桁です。)これは千単位の区切り記号と同じロケールであるため、数字を予想してロケールの千単位の区切り文字を受け入れる.
コンテキストで許可されます。
ksh93の算術式がそのような場合であることだけを知っています。たとえば、
$ LC_ALL=it_IT.UTF-8 var=192.168.123.123 ksh93 -c 'printf "%e\n" var'
1,921681e+11
$ LC_ALL=it_IT.UTF-8 ksh93 -c 'echo "$((192.168.123.123 * 2))"'
384336246246
$ LC_ALL=it_IT.UTF-8 ksh -c 'integer var; var=192.168.123.123; echo "$var"'
192168123123
イタリア語のロケールでは、カンマは小数基数文字で、ピリオドは千単位の区切り記号です。
しかし、とにかく、上記のすべての場合のように、変数の内容を数値として解釈するように明示的に要求しない限り、数値として解釈されません。そのエディタの構文の強調表示は次のとおりです。誤解を招く事があります。シェルは主に文字列引数リストであるコマンドの実行ツールなので、デフォルトではシェル変数には通常文字列または文字列リストのみが含まれ、シェルで実行されるコマンドはこれらの文字列を数値、ファイル名、ユーザー名、IPアドレス、または必要なもの。
execve()
1システムコールを介して実行されるシーケンスの場合、2番目のargv[]
引数はC(NULで区切られた)文字列へのポインタ配列であるため、0以外のゼロバイト以上のシーケンスがあります。
答え2
BashとDashだけをインストールしました。
与えられたコンテキストでは、これらの変数に型が割り当てられているかどうかを判断することはできませんが、次のようになります。
bash-5.2$ declare -i n
bash-5.2$ n=192.168.0.40
bash: 192.168.0.40: syntax error: invalid arithmetic operator (error token is ".168.0.40")