時には数学演算を実行する必要がある場合もあります。bc
またはを使用できることを知っていますecho $(( 6/2 ))
。bc
入力を読み取る関数を直接作成しました。しかし、時には入力に時間がかかります_bc "6/2"
。だから私はこのような質問を持っています:
コマンドラインで数値に対して数学を実行する方法をzsh / bashに教える方法はありますか? 1つの例は1000の言葉と同じくらい価値があります。
$ 6/2
$ 3.0
つまり、zsh / bashは数字を認識して呼び出す必要があることを意味します。紀元前。
ベストアンサー1
ショートカットAlt- c(bash)
bashでは、readlineユーティリティを使用して単語を先頭calc
に置き、これまでに作成されたテキストを二重引用符で囲むキーシーケンスを定義できます。
bind '"\ec": "\C-acalc \"\e[F\""'
23 + 46 * 89
実行後にたとえば、次のようにするには、次のようにAlt入力cします。
calc "23 + 46 * 89"
Enterキーを押すと、数学演算はcalcで定義された関数によって実行されます。これは簡単かもしれず、はるかに複雑かもしれません。
calc () { <<<"$*" bc -l; }
(+) エイリアス
エイリアスを定義できます。
alias +='calc #'
これにより、これまで入力したコマンドライン全体がコメントアウトされます。次のように入力します。
+ (56 * 23 + 26) / 17
Enter キーを押すと、対応する行が翻訳され、calc #(56 * 23 + 26) / 17
コマンドが呼び出されます。calc
calcがこの関数の場合:
calc(){ s=$(HISTTIMEFORMAT='' history 1); # recover last command line.
s=${s#*[ ]}; # remove initial spaces.
s=${s#*[0-9]}; # remove history line number.
s=${s#*[ ]+}; # remove more spaces.
eval 'bc -l <<<"'"$s"'"'; # calculate the line.
}
calc(){ s=$(history -1 | # last command(s)
sed '$!d;s/^[ \t]*[0-9]*[ \t]*+ //'); # clean it up
# (assume one line commads)
eval 'bc -l <<<"'"$s"'"'; # Do the math.
}
扱いにくい+
zshはエイリアスや文字を受け入れません#
。
値は次のように印刷されます。
$ + (56 * 23 + 26) / 17
77.29411764705882352941
文字列として引用されたaのみが必須であり+
(ワイルドカードなし)、シェル変数を受け入れます。
$ a=23
$ + (56 * 23 + $a) / 17
77.11764705882352941176
(+)機能
いくつかの制限があるので、以下は(bashで)関数を使用してあなたの要求に最も近いものです。
+() { bc -l <<< "$*"; }
次のように動作します。
$ + 25+68+8/24
93.33333333333333333333
問題は、シェルの解析を回避する方法がなく、a *
(たとえば)をpwdのファイルリストに拡張できることです。
空白なしでコマンドラインを作成すると、おそらく大丈夫でしょう。
このような内容は$(...)
拡張されますので、書かないようにご注意ください。
安全な解決策は、評価する文字列を引用することです。
$ + '45 + (58+3 * l(23))/7'
54.62949752111249272462
$ + '4 * a(1) * 2'
6.28318530717958647688
それだけ二つ文字はあなたより短いですが、私_bc "6/2"
にとって+
は、aはより直感的なようです。