どのシェルでも小数点を持つ文字列を数値(int、float)として解釈できますか?

どのシェルでも小数点を持つ文字列を数値(int、float)として解釈できますか?

このアイデアは最近、Visual Studio Codeの更新中に私に登場しました。ここでは通常、コードを自動的にシェルチェックすることもあります。これは私ですバラより、次のようなアイデアを得ることができます。

ここに画像の説明を入力してください。

多くのシェルでテストできる人にとって、この質問は本当に簡単です。私はBashとDashだけをインストールしました。

どのシェルでも小数点を持つ文字列を数値(int、float)として解釈できますか?

時間をいただきありがとうございます。

答え1

var=value

主要なUnixシェルファミリだけを見ると、Bourneのようなシェルからのスカラー変数の割り当て、rcのようなシェルからの変数の割り当て(すべての変数はリストであり、ここでは1つの値のみを持つリスト)、fishとvar=valuecshに似たシェルでコマンドを実行します(詳細銀シェルスクリプトの変数代入のスペース)。

このような割り当てでは、変数の値を数値として扱うには、数値または算術式が予想されるコンテキストでそれを使用する必要があります$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}'

kshbashおよびを含むKornなどのシェルでzsh変数がtypeset -i var、または同じ、または-E、または、-Fまたは-X(bash / pdkshには浮動小数点変数がない)とinteger var宣言されている場合、代入時に数値として解釈されます。float var

192.168.0.40ただし、すべてのデフォルトまたはロケールで有効な整数または浮動小数点数ではありません。192.168はさまざまな状況で有効な浮動小数点数であり、1000単位の区切り文字を持つロケールでは有効な整数にすることができます.

192.168.123.123192168123123(各グループは最初の数字を除いて常に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")

関連情報