如何将“空白”和“或”条件与 bash 脚本匹配?

Posted

技术标签:

【中文标题】如何将“空白”和“或”条件与 bash 脚本匹配?【英文标题】:How to match "whitespace" and "OR" condition with bash script? 【发布时间】:2018-09-19 18:37:53 【问题描述】:

我想匹配 bash 中包含字符串中“空格”和“或”条件的条件。我无法做,因为我是 shell 脚本的新手,请帮忙,因为它会在匹配 $myarrlin[1] 的地方循环。我收到“Centrify 已禁用”,但我希望这里的条件为真。这是我的代码:

FILE_CENT="/etc/nsswitch.conf" 
OS=`uname`    
if [[ $OS = 'Linux' ]]; then
 if [[ -e $FILE_CENT ]]; then
echo "nsswitch.conf found, Proceeding further..."
  while read -r LINE
  do
  if [[ $LINE =~ ^passwd ]]; then
  myarrlin=($LINE)
    if [[ $myarrlin[1] =~ ^(centrify)|(centrifydc)[[:space:]]* || $myarrlin[1] =~ [[:space:]]+(centrify)|(centrifydc)[[:space:]]* ]];  then
     echo "Centrify is enabled"
     else
     echo "Centrify is disabled"
    fi
  fi
  done < $FILE_CENT
else
echo "nsswitch.conf does not exist in $OS, cannot fetch CENTRIFY information!"
 fi 
fi

nsswitch.conf >>>

passwd:     centrify files
  or
passwd:     centrifydc files
  or
passwd:     files centrify
  or
passwd:     files centrifydc

【问题讨论】:

如果您希望比较索引 0 和 1 处的字符串是空格,那么可以这样做 $myarrlin[1] == ' ' 感谢您的回答。但我希望匹配“Centrify”字符串。我想我有问题。它创建了一个由 3 个元素组成的数组,所以我只检查第二个索引。 在尝试了某些语法之后,这终于奏效了: if [[ $myarrlin[1] =~ ^centrify$|^centrifydc$ || $myarrlin[2] =~ ^centrify$|^centrifydc$ ]];那么 【参考方案1】:

你为什么这样做:myarrlin=($LINE)

如果您只想知道该行是否包含 centrify:

  while read -r LINE
  do
  if [[ $LINE =~ ^passwd ]]; then
    if [[ $LINE == *"centrify"* ]];  then
     echo "Centrify is enabled"
    else
     echo "Centrify is disabled"
    fi
  fi
  done < $FILE_CENT

【讨论】:

我实际上是在 perl 中开发的,我必须在 shell 中做同样的事情。所以遵循相同的。嗯,这看起来不错,谢谢。 :)

以上是关于如何将“空白”和“或”条件与 bash 脚本匹配?的主要内容,如果未能解决你的问题,请参考以下文章

bash的算术运算和条件测试语句

如何处理文件夹结构中与模式匹配的所有文件? [复制]

Shell脚本的条件测试与比较

Linux基础之bash脚本进阶篇-循环语句(for,while,until)及其特殊用法

Linux基础 7-3 Bash脚本编程--条件判断

Linux基础 7-3 Bash脚本编程--条件判断