如何将变量与字符串进行比较(如果匹配则执行某些操作)?
如何将变量与字符串进行比较(如果匹配则执行某些操作)?
Answers:
if [ "$x" = "valid" ]; then
echo "x has the value 'valid'"
fi
如果您想在不匹配的地方做某事,请替换=
为!=
。您可以在各自的文档中阅读有关字符串运算和算术运算的更多信息。
$x
?您希望用引号引起来$x
,因为如果为空,则Bash脚本会遇到语法错误,如下所示:
if [ = "valid" ]; then
==
运算符请注意,Bash允许==
用于与相等[
,但这不是标准的。
使用第一种情况,其中引号$x
是可选的:
if [[ "$x" == "valid" ]]; then
或使用第二种情况:
if [ "$x" = "valid" ]; then
[ "$1" == "on" ]
。将其更改为[“ $ 1” =“ on”]解决了该问题。
=
而不是两个。
[ $x -eq "valid" ]
。-eq
是整数而不是字符串的比较运算符。
["x$yes" == "xyes"]
,即在变量和字符串文字前都加上一个前缀x
吗?那是古老的遗迹吗?还是在某些情况下真的需要吗?
或者,如果您不需要else子句:
[ "$x" == "valid" ] && echo "x has the value 'valid'"
echo
可能会失败。
[ "$X" == "valid" ] || ( echo invalid && false ) && echo "valid"
。
{ echo invalid && false; }
比效率更高( echo invalid && false )
,因为它避免为不必要的subshell付费。
a="abc"
b="def"
# Equality Comparison
if [ "$a" == "$b" ]; then
echo "Strings match"
else
echo "Strings don't match"
fi
# Lexicographic (greater than, less than) comparison.
if [ "$a" \< "$b" ]; then
echo "$a is lexicographically smaller then $b"
elif [ "$a" \> "$b" ]; then
echo "$b is lexicographically smaller than $a"
else
echo "Strings are equal"
fi
笔记:
if
和[
和]
是重要的>
和<
是重定向操作符,因此分别使用\>
和对其进行转义\<
。$a
实际上将其" "
括起来作为字符串文字值的一部分,因此我不得不使用转义字符$b
来比较这些值。我可以在运行后找到它bash -x ./script.sh
,-x标志使您可以查看每次执行的值并有助于调试。
要将字符串与通配符进行比较,请使用
if [[ "$stringA" == *$stringB* ]]; then
# Do something here
else
# Do Something here
fi
"
通配符周围的缺失。(顺便说一句:通配符+1!)
$stringB
必须被引用(并且,顺便说一句,左侧不需要加引号)if [[ $stringA = *"$stringB"* ]]; then
。
我必须不同意其中一项评论:
[ "$x" == "valid" ] && echo "valid" || echo "invalid"
只是看起来好像是一个未开始的人...
它以某种方式使用通用模式作为语言。
在您学习了语言之后。
这是一个简单的逻辑表达式,有一个特殊部分:逻辑运算符的惰性求值。
[ "$x" == "valid" ] && echo "valid" || echo "invalid"
每个部分都是一个逻辑表达式;第一个可能为true或false,其他两个始终为true。
(
[ "$x" == "valid" ]
&&
echo "valid"
)
||
echo "invalid"
现在,在评估时,将检查第一个。如果为假,则与逻辑的第二个操作数及 &&
之后的那个无关。第一个是不正确的,因此无论如何它不能是第一个和第二个都是正确的。
现在,在这种情况下,逻辑的第一面为 false 或 ||
false,但如果另一面(第三部分)为true,则可能为true。
因此,将对第三部分进行评估-主要是将消息写为副作用。(其结果0
为true,在此不使用)
其他情况相似,但更简单-而且-我保证!是-可以-易于阅读!
(我没有,但是我认为拥有灰胡子的UNIX老手对此很有帮助。)
... && ... || ...
通常时(对不起樽Unix的老将,你已经错了这么长的时间),皱眉,因为它不是语义上等同于if ... then ... else ...
。别担心,这是一个常见的陷阱。
... && ... || ...
是一个完全有效的模式,也是一个常见的bash习语。它的使用确实规定了先验知识(如果听众中有初学者,可能要记住这些知识),但是OP有能力证明他们知道如何避免开放的人孔盖。
以下脚本逐行从名为“ testonthis”的文件中读取内容,然后将每行与一个简单字符串,一个带特殊字符的字符串和一个正则表达式进行比较。如果不匹配,则脚本将打印该行,否则不打印。
Bash中的空间非常重要。因此,以下将起作用:
[ "$LINE" != "table_name" ]
但是以下内容不会:
["$LINE" != "table_name"]
因此,请按原样使用:
cat testonthis | while read LINE
do
if [ "$LINE" != "table_name" ] && [ "$LINE" != "--------------------------------" ] && [[ "$LINE" =~ [^[:space:]] ]] && [[ "$LINE" != SQL* ]]; then
echo $LINE
fi
done
bash
因为[
它实际上是一个外部二进制文件(例如,which [
产生类似的结果/usr/bin/[
)
Bash 4+示例。注意:如果单词包含空格等,不使用引号会引起问题。请始终在IMO的Bash中引用。
以下是Bash 4+中的一些示例:
示例1,检查字符串中的“是”(不区分大小写):
if [[ "${str,,}" == *"yes"* ]] ;then
示例2,检查字符串中的“是”(不区分大小写):
if [[ "$(echo "$str" | tr '[:upper:]' '[:lower:]')" == *"yes"* ]] ;then
示例3,检查字符串中的“是”(区分大小写):
if [[ "${str}" == *"yes"* ]] ;then
示例4,检查字符串中的“是”(区分大小写):
if [[ "${str}" =~ "yes" ]] ;then
示例5,完全匹配(区分大小写):
if [[ "${str}" == "yes" ]] ;then
示例6,完全匹配(不区分大小写):
if [[ "${str,,}" == "yes" ]] ;then
示例7,完全匹配:
if [ "$a" = "$b" ] ;then
请享用。
if [ "$a"="$b" ]
或者它不起作用...等号周围不能有空格