2013-11-21 25 views
0

我正在做一些腳本外殼做工,我不完全知道我在做什麼錯。代碼如何替換特殊字符,然後將其存儲到shell變量中?

#!/bin/bash 

IFS=' 
' 
sed s/"$1"/"$2"/g "$3" > "$3.updated" 
mv "$3.updated" $3 

是一個名爲「sub1」的shell腳本。 Sub1傳遞三個變量;一個要替換的字符串($ 1),一個替換它的字符串($ 2)和文件名($ 3)。我試圖修改上面的代碼,這樣,如果要被替換的字符是一個「特殊字符」,(如*或/或),我可以在角色替換成一個「安全」的版本(即「*」是*)

我的代碼如下。

#!/bin/sh 
IFS=' 
' 

"$1" = $target 
sed 's/*//*/g' "$target" > "$newtarget" 
"$1" ="$newtarget" 
sed s/"$1"/"$2"/g "$3" > "$3.updated" 
mv "$3.updated" $3 

然而,當輸入下面的命令來測試我的代碼(./sub2 * X testcase2),testcase2只包含文本「測試*測試」,我得到以下錯誤。

./sub2: 5: ./sub2: 252225688.dat: not found 
./sub2: 6: ./sub2: cannot create : Directory nonexistent 
./sub2: 7: ./sub2: 25225688.dat: not found 

我對這些錯誤背後的原因非常困惑;我的代碼中沒有調用252225788.dat(儘管它與我的sub2腳本位於同一目錄中),所以我不知道爲什麼這甚至會成爲問題。我用emacs打開了252225788,看看它包含了什麼,只有文本「%%%%%%%%」。對於我應該在這裏做什麼,我感到非常困惑。起初,我認爲這只是我的語法,但與252225688的整個交易已經完全拋棄了我。

編輯: 我想要做的是,1 $參數可以有一些「不安全」內的字符(即,[,],,)。參數可能只是「」之類的東西,可能是「L *」,可能是「w \ o \ r \ d \」。有人告訴我,我應該把目標字符串($ 1參數)到一個shell變量,$目標像我一樣,然後用sed命令重寫這些字符([,],^,,那幾件)進入安全版本通過在前面添加反斜槓,或者用[]來包圍它們。然後,我會將該字符串的重寫版本存儲到另一個shell變量($ newtarget)中。我以爲我會用我的「sed's /」「/」/ *「/ g'」處理去實際替換(sed,重寫shell變量),但顯然這不是正確的解決方法。

+0

除了需要在@pfnuesel所說的命令行中引用'*'外,還有一些錯誤。在一個shell腳本中,'$ 1'被你給shell腳本的第一個參數所取代。這是不太可能的,你需要在賦值語句的左邊。你有沒有想寫'target =「$ 3」'? (不要在變量和=之間放置任何空格)。另外,*對於'sed'特別。你能告訴我們'/ */*/g'應該做什麼嗎?我們會幫你改寫它。 –

+0

對不起,我以前沒有看到s/* // */g應該找到「*」字符的實例,並用「/ *」取代,因爲我認爲這是我的做法它的語法明智。對於$ 1位,我只需要$ target等於$ 1參數,使用$ target執行所需操作,將其保存到$ newtarget,然後將值保存回$ 1 – JC2112

+0

編輯我的主要問題。 – JC2112

回答

0

*由shell擴展到當前目錄中的文件列表,這稱爲glob擴展或通配符。嘗試

$ echo * 
> file1 
> file2 
... 

如果你想呼應*,你需要逃避它

$ echo \* 
> * 

或把它放在引號

$ echo "*" 
> * 
$ echo '*' 
> * 

另一個選項是關閉水珠擴張

$ set -f 
$ echo * 
> * 

,但不太可能是你想要的,因爲glob擴展是件好事。

所以,如果你想通過*的性格是你的一個腳本,逃避它或把它周圍的報價。