我正在尝试编写一个bash脚本,它将在conf文件中查找过时的条目并用新值更新它们。
旧的conf文件有两个条目(-CAR和-BIKE)。例如,

#Following are the entries in the conf file
#-CAR yes/no default set to no
#-BIKE yes/no default set to no

-CAR yes
-BIKE no

现在这个bash脚本应该对这些条目进行grep,并将它们替换为单个条目as-DRIVING_LEVEL(car/bike/none)。
其逻辑如下:
如果-CAR设置为yes,则驾驶级别将为“CAR”。
如果-CAR设置为no,-BIKE设置为yes,则驾驶级别将为“BIKE”。
如果“汽车”和“自行车”都设置为“无”,则驾驶级别将为“无”。
我已经写了下面的脚本做了确切的事情。
#!/bin/bash
CONF_FILE="license.conf"

grep -w $CONF_FILE -e '-CAR' -e '-BIKE'  > /dev/null
if [ $? -eq 0 ]
then
        echo "Old values are present"
        var=$(grep -w $CONF_FILE -e '-CAR')
        if [ $? -eq 0 ]
        then
                temp="${var##*$'\n'}"
                option=$(echo $temp | sed 's/.* //g')
                echo $option
                if [ "$option" == "yes" ]; then
                        car=1
                elif [ "$option" == "no" ]; then
                        car=0
                fi
                echo "Deleting $var"
                sed -i '/-CAR/d' $CONF_FILE
        fi

        var2=$(grep -w $CONF_FILE -e '-BIKE')
        if [ $? -eq 0 ]
        then
                temp2="${var2##*$'\n'}"
                option=$(echo $temp2 | sed 's/.* //g')
                echo $option
                if [ "$option" == "yes" ]; then
                        bike=1
                        #echo $temp
                elif [ "$option" == "no" ]; then
                        bike=0
                fi
                echo "Deleting $var2"
                sed -i '/-BIKE/d' $CONF_FILE
        fi

        if [ "$car" == "1" ]; then
                driving_level="car"
        elif [ "$bike" == "1" ]; then
                driving_level="bike"
        else
                driving_level="none"
        fi

echo "Appending -DRIVING_LEVEL $driving_level"
echo "-DRIVING_LEVEL $driving_level" >> $CONF_FILE
else
        echo "No old values"
fi

问题是我认为这太长了,可以使用sed或awk命令来缩短。但我做不到。我希望它越短越好。
提前谢谢!
注:
我使用temp=“${var###*$'\n'}”来检索最后一行具有实际值,因为grep将给出包含-BIKE的两行。
我使用了option=$(echo$temp | sed's/*//g'),因为-BIKE和yes/no之间可以有任意数量的空格。

最佳答案

$ awk '($0 ~ /-CAR.*yes$/){dl="car";exit} ($0 ~ /-BIKE.*yes$/){dl="bike"} END{print "-DRIVING_LEVEL",(dl)?dl:"none"}' license.conf
-DRIVING_LEVEL car

简要说明,
$0 ~ /-CAR.*yes$/:如果找到“-CAR yes”,直接打印结果(这就是我在这里使用exit的原因)
($0 ~ /-BIKE.*yes$/):如果找到“-BIKE yes”,请继续查找后续行,因为有可能找到“CAR”。
如果未找到任何结果,则将结果打印为“无”。

关于linux - 如何使用sed或awk命令基于其他两个变量的值设置变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45208164/

10-10 17:43