在我的脚本中,我需要获取0
<=9 的数字。当用户输入任何数字时,我会在其中添加 5,如果结果小于 9,我需要打印 0 以获得 2 位数字(例如 07,08,09 等)。
我为此编写了一个函数,但脚本不断返回相同的数字“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,您将发送一个空行,它只是一个\n
字符),因此它将将该脚本应用于该输入。在这里,您告诉它0$Hora
在行的开头添加 a,这就是它的作用。
您的代码中还存在其他问题。一方面,您不需要做return()
任何事情,因为您正在处理全局变量。事实上,您甚至不需要sed
在这里,您可以简单地在 shell 本身中连接。这是脚本的工作版本:
## 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 中测试变量是否为数字?