2013-05-08 3 views
1

Я пытаюсь сохранить начало SED команды внутри переменной, как это:Bash в качестве переменной

sedcmd="sed -i '' " 

Позже я тогда выполнить команду следующим образом:

$sedcmd s/$orig_pkg/$package_name/g $f 

И это Безразлично Не работай. Запуск сценария с Баш -x, я могу видеть, что она расширяется, как:

sed -i ''\'''\''' 

Что такое правильный способ выразить это?

+1

См [BashFAQ # 50: Я пытаюсь поставить команду в переменной, но сложные случаи всегда терпит неудачу!] (http://mywiki.wooledge.org/BashFAQ/050). –

ответ

3

Определим функцию оболочки:

mysed() { 
    sed -i "" "[email protected]" 
} 

и назвать его так:

$ mysed s/$orig_pkg/$package_name/g $f 
+0

Я пропустил, что @larsman предлагает это в конце своего ответа. – chepner

+0

Это нормально, +1 к вам. –

0

Почему бы не использовать псевдоним или функцию? Вы можете сделать псевдоним в качестве

alias sedcmd="sed -i '' " 
+0

Тестирование это нравится: #!/Bin/Баш псевдоним sedcmd = "СЕПГ -i ''" sedcmd дает: ./test.sh: строка 4: sedcmd: команда не найдена – steprobe

+2

псевдонимы не включена по умолчанию в неинтерактивные оболочки, что является одной из причин использования функции оболочки. Но вы можете включить псевдонимы, используя 'shopt -s expand_aliases'. – chepner

0

Это правильный путь для делать

alias sedcmd="sed -i ''" 

Очевидно помните, что когда вы закрываете Баш, этот псевдоним будет.
Если вы хотите сделать его «постоянным», вы должны добавить его в свой домашний файл .bashrc (если вы хотите сделать это только для одного пользователя) или .bashrc глобальный файл, если вы хотите сделать его доступным для всех пользователей

2

Он работает, когда команда только одно слово длиной:

$ LS=ls 
$ $LS 

Но в вашем случае, оболочка пытается выполнить программу sed -i '', которая не существует.

Для устранения этой проблемы использовать $SHELL -c:

$ $SHELL -c "$LS" 
total 0 

(Вместо $SHELL, вы могли бы также сказать bash, но это не совсем надежным, когда есть несколько установок Bash, оболочка фактически не Bash, и т.д. .)

Однако, в большинстве случаев, я на самом деле использовать функцию оболочки:

sedcmd() { 
    sed -i '' "[email protected]" 
} 
0

Не совсем уверен, что вы пытаетесь сделать, но мое предложение:

sedcmd="sed -i " 
$sedcmd s/$orig_pkg/$package_name/g $f 

Вы должны установить переменные orig_pkgpackage_name и f в вашей оболочке первой.

Если вы заменяете имена переменных в файле, попробуйте:

$sedcmd s/\$orig_pkg/\$package_name/g $f 

Еще f должен быть установлен в имени файла вы работаете.

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