【问题标题】:Deleting a line from a specific variable从特定变量中删除一行
【发布时间】:2016-12-10 09:56:47
【问题描述】:

使用 sed 我可以删除命令提示符内的一行代码。当我在 bash 脚本中使用它并使用变量时,它不会删除它。

function remove_user {
echo "Input user you would like to delete"
read rui
if grep -q  $rui database.txt ;
then
    echo "Are you sure yu want to delete this user?"
    echo "(Y/N)"
    read input3
    if [ $input3 == "Y" ] || [ $input3 == "y" ] ;
    then

            sed -i '/"$rui"/d' ./databse.txt
            echo "User Deleted"
            echo "returning to the main menu..."
            echo "$rui"
            #sleep 1 ; clear

    elif [ $input3 == "N" ] || [$input3 == "n" ] ;
    then
            echo "returning to main menu..."
            sleep 1 ; clear
    else
            echo "input invalid"
            echo "returning to main menu..."
            sleep 1 ; clear
    fi
 else
    echo " user not found"
    echo "returning to main menu..."
    sleep 1 ; clear
fi

我的数据库是这样的

Larry:Larry@hotmail.com:Larry Bob:ATC:4.0

不确定是什么问题,因为代码不能与变量一起工作

【问题讨论】:

标签: bash sed


【解决方案1】:

您需要通过简单地退出单引号分隔的 sed 脚本来使变量对 shell 可见。为此,您可以在变量之前添加一个终止单引号,并在其后添加一个开始:

sed -i '/'"$rui"'/d' ./databse.txt

你不只是在整个脚本周围使用双引号的原因是,当 shell 解释你是整个脚本而不是你希望它扩展的变量时,这会让你感到惊讶。例如:

$ echo "money is nice" | sed 's/money/$$/'
$$ is nice

$ foo="money"; echo "money is nice" | sed 's/'"$foo"'/$$/'
$$ is nice

$ foo="money"; echo "money is nice" | sed "s/$foo/$$/"
6756 is nice

最后一个发生是因为双引号在 sed 看到它之前将整个脚本暴露给 shell,并且 shell 将 $$ 解释为当前 PID。

【讨论】:

  • sed -i "/${rui}/d" ./databse.txt 所以没有丢失引号和双引号。 rui 的可能内容可能有点安全,尤其是这样的引用和字符(以及真正的安全性,由于批处理执行)
  • @NeronLeVelu 我的回答解释了为什么你不应该这样做。花括号只是将变量名与其他连接的文本分开(echo "${foo}bar" 作为echo "$foobar" 的一种解决方案)并允许替换(例如echo "${foo##x}")和数组操作,但它们不保护变量免受shell解释所以sed "/${rui}/d"不会比sed "/$rui/d"更好。
  • 我并不是说我的版本更安全,我说它是为了保护内容并且更容易阅读。您的示例并不令人惊讶(对 $$ 的解释不是变量 foo 内容的一部分)并且似乎并不比使用双引号的整个封装更安全。如果双引号,则规则是在 sed 内转义"s/$foo/\$\$/"。您是否有一个示例,其中对周围信息的简单引用(因此保留"$rui")将避免 rui 内容出现问题?
  • 对不起,我不明白这个问题。是的,这个例子并不奇怪,因为我选择了一个非常清晰、明显的案例来证明这个问题。我的观点很简单,如果你用单引号分隔脚本,并且只在扩展变量所需的最小部分重新进入 shell,那么你不必担心在脚本中的其他任何地方转义字符,这会使你的脚本更清晰、更简洁、更不容易出错。
  • 你的解释很清楚;我只是试图找到"/$rui/" 不如'/'"$rui"'/' 安全的情况
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多