为什么我在这个BASH脚本中需要一个前导空格



使用此脚本确认已安装macOS配置文件

#!/bin/bash
NAME="ApplicationName - Config Profile"
profiles=$(profiles -C -v | awk -F: '/attribute: name/{print $NF}' | grep "$NAME")
if [ "$profiles" == " $NAME" ]; then
echo "Profile exists"
else
echo "Profile does not exist"
fi

如果条件中没有前导空格($NAME之前的空格(,则条件是错误的。

"$profiles" == "$NAME"

这返回"0";配置文件不存在";

"$profiles" == " $NAME"

这返回"0";配置文件存在";

我甚至可以echo $NAME$profiles,它们的回声完全相同,但if条件根据空间的不同而不同。为什么会这样?

由于您将awk命令中的字段分隔符更改为冒号,因此任何空白都不会被视为字段分隔符,因此空白将与print $NF语句一起打印。Grep也不会去掉空白,所以"$profiles"在开头确实包含了一个空格。如果在回显$profiles时在它周围加上双引号,您应该会看到前面有一个空格。对于bash脚本,通常建议对if语句使用双括号,例如if [[ $profiles == $NAME ]]; then(双括号不能解决这个问题,但它们比单括号更安全。(

一种解决方案是将grep更改为另一个awk调用:

profiles=$(profiles -C -v | awk -F: '/attribute: name/{print $NF}' | awk '/'"$NAME"'/ {$1=$1; print $0}')

以上操作将导致删除前导空格。

我很确定profiles确实包含前导空格(看看echo "'$profiles'",它应该会使空格可见(。然而,我发现你的程序的整个逻辑有问题。您基本上想要测试输入是否包含一行attribute: name ..... $NAME。在这种情况下,您可以简单地这样做,即

if profiles -C -v|grep -q "attribute: name.*: *$NAME$"
then
echo Profile $NAME exists
fi

这假设NAME在正则表达式中不包含具有特殊含义的字符。如果这不能保证,你可以写,即

if profiles -C -v|grep "attribute: name"| grep -Fq "$NAME"
then
...

这并没有满足$NAME必须位于行末尾的要求。如果这对你来说真的很重要(我不知道输入数据中可能存在的变化(,你可以在awk中进行整个匹配(并相应地设置退出状态(。关键是,为了测试某个配置文件名称的存在,您不需要提取该名称本身。

更新:合并三元组的备注

最新更新