如何在Bash

时间:2017-09-15 05:00:09

标签: string bash brackets

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

情况:我有一个包含类似

主机名的主机文件
[debian]
ansible
host
names

[centos]
more
hosts

现在我要扫描所有主机的ssh密钥(第一个echo,后来使用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" != "*[*" ]

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

备选方案#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