Shell 用于检查文件中是否存在一行的脚本

Shell script to to check if a line exist in a file

我已经尝试了堆栈溢出的所有可用解决方案,但是当我使用 if condition with with 时,结果总是 true。 我需要在文件中找到一行并查看它是否不退出然后将该行插入该文件,但它总是导致该行已经存在。 这是我的脚本

isInFile=$(grep -q '^export' /etc/bashrc)
if [[ $isInFile == 0 ]];
then
    echo "line is not present";
    echo "export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local6.debug \"$(whoami) [$$]: $(history 1 | sed \"s/^[ ]*[0-9]\+[ ]*//\" )\"'" >> /etc/bashrc;
    source /etc/bashrc;
else
    echo "line is in the file";
fi

它总是说

line is in the file

我在您的代码中发现了 2 个问题:

  1. if [[ $isInFile == 0 ]]; -- 如果条件不应以 ; 终止。删除那个。
  2. 您检查的表达式始终为空字符串。尝试 echo $isInFile。您正在检查的是命令的输出,而不是它的 return 值。相反,您应该从 grep 表达式中删除 -q 并检查输出是否为空。

以下代码应该有效:

isInFile=$(grep '^export' /etc/bashrc)
if [ -z "$isInFile" ]
then
    echo "line is not present";
    echo "export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local6.debug \"$(whoami) [$$]: $(history 1 | sed \"s/^[ ]*[0-9]\+[ ]*//\" )\"'" >> /etc/bashrc;
    source /etc/bashrc;
else
    echo "line is in the file";
fi

-z 检查变量是否为空。

if 语句分支基于它给出的命令退出状态[[ 只是您可以使用的一个命令,它不是强制性语法。在交互式提示下,输入 help if

这样做:

if grep -q '^export' /etc/bashrc
then
    # exit status of grep is zero: the pattern DOES MATCH the file
    echo "line is in the file";
else
    # exit status of grep is non-zero: the pattern DOES NOT MATCH the file
    echo "line is not present";
    echo "export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local6.debug \"$(whoami) [$$]: $(history 1 | sed \"s/^[ ]*[0-9]\+[ ]*//\" )\"'" >> /etc/bashrc;
    source /etc/bashrc;
fi