linux - 查找 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 完全相同的字符串,以及它是否对它进行了注释。
注意:如果您能帮助我编写用于评论和删除的脚本,那就太好了。
解决方案
由于您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 分隔符而不是/
.
推荐阅读
- mysql - MariaDB 10.2 / MySQL 5.7 使用通配符删除字段中的文本?
- git - 快速找出 VS Code 中正在跟踪哪个 Git 遥控器?
- windows - 添加 /GENPROFILE 标志后无法打开文件“pgort.llib”
- ruby-on-rails - 如何从另一个 Rails 控制器访问方法
- webgl2 - 为什么使用 isampler2D 导致我的着色器无法在 WebGL2 中编译?
- c# - C# 文本在第一个单词后换行
- python-3.x - 为什么在使用 `=` 时会链接两个 DataFrame?
- python - 如何使 Flask 单元测试来测试登录
- javascript - 为什么当我用cheerio 运行这段代码时没有输出?
- python - Django.db.utils.ProgrammingError:约束不存在