Shell-Script

讀取驗證替代方案(兩個提示和 if-then 比較替代方案)

  • April 3, 2019

我正在嘗試創建一個小腳本來創建簡單的全預設 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 and $ 2 用於與此處字元串進行比較

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從“here 字元串”傳輸後面的變數名稱,這反過來又被使用,因為它比(也可以使用)“here 文件”更容易。

$2包含提示(自由)文本,最後使用以允許(某種)“無限”文本長度。

個人喜好使用大寫 TMP 和[ ... ] &&“sugar-syntax”(無論是什麼)。

if - then - fi也可以使用,並且將消除將多個命令收集到一個命令中作為&&分支執行的大括號的需要。

引用自:https://unix.stackexchange.com/questions/483587