2014-04-29 135 views
1

我已經改變了從外殼到dashbash 4.2.37 Debian的7SED變量替換使用bash

現在,下面不工作下去:

sed -i.bak "/${VARIABLE}/d" /path/file 
sed -i.bak '/'$VARIABLE'/d' /path/file 

這將產生:

sed: -e expression #1, char 0: no previous regular expression 

使用bash 3.2在OS X上,按預期工作

+6

如果'$ VARIABLE'爲空,你會得到這個錯誤信息。故意有空嗎?在這種情況下,你對命令的期望是什麼? –

+0

不要空。 $ VARIABLE的IP通過了第一個參數bash腳本。 ./script.sh IP – abkrim

+0

看到您的評論後就可以了。驗證傳遞給腳本的第二個參數是否爲空。 ./script.sh主機名短名稱。用echo $ 1驗證主機名,好,但是echo $ 2返回空值。 – abkrim

回答

1

包裝在一個if語句:

if [[ ! -z $VAR ]]; then 
    sed -i.bak /"${VAR}"/d test; 
fi 

或作爲oneliner:

if [[ ! -z $VAR ]]; then sed -i.bak /"${VAR}"/d filename.txt; fi 

或者更簡單:

[[ ! -z $VAR ]] && sed -i.bak /"${VAR}"/d filename.txt 

原來的答案: 對我來說,以下工作:

sed -i.bak /"$VARIABLE"/d /path/file 

GNU Bash 4.2-2ubuntu2.1

+0

增加了一些替代品 –

2

無論您的shell如何,sed語法錯誤都是相同的。如果VARIABLE爲空,那就是你所得到的。

更改shell可能會更改定義了哪些變量。例如,BASH_VERSION顯然只會在Bash中設置。或者你可以在你的.bashrc本地定義變量,Dash不會讀取;有許多其他啓動文件是Bash使用的,但Dash沒有。

你可以做的是改變你的腳本需要VARIABLE進行設置:

: ${variable?Not set} 

這是一個常見的Bourne shell成語退出如果一個變量沒有設置。 :僞命令就像一個註釋,但它評估它的參數;和${variable?Message}當評估將退出外殼Message如果variable未設置。

+0

我更傾向於使用'$ {var:-default value}',但是當你真的想退出時,使用'$ {var?-doh}'。在'?'或':'之後添加'-'使其適用於「未設置或空白」,而不是「未設置」,這通常是我使用其中任何一種時的意思。 – dannysauer