簡體   English   中英

如何替換特殊字符,然后將其存儲到shell變量中?

[英]How to replace special character, and then store that into a shell variable?

我正在做一些腳本外殼工作,但我不確定自己在做什么錯。 編碼

#!/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僅包含文本“ test * test”,我得到以下錯誤。

 ./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變量中,就像我一樣,將$ target放入一個shell變量中,然后使用sed命令將這些字符([,],^,那些字符)重寫為安全版本,方法是在前面添加反斜杠,或將其用[]包圍。 然后,我會將字符串的重寫版本存儲到另一個shell變量($ newtarget)中。 我以為我將用“ sed's /” “ /” / *“ / g'”處理實際替換(sed,重寫shell變量) ,但是顯然這不是正確的方法。

*由Shell擴展到當前目錄中的文件列表,這稱為glob擴展或globbing。 嘗試

$ echo *
> file1
> file2
...

如果要回顯* ,則需要對其進行轉義

$ echo \*
> *

或用引號引起來

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

另一個選擇是關閉全局擴展

$ set -f
$ echo *
> *

但您不太希望那樣做,因為全局擴展是一件好事。

因此,如果您想將*作為字符傳遞給您自己的腳本,請對其進行轉義或將引號引起來。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM