linux 当用户使用Bash的“read”实用程序提示键入文本时,我如何向用户输入添加格式化标点?

6za6bjd0  于 2022-11-02  发布在  Linux
关注(0)|答案(2)|浏览(145)

我有以下几行提示用户输入日期/时间,我将在脚本的后面部分使用这些行:

printf "Please insert start of time window in format YYYY-MM-DD HH:MM:SS: \n"
read startDatetime

有没有办法在用户键入时,在日期的破折号、日期和时间之间的空格以及时间的冒号中动态地插入“read”提示符?我知道在Web上使用JavaScript是可以做到这一点的,但我特别希望能有一个命令行版本的该功能。
我在网上搜索了这个问题的答案,但没有找到。我在read Man Page中看到了delimiter的选项,但看不到它将如何实现我正在尝试做的事情。

q8l4jmvw

q8l4jmvw1#

您可以使用read-N标志限制一次读取的字符数,从而将其拼凑在一起:

echo "Please enter start time in YYYY-MM-DD HH:MM:SS format"
read -rN4 year
printf '-'
read -rN2 month
printf '-'
read -rN2 day
printf ' '
read -rN2 hour
printf ':'
read -rN2 minute
printf ':'
read -rN2 second
echo

printf -v datetime '%s-%s-%s %s:%s:%s' \
    "$year" "$month" "$day" "$hour" "$minute" "$second"

echo "You entered $datetime"

看起来像这样:

或者,使用将光标移回自动添加的-、空白和:的选项:我们可以使用tput来移动光标,清除该行,然后使用read -e(使用readline进行输入)和-i(预填充提示):

moveup=$(tput cuu1)
clearln=$(tput el)

echo "Please enter start time in YYYY-MM-DD HH:MM:SS format"
read -rN4 datetime
printf '%b' '\r' "$clearln"
read -erN7 -i "$datetime-" datetime
printf '%b' '\r' "$moveup" "$clearln"
read -erN10 -i "$datetime-" datetime
printf '%b' '\r' "$moveup" "$clearln"
read -erN13 -i "$datetime " datetime
printf '%b' '\r' "$moveup" "$clearln"
read -erN16 -i "$datetime:" datetime
printf '%b' '\r' "$moveup" "$clearln"
read -erN19 -i "$datetime:" datetime

echo "You entered $datetime"

这也不是完美的:额外的字符只插入一次,但不是当你回去修复的东西;并且在提示符后插入了一个新行,导致出现一个空行,这在终端仿真器的底部是显而易见的:

此时,您可以考虑使用charmbracelet/gum之类的工具,以便在终端上获得非常用户友好的交互式输入体验。

mnowg1ta

mnowg1ta2#

不,这是不可能的。但是请注意,read提供了-p开关:

read -p "Please insert start of time window in format YYYY-MM-DD HH:MM:SS: \n" startDatetime

相关问题