我正在编写一个脚本,将预定的一行文本存储到一个字符串中(我们将其称为)。我将(我们将其称为)abc
的结果存储到另一个字符串中。grep -iqs $USER file
def
我如何测试$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
语句。
也可以看看: