String 比较bash中不匹配的字符串

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

我有一个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_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 ... }
                                   ^^