我在 CentOs 中编写了一个 bash 脚本,但现在我在 FreeBSD 中遇到了这个脚本的问题。
所以问题在于“读“Linux 中的函数和”读FreeBSD 中的“函数。
这是我的脚本的一部分:
Tmp="an_num.tmp"
Tmpg=$(cat $Tmp)
Tmpi=$(expr $Tmpg + 1)
printf "${WONWARN} Please enter a number ${NORMAL} %s"
read -i "$Tmpi" -e Number; echo
echo "$Number" > "$Tmp"
这里我从 an_num.tmp 中得到一个数字(该文件始终只包含一个数字)。
然后我增加这个数字并将其放入 Tmpi 变量中。
之后,我使用带有预填充的读取函数(它预填充 Tmpi 变量),用户可以输入新值或接受此增量值。
男人读来自 CentOS:
-i text 如果使用 readline 来读取行文本,则在编辑开始之前将其放入编辑缓冲区中。
但 ”读” 在 FreeBSD 中没有相同的-我钥匙。
如何在 FreeBSD 操作系统中使用预填充?谢谢。
$ uname -a FreeBSD srv 11.0-RELEASE-p1 FreeBSD 11.0-RELEASE-p1 #0 r306420:2016 年 9 月 29 日星期四 01:43:23 UTC [电子邮件受保护]:/usr/obj/usr/src/sys/GENERIC amd64
答案1
如果脚本在两台计算机上执行bash
,则不会有问题(至少在安装的 shell 版本都支持脚本可能使用的read -i
任何其他特定功能的情况下不会出现问题)。bash
确保脚本有一个正确的#!
-line 指向bash
每个系统上的可执行文件。
关于代码的注释:
Tmp="an_num.tmp"
Tmpg=$(cat $Tmp) # may be replaced with Tmpg=$(<"$Tmp")
Tmpi=$(expr $Tmpg + 1) # may be replaced with Tmpi=$(( Tmpg + 1 ))
printf "${WONWARN} Please enter a number ${NORMAL} %s"
# The above lacks a value for the %s format string
read -i "$Tmpi" -e Number; echo
echo "$Number" > "$Tmp"
替代实现(仍然bash
是特定的,但适用于旧版本,因为它避免了read -i
,并且它验证从用户读取的值实际上是数字/十进制整数):
tmp_fname="an_num.tmp"
read num <"$tmp_fname"
num=$(( num + 1 ))
read -p 'Enter number: '
if [[ -n "$REPLY" ]] && [[ "$REPLY" =~ ^[0-9]*$ ]]; then
num=$REPLY
fi
echo "$num" >"$tmp_fname"