2016-12-09 9 views
0

Mit sed kann ich eine Codezeile in der Eingabeaufforderung löschen. Wenn ich es in einem Bash-Skript benutze und eine Variable verwende, lösche ich sie nicht.Löschen einer Zeile aus einer bestimmten Variablen

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 

Meine Datenbank sieht wie folgt aus

Larry: [email protected]: Larry Bob: ATC: 4.0

nicht sicher, was das Problem sein könnte, da der Code einfach nicht mit einer Variablen arbeitet

+1

Bitte schauen Sie: http://www.shellcheck.net/ – Cyrus

Antwort

1

Sie müssen die Variable für die Shell sichtbar machen, indem Sie kurz aus dem mit einem Anführungszeichen begrenzten sed-Skript ausbrechen. Sie tun das, einen Abschluss Apostroph vor den Variablen durch Hinzufügen, und einen Ausgang man wieder, nachdem es:

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

Der Grund Sie nicht nur doppelte Anführungszeichen verwenden, um das gesamte Skript ist, dass Sie setzt später für Überraschungen Wenn die Shell interpretiert, handelt es sich um ein ganzes Skript und nicht nur um die Variable, die sie erweitern soll. z.B .:

$ 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 

Das letzte geschieht, weil die doppelte Anführungszeichen Ihr ganzes Skript auf die Schale vor sieht es sed aussetzen und die Schale interpretiert $$ als aktuelle PID.

+0

'sed -i"/$ {rui}/d "./Database.txt' so kein Angebot und doppelte Anführungszeichen verlieren. Vielleicht ein bisschen sichern Sie den möglichen Inhalt von 'rui' besonders mit Zitat und char so (und echte Sicherheit auch aufgrund der Batch-Ausführung) – NeronLeVelu

+1

@NeronLeVelu Meine Antwort erklärt, warum Sie das nicht tun sollten. Curly geschweifte Klammern trennen nur Variablennamen von sonst verkettetem Text ('echo" $ {foo} bar "' als eine Lösung für 'echo" $ foobar "') und erlauben eine Substitution (zB 'echo" $ {foo ## x} " ') und Array-Operationen, aber sie schützen die Variable nicht vor Shell-Interpretation, so dass' sed "/ $ {rui}/d" 'nicht besser wäre als' sed "/ $ rui/d" '. –

+0

Ich sage nicht, dass meine Version sicherer ist, ich habe es gesagt, um den Inhalt zu sichern und es ist einfacher zu lesen. Ihr Beispiel gibt keine Überraschung (Interpretation von $$ ist nicht Teil des variablen Foo-Inhalts) und scheint nicht sicherer als die gesamte Kapselung mit doppelten Anführungszeichen. Regel soll innerhalb des sed entkommen, wenn double quote so '" s/$ foo/\ $ \ $/"'. Haben Sie ein Beispiel, in dem ein einfaches Zitat auf umgebende Informationen (so dass "$ rui" beibehalten wird) Probleme mit rui-Inhalten vermeidet? – NeronLeVelu

Verwandte Themen