如何在Bash中比较包含方括号的字符串

string bash brackets

454 观看

2回复

6 作者的声誉

我正在寻找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

例如,如何在Bash中比较字符串涵盖了一般主题,但并未涵盖我的问题。另外,如果可以的话,在比较字符串之前,我还要避免使用sed或其他字符串替换方法。有人知道如何在bash中比较字符串中的方括号吗?

同样不起作用: 此解决方案,进行了比较(也许我采用了错误的方式?):

if [[ $hostName != "" ]] && [ "$hostName" != "*[*" ]
作者: guz4217 的来源 发布者: 2017 年 9 月 15 日

回应 2


0

83596 作者的声誉

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

while read hostName
do
  if [ "$hostName" ] && [ "$hostName" = "${hostName#[}" ] ; then
    echo $hostName
    #ssh-keyscan $hostName
  fi
done < hosts
作者: John1024 发布者: 2017 年 9 月 15 日

0

1920 作者的声誉

备选方案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
作者: drewster 发布者: 2017 年 9 月 15 日
32x32