使用OR进行Shell多条件语句

时间:2017-02-12 07:09:40

标签: shell unix

我在文本文件中有以下号码

9378123456 93700805040 0700801902 0093700809102 93711592456 3937389393

我正在尝试编写shell脚本来打印所有未使用93709371启动的数字 这是我的剧本

number="$(< all_numbers.txt)" for numbers in $number; do
if [[ (! ${numbers} =~ ^9370 ) || (! ${numbers} =~ ^9371) ]] ; then
echo $numbers ; fi; done
但似乎我的if条件导致错误的输出有问题,如下所示:
9378123456 93700805040 0700801902 0093700809102 93711592456 3937389393

2 个答案:

答案 0 :(得分:2)

您需要与De Morgan's formulas变得更加友好。您可能误导了&#34;所有未使用9370和9371&#34; 开头的数字:一个号码无法以9370 9371开头 - - 这里的意思是一个不以9370 开头的数字,以及9371。

  • 如果不以9370或9371开头,您想要选择打印一个数字。条件是

      not ((number matches ^9370) or (number matches ^9371))
    
  • De Morgan的公式相当于

      (not (number matches ^9370)) and (not (number matches ^9371))
    
  • 所以在你的脚本中你应该有

      if [[ (! ${numbers} =~ ^9370 ) && (! ${numbers} =~ ^9371) ]]; then
        echo $numbers  
      fi
    
  • 更不用说对于玩具问题,你当然可以写

      if [[ ! ${numbers} =~ ^937[01] ]]; then
        echo $numbers 
      fi
    

答案 1 :(得分:1)

对于grepsedawk这样的好工具来说,这是一项轻松的工作:

grep 方法:

grep -Eo "^937[01][0-9]+$" all_numbers.txt

sed 方法:

sed -rn 's/^937[01][0-9]+$/\0/p' all_numbers.txt

awk 方法:

awk '$1 ~ /^937[01][0-9]+$/' all_numbers.txt

输出结果为:

93700805040
93711592456