如何在 FreeBSD 中使用“read -i”? (预填充用户输入)

如何在 FreeBSD 中使用“read -i”? (预填充用户输入)

我在 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"

相关内容