0
私のスクリプトでは<= 9という数字を取得する必要があります。ユーザーが数字を入力すると、その数字に5を加算し、結果が9未満の場合、07、08、09などの2桁の数字を取得するには0を印刷する必要があります。
これに関数を書いていますが、スクリプトは同じ数字「0?」を返し続けます。
私のスクリプト:
echo "Hora: "
read hora
Hora=$((hora+05))
Change () {
if [ $Hora -le 9 ]; then sed -e 's/^/0'$Hora'/'; return $Hora; fi
}
Change
echo -e "$Hora"
出力:
~$ bash test.sh
Hora:
4
09
09
09
09
09
答え1
スクリプトには多くの問題がありますが、最大の問題は、sed
コマンドに入力を提供しないことです。実行すると、sed 's/foo/bar/'
入力sed
が期待されます。標準入力そしてクリックするたびに実行され続けますEnter。ユーザーから入力を受け取らずに改行文字(クリックすると空白行が送信され、Enterこれは1\n
文字のみ)を受け取るため、その入力にスクリプトを適用します。ここで行の先頭にaを追加するように指示すると、0$Hora
それが行われます。
コードに他の問題があります。一方では、return()
グローバル変数を扱うので、何もする必要はありません。実際、sed
ここではそれは必要ではなく、単にシェル自体に接続することができます。以下はスクリプトの作業バージョンです。
## It is good practice to have the functions at the beginning
## of your script.
Change () {
if [ $Hora -le 9 ]; then
Hora="0$Hora"
fi
}
echo "Hora: "
read hora
Hora=$((hora+05))
Change
printf ":$Hora"
示されている単純なケースでは、関数を使用することは意味がありません。関数はしばしば、スクリプトの複数のポイントでタスクを複数回繰り返すために使用されます。0
数字が10未満のときにaを印刷するだけでよい場合は、printf
以下を単独で使用できます。
printf "Hora: "
read Hora
printf '%0.2d' "$Hora"
最後に、ユーザーが有効な入力を提供することを確認するためにいくつかのテストを追加することを検討することもできます。バラよりBashで変数が数値であるかどうかをテストする方法は?