首页 > 解决方案 > 查找 shell 变量是否包含特定字符串并对其进行注释

问题描述

我想编写一个脚本来查找变量并检查它是否包含确切的字符串,如果存在则对其进行注释。

我尝试过使用 sed 和 grep 但它还没有为我工作。

我的删除脚本:

JAVA_LOC=`which java`
JV_PAT=`echo $JAVA_LOC |rev| cut -d'/' -f3- | rev` 
del=`sed -i  '/JAVA_HOME=${JV_PAT}/d' /home/admin/Vishal/test_bash.sh`

if [ $? = 0 ]
then
echo "Deleted"
else
echo "Nope"
fi

JV_PAT包含安装 java 的路径,不包括 /bin

JAVA_LOC = /data/jdk1.8.0_111/bin/java

JV_PAT = /data/jdk1.8.0_111

我的输出:

已删除

该脚本被成功执行,但它不会从文件 test_bash 中删除特定的行。

test_bash.sh 文件

JAVA_HOME=/data/jdk1.8.0_111

PATH=.:/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/admin/local/jdk1.8.0_111/bin:/data/hadoop28/bin:/data/hive232/bin:/data/derby1014/bin:/home/admin/local/jdk1.8.0_111/bin:/data/hadoop28/bin:/data/hive232/bin:/data/derby1014/bin:/home/admin/local/jdk1.8.0_111/bin:/data/hadoop28/bin:/data/hive232/bin:/data/derby1014/bin:/home/admin/bin:/u01/app/oracle/product/11.2.0/xe/bin:/home/admin/local/jdk1.8.0_111/bin

我想检查 JAVA_HOME 是否包含与 JV_PAT 完全相同的字符串,以及它是否对它进行了注释。

注意:如果您能帮助我编写用于评论和删除的脚本,那就太好了。

标签: linuxbashscripting

解决方案


由于您bash显然正在使用,因此对脚本进行了一些评论。

#!/bin/bash. 这将bash在执行脚本时强制使用 。

JAVA_LOC=`which java`
JV_PAT=`echo $JAVA_LOC |rev| cut -d'/' -f3- | rev` 

这样做的 bash 方式是使用 $(..) 而不是反引号。除非您有特定原因(例如旧的 Bourne-shell 兼容性),否则不要使用反引号。哦,如果您使用它们,请引用您的变量。

JAVA_LOC=$(which java)
JV_PAT=$(echo "$JAVA_LOC" |rev| cut -d'/' -f3- | rev) 

阅读手册sed;你在下面做的事情没有意义。

del=`sed -i  '/JAVA_HOME=${JV_PAT}/d' /home/admin/Vishal/test_bash.sh`
if [ $? = 0 ]
then
echo "Deleted"
else
echo "Nope"
fi

sed -i不能正常产生输出。因此,您的变量del将始终为空。此外, 的退出状态sed不取决于是否已完成替换的事实。sed也可以成功执行而无需进行任何替换。所以,测试退出状态sed不会告诉你是否没有完成这样的替换。

如果您需要测试模式是否在文件中,我认为grep是膝反射。这样,结果将是:

if grep -q "/JAVA_HOME=${JV_PAT}" /home/admin/Vishal/test_bash.sh ; then
    sed -i "\\#JAVA_HOME=${JV_PAT}#d" /home/admin/Vishal/test_bash.sh
    echo "Deleted"
else
   echo "Nope"
fi

编辑:正如 Léa Gris 指出的那样,${JV_PAT}可能包含一个/. 因此,sed包含更复杂一点,使用#as 分隔符而不是/.


推荐阅读