我正在做一些腳本外殼做工,我不完全知道我在做什麼錯。代碼如何替換特殊字符,然後將其存儲到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變量),但顯然這不是正確的解決方法。
除了需要在@pfnuesel所說的命令行中引用'*'外,還有一些錯誤。在一個shell腳本中,'$ 1'被你給shell腳本的第一個參數所取代。這是不太可能的,你需要在賦值語句的左邊。你有沒有想寫'target =「$ 3」'? (不要在變量和=之間放置任何空格)。另外,*對於'sed'特別。你能告訴我們'/ */*/g'應該做什麼嗎?我們會幫你改寫它。 –
對不起,我以前沒有看到s/* // */g應該找到「*」字符的實例,並用「/ *」取代,因爲我認爲這是我的做法它的語法明智。對於$ 1位,我只需要$ target等於$ 1參數,使用$ target執行所需操作,將其保存到$ newtarget,然後將值保存回$ 1 – JC2112
編輯我的主要問題。 – JC2112