2013-05-08 108 views
1

我想一個sed命令開始存儲這樣的變量中:bash命令可變

sedcmd="sed -i '' " 

後來我則像這樣執行命令:

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

而且它不沒有工作。使用bash -x運行腳本,我可以看到它正在展開如下:

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

表達此問題的正確方法是什麼?

+1

參見[BashFAQ#50:我想在一個變量把一個命令,但是複雜的情況下總是失敗!](http://mywiki.wooledge.org/BashFAQ/050)。 – 2013-05-08 14:32:11

回答

3

定義一個shell函數:

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

,並調用它像這樣:

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

我錯過了@larsmans在他的回答結束時提出這個建議。 – chepner 2013-05-08 14:31:52

+0

沒關係,+1給你。 – 2013-05-08 15:35:54

0

爲什麼不使用別名或函數?你可以做別名

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

測試它像:#!/斌/慶典 別名sedcmd = 「SED -i'」 sedcmd 給出:./test.sh:4號線:sedcmd:找不到命令 – steprobe 2013-05-08 14:31:58

+2

別名默認情況下不開啓中非交互式shell,這是使用shell函數的原因之一。但是你可以使用'shopt -s expand_aliases'打開別名。 – chepner 2013-05-08 14:34:22

0

這是做

alias sedcmd="sed -i ''" 

顯然記住,當你閉上你的bash,這個別名將會消失的正確途徑。
如果您想使其成爲「永久性」,則必須將其添加到您的.bashrc主文件(如果您只想爲單個用戶創建此文件)或.bashrc全局文件中,如果您想讓它適用於所有用戶

2

它的工作原理時,該命令只有一個字長:

$ LS=ls 
$ $LS 

但在你的情況,外殼嘗試執行程序sed -i '',它不存在。

的解決方法是使用$SHELL -c

$ $SHELL -c "$LS" 
total 0 

(而不是$SHELL,你也可以說bash,但是當有多個擊安裝這不完全可靠的,外殼是不實際的Bash等。)

然而,在大多數情況下,我會實際使用shell函數:

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

不太確定你想要做什麼,但我的建議是:

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

你必須在你的shell首先設置變量orig_pkgpackage_namef

如果你在一個文件替換變量名,嘗試:

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

不過f必須設置爲你的工作文件名。