フォローアップです。この問題;
理由はわかりませんが、次のコードを理解しようとしたにもかかわらず、誤解が発生し続けます。
function read_and_verify {
read -p "$1:" tmp1
read -p "$2:" tmp2
if [ "$tmp1" != "$tmp2" ]; then
echo "Values unmatched. Please try again."; return 2
else
read "$1" <<< "$tmp1"
fi
}
read_and_verify domain "Please enter the domain of your web application twice"
read_and_verify dbrootp "Please enter the app DB root password twice"
read_and_verify dbuserp "Please enter the app DB user password twice"
$1
なぜ必要なのか$2
、なぜ必要なのか誤解しましたread "$1" <<< "$tmp1"
。
この比較シナリオでは、実際に何が起こりますか?
ベストアンサー1
read -p "$1:" tmp1
そして、関数の最初の()と2番目の()パラメータをread -p "$2:" tmp2
それぞれユーザー入力行を読み取るためのプロンプトとして使用します。結果はおよびに保存されます。次に、2つの値が等しい場合、fromの値を関数の最初の引数と呼ばれる変数として読み込みます。$1
$2
tmp1
tmp2
tmp1
read "$1" <<< "$tmp1"
read_and_verify domain "Please enter the domain of your web application twice"
したがって、ユーザー入力がイタリック体で表示され、次のような結果が得られます。
フィールド:金持ち Webアプリケーションのドメイン名を2回入力します。金持ち
次に、入力された値を上記のように実行された変数に保存しますdomain
。echo "$domain"
foo
なぜ$1と$2が必要なのか、なぜ"$1" <<< "$tmp1"を読むのか誤解しました。
$1
$2
ユーザーにプロンプトとして機能$1
します。返品結果変数の名前を関数に渡すために使用されます。これにより、最初のヒントが少し奇妙になりました。次のように、より説明的な内容を使用する方が良いかもしれません。
read -p "Please enter value for '$1': " tmp1
read -p "Please repeat the value to verify: " tmp2
または、$2
両方のプロンプトに渡されたメッセージを使用してください。他の質問に答えるにはする。
read "$1" <<< "$tmp1"
通常、ある変数の値を別の変数に割り当てることができるため、これは少し奇妙です。しかし、ここで問題は$1
次のとおりです。名前変数の値なので、間接割り当てが必要です。 Bash 4.3以降では、名前参照を使用できます。
declare -n ref="$1"
ref=$tmp1
したがって、関数全体を次のように書くことをお勧めします。
#!/bin/bash
function read_and_verify {
read -p "Please enter value for '$1': " tmp1
read -p "Please repeat the value to verify: " tmp2
if [ "$tmp1" != "$tmp2" ]; then
echo "Values unmatched. Please try again."; return 2
else
declare -n ref="$1"
ref=$tmp1
fi
}
(2番目のパラメータは使用しません。)