【问题标题】:Find if a shell variable contains specific string and comment it查找 shell 变量是否包含特定字符串并对其进行注释
【发布时间】:2020-01-02 05:52:22
【问题描述】:

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

我尝试过使用 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 完全相同的字符串,以及是否有注释。

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

【问题讨论】:

标签: linux bash scripting


【解决方案1】:

由于您显然使用bash,因此脚本上有一些cmets。

#!/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 包含一些更复杂的内容,使用# 作为分隔符而不是/

【讨论】:

  • 感谢您的回答。我在提到的 sed 命令上确实收到错误 - sed: -e expression #1, char 14: extra characters after command
  • 由于 JV_PAT 将包含 /,因此您需要为 sed 命令使用另一个分隔符。使用# 代替/ 的示例:sed -i "\\#JAVA_HOME=${JV_PAT}#d" '/home/admin/Vishal/test_bash.sh'
  • 感谢它在 grep 命令中稍作更改:不需要前导“/”。谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 2021-06-27
相关资源
最近更新 更多