如何测试一个变量是否与另一个值匹配并移动到另一个函数?

如何测试一个变量是否与另一个值匹配并移动到另一个函数?

我正在编写一个脚本,将预定的一行文本存储到一个字符串中(我们将其称为)。我将(我们将其称为)abc的结果存储到另一个字符串中。grep -iqs $USER filedef

我如何测试$abc内容是否匹配?$def如果匹配,则转到下一个函数?如果不匹配,则提示用户输入。

这是我迄今为止的尝试:

firstFunction() {
abc="$USER content";               #text stored as string
def=`grep -iqs $USER /file`;       #results of grep stored to string
if [[ $def = "$abc" ]]; then       #test if result from grep command matches text in
   secondFunction                  #string $def. If true, move to secondFunction. If
else                               #false, prompt user.
   echo "Message to user with a y/n prompt"; read prmt;
fi;
if [[ $prmt != "y" || $prmt != "n" ]]; then prmt
elif [[ $prmt == "y" ]]; then
   sed -i "s/$def/$abc/g" /file    #If user chooses y at prompt, replace $abc with $def
elif [[ $answer == "n" ]]; then    #in file. If user chooses no at prompt, move to 
   secondFunction                  #secondFunction.
fi;
clear;
};

环境标题已经改变,但片段背后的概念应该很清楚。

答案1

第一的首先,因为您使用了grep参数-q,所以变量的值def将始终等于空字符串。来自man grep

-q、--安静、--安静
       安静的;  不要向标准输出写入任何内容。 出口
       如果发现任何匹配项,则立即将其状态设置为零,即使
       检测到错误。另请参阅 -s 或 --no-messages 选项。
       (-q 由 POSIX 指定。)

第二,你应该思考一下逻辑。这个表达式:

$prmt != "y" || $prmt != "n"

在任何编程语言中总是被评估为真的

  • 如果$prmt = "y",那么一定 $prmt != "n",所以你的表达是真的
  • 如果$prmt = "n",那么一定 $prmt != "y",所以你的表达是真的
  • 在任何其他情况下,显然您的表达是正确的。

第三,你的函数看起来应该是这样的:

firstFunction() {
    abc="$USER content"
    def=`grep -is $USER /path/to/file`
    if [[ $def = "$abc" ]]; then
       secondFunction 
       return                            #does not make sense to go ahead
    else
       echo "Message to user with a y/n prompt"
       read prmt
    fi
    while : ; do
    if [  "$prmt" = "n" ]; then 
       secondFunction
       return                            #does not make sense to go ahead
    elif [ "$prmt" = "y" ]; then
       sed -i "s/$def/$abc/g" /path/to/file
       return                            #does not make sense to go ahead
    else
       echo "Message to user with a y/n prompt"
       read prmt
    fi
    done
}

或者,正如您所说,您可以使用case语句。

也可以看看:

相关内容