String 比较bash中不匹配的字符串
我有一个var,它应该包含一个或其他字符串值,或者退出程序 第一个似乎对我有用:String 比较bash中不匹配的字符串,string,bash,compare,String,Bash,Compare,我有一个var,它应该包含一个或其他字符串值,或者退出程序 第一个似乎对我有用: [ !"$JOB_FILE" == "all_jobs.pl" ] || [ !"$JOB_FILE" == "incomplete.out" ] && { echo -e "\n Only all_jobs.pl or incomplete.out are valid job files\n"; exit 127 ; } 但是,第二种情况并非如此: [ "$JOB_FILE" != "all_j
[ !"$JOB_FILE" == "all_jobs.pl" ] || [ !"$JOB_FILE" == "incomplete.out" ] && { echo -e "\n Only all_jobs.pl or incomplete.out are valid job files\n"; exit 127 ; }
但是,第二种情况并非如此:
[ "$JOB_FILE" != "all_jobs.pl" ] || [ "$JOB_FILE" != "incomplete.out" ] && { echo -e "\n Only all_jobs.pl or incomplete.out are valid job files\n"; exit 127 ; }
两个不相等的定义之间有什么区别。似乎您有一个逻辑错误。如果这两条语句都为true,但您使用的是
|
,则您希望执行echo。你真的想使用&&
if [[ "$JOB_FILE" != "all_jobs.pl" && "$JOB_FILE" != "incomplete.out" ]]; then
echo -e "\n Only all_jobs.pl or incomplete.out are valid job files\n"
exit 127
fi
以下是正确的表格:
[ ! "$JOB_FILE" == "all_jobs.pl" ] && [ ! "$JOB_FILE" == "incomplete.out" ] && {
echo -e "\n Only all_jobs.pl or incomplete.out are valid job files\n"
exit 127
}
[ "$JOB_FILE" != "all_jobs.pl" ] && [ "$JOB_FILE" != "incomplete.out" ] && {
echo -e "\n Only all_jobs.pl or incomplete.out are valid job files\n"
exit 127
}
在Bash中,这会更好:
[[ $JOB_FILE != "all_jobs.pl" && $JOB_FILE != "incomplete.out" ]] && {
echo -e "\n Only all_jobs.pl or incomplete.out are valid job files\n"
exit 127
}
或者这个:
shopt -s extglob ## Not necessary on Bash 4.1 or newer.
[[ $JOB_FILE != @(all_jobs.pl|incomplete.out) ]] && {
echo -e "\n Only all_jobs.pl or incomplete.out are valid job files\n"
exit 127
}
也可以使用
regex
,但转义起来更加困难。一种方法是检查文件名是否为预期文件名,并利用逻辑或链接条件:
[ "$JOB_FILE" = "all_jobs.pl" ] || [ "$JOB_FILE" = "incomplete.out" ] || { echo -e "\n Only all_jobs.pl or incomplete.out are valid job files\n"; exit 127 ; }
逻辑正好相反 您想检查
JOB\u文件
是“A”还是“B”。在其他情况下,打印一条错误消息
JOB_FILE status
A ok
B ok
rest error
因此
其中1=True
,0=False
在体验了这种逻辑之后,您需要的是:
[ ! "$JOB_FILE" == "all_jobs.pl" ] && [ ! "$JOB_FILE" == "incomplete.out" ] && { echo ... }
^^
您不能使用
!“$JOB_FILE”…
,在之间写一个空格
和“$JOB\u文件”
。谢谢!现在对于空间,两个例子都不起作用。有人能给你推荐一种有效的语法吗?你想要的是&&
而不是|
。所有内容都将与这些名称中的至少一个不匹配。因为它不能同时是两个字符串。是的!谢谢!在订购&
和| |
-foo&bar | | baz
通常等同于,如果foo;然后酒吧;else-baz;fi
,但由于评估/执行顺序,foo | | baz&&bar
通常不会做你可能认为它会做的事情-如果不是foo,它更像是;那么如果baz,;然后酒吧;fi;fi
。。。
[ ! "$JOB_FILE" == "all_jobs.pl" ] && [ ! "$JOB_FILE" == "incomplete.out" ] && { echo ... }
^^