2016-12-09 2 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 

Причины вы не просто использовать двойные кавычки всего сценария, который устанавливает вас сюрпризы позже когда интерпретатор интерпретирует весь сценарий, а не просто переменную, которую вы хотите расширить. например .:

$ 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 видит и интерпретирует оболочку $$ как текущий PID.

+0

'sed -i '/ $ {rui}/d"./Databse.txt', поэтому не теряется цитата и двойная кавычка. Может быть, немного застраховать возможное содержание «rui» especialy witw quote и char как это (и реальная безопасность также из-за пакетного выполнения) – NeronLeVelu

+1

@NeronLeVelu В ответ объясняется, почему вы не должны этого делать. Кудрявые скобки просто разделяют имена переменных из конкатенированного текста иначе ('echo" $ {foo} bar "' как одно из решений для 'echo '$ foobar" ') и позволяют подписать (например,' echo "$ {foo ## x}" ') и операции с массивами, но они не защищают переменную от интерпретации интерпретатора, поэтому' sed '/ $ {rui}/d "' не лучше, чем 'sed'/$ rui/d" '. –

+0

Я не говорю, что моя версия более безопасна, я сказал, что она защищает контент, и его просто читать легче. Ваш пример не вызывает удивления (интерпретация $$ не является частью содержимого переменной foo) и кажется более безопасной, чем вся инкапсуляция с двойной цитатой. Правило заключается в том, чтобы сбежать внутри sed, если двойная кавычка так '' s/$ foo/\ $ \ $/"'. У вас есть образец, где простая цитата об окружающих сведениях (так что держать '' $ rui "') позволит избежать проблемы с содержимым rui? – NeronLeVelu

Смежные вопросы