我正在尝试创建一个小脚本来创建简单的、全默认的 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
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
少打字。
当然,您需要一个这样的部分来解决您的所有问题。
除了你的方式和我的方式之外,实际上没有更多的选择。