读取验证替代方案(两个提示和 if-then 比较替代方案)

读取验证替代方案(两个提示和 if-then 比较替代方案)

我正在尝试创建一个小脚本来创建简单的、全默认的 Apache 虚拟主机文件(每当我建立新的 Web 应用程序时都应该使用它)。

read在经过验证的操作中,此脚本提示我输入 Web 应用程序的 domain.tld 及其数据库凭据:

read -p "Have you created db credentials already?" yn
case $yn in
    [Yy]* ) break;;
    [Nn]* ) exit;;
    * ) echo "Please create db credentials and then comeback;";;
esac

read -p "Please enter the domain of your web application:" domain_1 && echo
read -p "Please enter the domain of your web application again:" domain_2 && echo
if [ "$domain_1" != "$domain_2" ]; then echo "Values unmatched. Please try again." && exit 2; fi

read -sp "Please enter the app DB root password:" dbrootp_1 && echo
read -sp "Please enter the app DB root password again:" dbrootp_2 && echo
if [ "$dbrootp_1" != "$dbrootp_2" ]; then echo "Values unmatched. Please try again." && exit 2; fi

read -sp "Please enter the app DB user password:" dbuserp_1 && echo
read -sp "Please enter the app DB user password again:" dbuserp_2 && echo
if [ "$dbuserp_1" != "$dbuserp_2" ]; then echo "Values unmatched. Please try again." && exit 2; fi

为什么我用 Bash 来做

就目前而言,我更喜欢 Bash 自动化而不是 Ansible 自动化,因为 Ansible 的学习曲线很陡峭,而且它的文档(以及我买的一些关于它的印刷书籍)对我学习如何使用它来说不清楚或没有用处)。我也不喜欢使用 Docker 镜像,然后在构建后更改它们。

我的问题

整个 Bash 脚本(我没有完整地放在这里)有点长,上面的“重”文本让它显着变长 - 但这主要是一个外观问题。

我的问题

验证读取操作是否有替代方案?一个既提示两次又一次性比较的实用程序?

有关的: 需要 $1 和 $2 与此处字符串进行比较

答案1

shell 函数怎么样?喜欢

function read_n_verify  {
    read -p "$2: " TMP1
    read -p "$2 again: " TMP2
    [ "$TMP1" != "$TMP2" ] &&
    { echo "Values unmatched. Please try again."; return 2; }
    read "$1" <<< "$TMP1"
}
read_n_verify domain "Please enter the domain of your web application" 
read_n_verify dbrootp "Please enter the app DB root password" 
read_n_verify dbuserp "Please enter the app DB user password"

$domain然后用, $dbrootp,执行您想要的操作$dbuserp

$1用于read从“此处字符串”传输后面的变量名称,而“此处字符串”又被使用,因为它比(也可以使用)“此处文档”更容易。

$2包含提示(自由)文本,最后使用以允许(某种)“无限”文本长度。

大写的 TMP 和[ ... ] &&“糖语法”(无论是什么)根据个人喜好使用。

if - then - fi也可以使用,并且不需要将多个命令收集到一个命令中以作为分支执行的大括号&&

答案2

我会这样做:

#!/bin/bash
while [[ $string != 'string' ]] || [[ $string == '' ]] 
do
    read -p "Please enter the domain of your web application: " string
    echo "Please enter the domain of your web application: "
done 
Command 1
Command 2

少打字。

当然,您需要一个这样的部分来解决您的所有问题。

除了你的方式和我的方式之外,实际上没有更多的选择。

相关内容