Bash 스크립트의 명령을 다른 스크립트의 명령으로 바꾸기

Bash 스크립트의 명령을 다른 스크립트의 명령으로 바꾸기

Mac OS X에서 작동하지 않는 명령이 포함된 스크립트가 있는 github에서 변경 사항을 가져오는 스크립트를 설정하려고 합니다.
내 목표는 etc를 사용하여 sed이 스크립트의 명령을 대체하는 것입니다.

다음 명령은 다음과 같습니다.

원래 명령(스크립트에서 대체됨):

DIR=$(dirname "$(readlink -f $0)")

새 명령(대체하고 싶은 명령):

DIR="$(cd "$(dirname "$0")" && pwd -P)"

내가 지금까지 시도한 것 :

StartStopScript="/path/to/script.sh"

DIRnew=""$(cd "$(dirname "$0")" && pwd -P)""

DIRold=""$(dirname "$(readlink -f $0)")""

echo "$StartStopScript" | sed -e 's/"$DIRold"/"$DIRnew"/g'

이는 실패하고 명령은 문자열로 해석되지 않고 실행되는 것 같습니다.
그림은 따옴표로 귀결됩니다 sed.

제가 받을 수 있는 도움에 감사드립니다.

답변1

OrigScript="/path/to/script.sh"
echo $OrigScript
/path/to/script.sh
#note: no quotes
OrigScript='"/path/to/script.sh"'
echo $OrigScript
"/path/to/script.sh"
#note: with quotes, but not good for filesnames, rather use "$filename" in the command argument


DIRnew='"$(cd "$(dirname "$0")" \&\& pwd -P)"'
echo $DIRnew
"$(cd "$(dirname "$0")" \&\& pwd -P)"
#note: with quotes, escaping & needed for suppressing interpretation by sed

DIRold='"$(dirname "$(readlink -f $0)")"'
echo $DIRold
"$(dirname "$(readlink -f $0)")"
#note: in your question the original DIR=.. did NOT have double quotes,
#I assume a typo

sed -e "s/$DIRold/$DIRnew/g" "$OrigScript"
#note: $OrigScript should NOT have the double quotes in it!
#note: I assume $OrigScript == $StartStopScript

#test:
echo $DIRold | sed "s/$DIRold/$DIRnew/"
"$(cd "$(dirname "$0")" && pwd -P)"
#result includes double quotes!

1) (큰) 따옴표를 사용하여 변수를 선언하려면 따옴표가 문자열 내에 포함되도록 따옴표를 이스케이프해야 하며, 가급적 작은 따옴표를 사용하여 내부 문자열이 완전히 문자열이고 변수가 해석되지 않도록 해야 합니다. 이는 또한 &의 사용을 단순화하고 $()쉘이 이를 해석하지 않기 때문에

2) echoing(큰따옴표)의 경우 이스케이프 처리하세요.

sed3) 쉘 변수가 해석되도록 하려면 sed명령 주위에 큰따옴표를 사용해야 합니다. 작은따옴표를 사용하면 명령은 sed 's/$a/$b/'실제 ​​문자열 '$a'를 문자열 '$b'로 바꾸려고 시도합니다. 특수 사례 $) 의미 , 임의의 문자가 포함된 문자열과 마찬가지로 sed명령의 변수 주위에 sed큰따옴표가 필요하지 않습니다 (특수 명령 문자에 대한 제한 사항 있음 ).sedsed

4) echo "$StartStopScript" | sed -e 's/"$DIRold"/"$DIRnew"/g'변수를 에코하고 $StartStopScript(이것은 스크립트의 파일 이름일 뿐이라고 가정합니다) 해당 문자열에서 변수(예: 파일 이름)를 바꾸려고 합니다. sed파일 에 적용하려면 sed 's/a/b/g' file(output-write stout)를 사용하고, 파일을 덮어쓰려면 -i(주의해서 사용하십시오. 즉, 올바른 교체를 먼저 테스트하십시오)

5) 는 초기(일치하는) 패턴을 다시 인쇄하는 &에서 특별한 의미를 갖습니다 .sed

echo ABC | sed 's/A/&12/'
A12BC

해석을 억제하려면 대체 패턴에서 이스케이프해야 합니다.

echo ABC | sed 's/A/\&12/'
&12BC

따라서 변수는 $DIRnew문자열에서 백슬래시를 이스케이프 처리해야 합니다.

6) 그 외에도 루프를 사용하여 if운영 체제를 식별하고 그에 따라 명령을 조정하는 것이 좋습니다. 이렇게 하면 두 운영 체제 모두에 대해 하나의 스크립트만 필요합니다. 즉

if [ OS = Mac ] ; then
    dir=MacDir
else
    dir=LinuxDir
fi

관련 정보