【问题标题】:How to compare strings containing a square bracket in Bash如何在 Bash 中比较包含方括号的字符串
【发布时间】:2018-02-24 04:43:49
【问题描述】:

我正在寻找与 bash 中方括号的比较。

情况:我有一个主机文件,其中包含看起来像

的主机名
[debian]
ansible
host
names

[centos]
more
hosts

现在我想扫描所有主机的 ssh 密钥(首先回显,稍后使用 ssh-keyscan):

while read hostName
do
  if [[ $hostName != "" ]] &&  [[ $hostName != "\[*" ]] ; then
    echo $hostName
    #ssh-keyscan $hostName
  fi
done < hosts

虽然[[ $hostName != "" ]] 可以完成,但包含方括号[[ $hostName != "\[*" ]] 比较的部分却没有。 atm结果如下:

[debian]
ansible
host
names
[centos]
more
hosts

我希望它看起来像:

ansible
host
names
more
hosts

虽然例如How to compare strings in Bash 涵盖了一般主题,它不涵盖我的问题。另外,如果可能的话,我想避免在比较字符串之前使用 sed 或其他字符串替换方法。有人知道如何在 bash 中比较字符串中的方括号吗?

同样不工作: this solution,改编比较(可能是我改编错了?):

if [[ $hostName != "" ]] && [ "$hostName" != "*[*" ]

【问题讨论】:

  • 看起来您链接的第一页上的另一个答案会有所帮助:stackoverflow.com/a/16263820/1354854。解决方案是if [[ $hostName != *"["* ]]。通配符必须在引号之外,这不直观,或者因为您使用的是[[,所以完全不加引号。
  • 呵呵,没看到那个。好的,非常感谢:)。

标签: string bash brackets


【解决方案1】:

这可以满足您的需要并且与 POSIX 兼容:

while read hostName
do
  if [ "$hostName" ] && [ "$hostName" = "${hostName#[}" ] ; then
    echo $hostName
    #ssh-keyscan $hostName
  fi
done < hosts

【讨论】:

    【解决方案2】:

    备选方案#1:

    while read hostName
    do
      if [[ $hostName != "" ]] &&  [[ $hostName != *"["* ]] ; then
      echo "$hostName"
      #ssh-keyscan $hostName
    fi
    done < hosts
    

    备选方案#2:

    grep -v '^\[.*\]$'  hosts | while read hostName
    do
      if [[ $hostName != "" ]] ; then
      echo "$hostName"
      #ssh-keyscan $hostName
    fi
    done
    

    备选方案#3:

    grep -v '^\[.*\]$' hosts | grep -v '^[ \t]*$' | while read hostName
    do
      echo "$hostName"
      #ssh-keyscan $hostName
    done
    

    【讨论】:

      猜你喜欢
      • 2017-04-17
      • 1970-01-01
      • 2015-11-28
      • 2011-01-15
      • 1970-01-01
      • 2015-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多