这是后续这个问题;
我不知道为什么,但我一直误解下面的代码,尽管我很努力地理解它:
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
并使用函数的第一个 ( ) 和第二个 ( ) 参数作为提示read -p "$2:" tmp2
,分别读取用户的一行输入。结果存储在和中。然后,如果它们相等,则将 from 的值读入由函数的第一个参数命名的变量中$1
$2
tmp1
tmp2
tmp1
read "$1" <<< "$tmp1"
因此,您得到的结果read_and_verify domain "Please enter the domain of your web application twice"
如下所示,其中用户的输入以斜体显示:
领域:富 请输入您的网络应用程序的域名两次:富
然后,将输入的值存储到变量中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
read_and_verify
是一个函数,在该上下文中$1
是第一个参数(此处使用域、dbrootp 或 dbuserp 之一调用它),$2
是第二个参数(调用中每个选项后面的字符串)。如果我们将其扩展为调用一:
function read_and_verify {
read -p "domain:" tmp1
read -p "Please enter the domain of your web application twice:" tmp2
if [ "$tmp1" != "$tmp2" ]; then
echo "Values unmatched. Please try again."; return 2
else
read "domain" <<< "$tmp1"
fi
}
这就是您的职能中正在做的$1
事情。$2