2016-12-09 7 views
0

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 

私のデータベースは、この

ラリーのようになります。[email protected]:ラリー・ボブ:ATC:コードは、変数とだけではない動作しますので、問題は何ができるか4.0

わかりません

+1

http://www.shellcheck.net/ – Cyrus

答えて

1

一重引用符で区切られたsedスクリプトから簡単に戻って変数をシェルに表示させる必要があります。全体のスクリプトが後で驚きのためにあなたをセットアップすることで周り

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

理由をあなただけの二重引用符を使用しません:あなたは、変数の前に終了する単一引用符を追加し、それの後に再び1を起動していることをやりますシェルが解釈するときには、あなたが展開したい変数の代わりにスクリプト全体です。例えば:二重引用符は、シェルにあなたの全体のスクリプトを公開するので、最後の1がそれを見て、シェルは現在のPIDとして$$を解釈する前に、sedはたまたま

$ 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 

+0

'sed -i"/$ {rui}/d "。/ databse.txt'これは見落とさないように引用符と二重引用符を入れてください。多分、 'rui'の可能な内容を特に安全なものにしておくといいでしょう。このような(そして実際のセキュリティも) – NeronLeVelu

+1

@NeronLeVelu私の答えはなぜそうしてはいけないのかを説明しています。中括弧は変数名を連結したテキスト( 'echo" $ foobar "'への1つの解決策として '$ echo' bar "')から分離し、置換を許可するだけです(例えば 'echo" $ {foo ## x} " ')と配列操作を行うが、変数をシェル解釈から保護しないので、' sed "/ $ {rui}/d" 'は' sed "/ $ rui/d" 'よりも良いものではない。 –

+0

私は私のバージョンがより安全だとは言わない、私はコンテンツを保護するために言った、それは読みやすいだけです。あなたのサンプルは驚くことではありません($$の解釈は変数fooの内容の一部ではありません)。二重引用符で囲まれたカプセル化より安全ではないようです。 '' s/$ foo/\ $ \ $/''を二重引用符で囲むと、sedの内部でエスケープされます。 '' $ rui ''をつけたままで周りの情報を簡単に引用したサンプルがあると、ruiのコンテンツに問題はありませんか? – NeronLeVelu

関連する問題