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

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

这是后续这个问题;
我不知道为什么,但我一直误解下面的代码,尽管我很努力地理解它:

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$2tmp1tmp2tmp1read "$1" <<< "$tmp1"

因此,您得到的结果read_and_verify domain "Please enter the domain of your web application twice"如下所示,其中用户的输入以斜体显示:

领域:
请输入您的网络应用程序的域名两次:

然后,将输入的值存储到变量中domainecho "$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

相关内容