$ 기호를 사용하여 변수 값을 얻을 수 있다는 것을 알고 있습니다.
x=3
echo $x
3
$ 기호를 사용하지 않고 값을 얻는 데 사용할 수 있는 다른 방법이 있습니까?
$ 기호가 특수 문자이고 이를 수행하려고 할 때 오류가 발생하기 때문에 이렇게 묻습니다 sed
.sed: -e expression #1, char 31: unterminated s' command
A=25 #lineNumber
destStr="192.168.1.3 192.168.1.4"
sed ""$A"s/Allow from .*/Allow from $destStr/" -i test2
destStr
이스케이프 문자를 사용하면 (값 대신) 문자열이 인쇄됩니다 \
.
sed ""$A"s/Allow from .*/Allow from \$destStr/" -i test2
echo
대신 사용하십시오 sed
:
25s/Allow from .*/Allow from 192.168.1.3
192.168.1.4
/ -i test2
답변1
최종 편집에서 볼 수 있듯이 문제는 달러 기호와 관련이 없지만 의 내용으로 인해 발생합니다 deststr
. 이는 192.168.1.3 192.168.1.4
두 줄에 불과하며 하나는 만 포함 192.168.1.3
하고 다른 줄은 192.168.1.4
개행 문자로 끝나는 두 줄입니다. 즉, 변수 대체 후의 실제 명령은 다음과 같습니다.
sed "25s/Allow from .*/Allow from 192.168.1.3
192.168.1.4
/" -i test2
이제 명령줄이 sed
한 줄씩 해석되므로 해석하려는 첫 번째 명령은 다음과 같습니다.
25s/Allow from .*/Allow from 192.168.1.3
이는 분명히 종료되지 않은 s
주문이므로 sed
그렇게 보고됩니다.
이제 찾은 솔루션은 echo
다음과 같이 작동합니다.
echo $var
에코에게 전화 걸기둘인수(공백이 인용되지 않았기 때문에 인수 구분 기호로 해석됨), 첫 번째는 이고 192.168.1.3
두 번째는 192.168.1.4
둘 다 셸에서 더 이상 해석되지 않는 형식입니다.
이제 echo
공백으로 구분된(옵션이 아닌) 인수만 출력되므로 이제 명령줄이 표시됩니다.
sed "25s/Allow from .*/Allow from 192.168.1.3 192.168.1.4/" -i test2
예상대로.
$()
그러나 명령 대체의 경우 백틱은 오류가 발생하기 쉬우므로 가능할 때마다 백틱을 사용해야 합니다 . 따라서 다음은 귀하의 요구 사항을 충족합니다.
sed "$A s/Allow from .*/Allow from $(echo $destStr)/" -i test2
인용을 단순화하기 위해 주소와 명령 사이에 공백이 허용된다는 사실도 활용했습니다 sed
. 이러한 추가 공백이 불가능한 경우 다음 구문을 사용할 수도 있습니다.
sed "${A}s/Allow from .*/Allow from $(echo $destStr)/" -i test2
destStr
이는 공백이 아닌 문자가 쉘이나 sed
대체 문자열에 나타나는 문자 에 의해 해석되지 않는다는 사실에 의존한다는 점에 유의하십시오 .
답변2
echo
다음을 사용하여 문제를 성공적으로 해결했습니다 .
sed ""$A"s/Allow from .*/Allow from `echo $destStr`/" -i test2
하지만 $ 기호를 사용하지 않고 값을 얻을 수 있는 다른 방법이 있는지 알고 싶습니다.
답변3
스크립트에서 다음을 수행할 수 있습니다.
sed -e "${A}s/Allow from .*/Allow from ${destStr}/" -i test2
${variable}
bash가 ${variable}s/...
원하는 방식으로 해석하도록 하는 데 사용합니다 .
답변4
무엇에 대해
sed $A's/Allow from .*/Allow from '$destStr'/' -i test2
destStr에는 흰색이 없다고 가정합니다.
또는
echo $A"s/Allow from .*/Allow from $destStr/" | sed -f - -i test2
두 번째 형태는 흰색을 허용합니다.