簡體   English   中英

比較bash中不匹配的字符串

[英]Comparing strings not to match in 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 ; }

但是,第二個沒有:

[ "$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
}

[ "$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但更難逃脫。

看來您有邏輯錯誤。 如果兩個語句都為真,則要執行回顯,但是您正在使用|| 您的真正意思是使用&&

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是“ A”還是“ B”。 在其他情況下,請打印錯誤消息。

JOB_FILE  status
A         ok
B         ok
rest      error

於是

A   B   (A or B)  !(A or B)    !A or !B         !A and !B
1   0       1         0       0 or 1 => 1      0 and 1 => 0
0   1       1         0       1 or 0 => 1      1 and 0 => 0
0   0       0         1       1 or 1 => 1      1 and 1 => 1
--------------------------------------------------------------
                              always true      just true if not A and not B

其中1=True0=False

了解了邏輯之后,您需要的是:

[ ! "$JOB_FILE" == "all_jobs.pl" ] && [ ! "$JOB_FILE" == "incomplete.out" ] && { echo ... }
                                   ^^

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM