2013-11-21 2 views
0

일부 스크립트 쉘 작업을하고 있는데, 내가 뭘 잘못하고 있는지 잘 모르겠습니다. 코드특수 문자를 바꾸고 쉘 변수에 저장하는 방법은 무엇입니까?

#!/bin/bash 

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

쉘 스크립트는 "sub1"입니다. Sub1에는 세 개의 변수가 전달됩니다. 대체 할 문자열 ($ 1),이를 대체하는 문자열 ($ 2) 및 파일 이름 ($ 3). 위의 코드를 수정하려고 시도합니다. 교체 할 문자가 "*"또는 "."같은 "특수 문자"인 경우 '안전한'버전으로 바꿀 수 있습니다 (예 : "*"). *)

내 코드는 다음과 같습니다. 다음 명령을 내 코드 (./sub2 *의 X의 testcase2)를 테스트하기 위해 입력 그러나

#!/bin/sh 
IFS=' 
' 

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

, 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 스크립트와 같은 디렉토리에 있음). 그래서 문제가되는 이유를 알지 못합니다. 나는 이맥스와 함께 252225788을 열어 그 내용을 보았습니다. 텍스트는 "%%%%%%%%"뿐이었습니다. 나는 여기서하고있는 일에 대해 매우 혼란 스럽다. 처음에는 제 구문이라고 생각했지만, 252225688과의 모든 거래는 완전히 저를 버렸습니다.

편집 : 내가하려는 것은 $ 1 매개 변수에 여러 개의 '안전하지 않은'문자 (예 : [,],., )가있을 수 있습니다. 매개 변수는 ""과 같을 수 있으며 "L *"일 수 있습니다. "w \ o \ r \ d \"일 수 있습니다. 나는 목표 변수 ($ 1 매개 변수)를 쉘 변수 $ target에 넣고 sed 명령을 사용하여 안전한 버전으로 해당 문자 ([,], ^, )를 다시 작성해야한다고 들었습니다. 앞에 백 슬래시를 추가하거나 []로 둘러 쌀 수 있습니다. 그런 다음 재 작성된 문자열을 다른 쉘 변수 ($ newtarget)에 저장합니다. 내 "sed '/" "/"/ * "/ g'"거래로 실제 교체 (sed, 셸 변수 다시 쓰기)를 할 것이라고 가정했지만 분명히 그것에 대해 올바른 방법이 아닙니다.

+0

@pfnuesel 명령 줄에서'*'를 인용 할 필요 외에도 몇 가지 오류가 있습니다. 쉘 스크립트 안에서'$ 1'은 쉘 스크립트에 부여한 첫 번째 인수로 대체됩니다.대입 문의 왼편에 이것을 원하지는 않습니다. 'target = "$ 3"'이라고 쓰고 싶습니까? 변수와 = 사이에 공백을 넣지 마십시오. 또한, *는'sed '에게 특별하다. 's/* // */g'이해야 할 일을 말해 줄 수 있습니까? 다시 작성하는 데 도움을 드리겠습니다. –

+0

죄송 합니다만, 이전의 s/* // */g가 "*"문자의 인스턴스를 찾아 "/ *"로 바꾸기로되어있는 것을 보지 못했습니다. 그것은 현명하다. $ 1 비트의 경우, $ target과 $ target을 같게하고, $ target으로 $ target에 저장하고, $ newtarget에 저장 한 다음 다시 $ 1에 저장해야합니다. – JC2112

+0

내 주요 질문을 편집했습니다. – JC2112

답변

0

*은 현재 디렉토리의 파일 목록으로 쉘로 확장됩니다.이를 glob 확장 또는 globbing이라고합니다. 당신이 * 에코하려는 경우, 당신은 그것을

$ echo \* 
> * 

탈출 또는

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

또 다른 옵션은 글로브 확장을

을 해제하는 것입니다 따옴표에 넣어 필요

$ echo * 
> file1 
> file2 
... 

시도

$ set -f 
$ echo * 
> * 

그러나 glob 확장은 좋은 일이므로 원하는 것을 원하지는 않습니다.

따라서 문자로 *을 스크립트로 전달하려면 이스케이프하거나 주위에 따옴표를 넣으십시오.

관련 문제