#!/bin/bash
function thous {
numfmt --g $1 | sed 's/,/./g;s/@//g'
}
aa="1,235"
bb="5,22"
cc=$(echo "$aa + $bb" | bc)
#1
echo $aa
#2
echo $bb
#3
echo $(thous "$cc")
#4
echo "SKIP"
exit
何が見えるか
(standard_in) 1: parse error
(standard_in) 1: parse error
1,235
5,22
私が望むもの
(standard_in) 1: parse error
(standard_in) 1: parse error
1,235
5,22
(some error or nothing at all)
SKIP
このbashシェルコードをコンパイルしようとすると、#3に閉じ込められます。それでは、処理できないことを無視し、次のプロセスを続行するように端末にどのように指示しますか?
質問が不明な場合はお知らせください。ありがとうございます。
答え1
スクリプトが停止すると実際にnumfmt
入力を待っています。スクリプトCtrldをクリックすると続行されます。
numfmt
これは、オプションではなく引数が指定されず、空の$cc
場合、標準入力がフォーマットされているために発生します。
これらのブロックを防ぐ一般的な技術は、numfmt
ブロックを読み取ることです/dev/null
。
numfmt --g $1 < /dev/null | sed 's/,/./g;s/@//g'
バラより最初の反復後にこのwhileループが終了するのはなぜですか?この技術がどのように役立つかについての別の例です。
しかし、特定の状況に応じて、より良いアプローチは次のとおりです。変数参照;空でもnumfmt
常にパラメータがあります。$1
numfmt --g "$1" | sed 's/,/./g;s/@//g'
また、スクリプトでオプションの省略形を使用しないでください。--g
将来のバージョンのスクリプトで「g」で始まる別の長いオプションが導入されると、問題が発生する可能性があります。numfmt
これを行うときは、パラメータからオプションを分離する必要があります--
(そうでない場合はnumfmt
負の値は拒否されます)。
numfmt --grouping -- "$1" | sed 's/,/./g;s/@//g'
これにより、スクリプトが完了するまで中断することなく実行されます。計算を決定すると、$cc
期待される結果が同時に出力され、"$1"
バリアントが表示されます。
numfmt: invalid number: ‘’