쉘 변수를 큰따옴표로 묶으면 혼란스러워집니다.
특히 다음 sed 대체 명령을 사용합니다.
sed -i.tmp "/$MY_VAR/d" /foo/bar/file.txt
그러나 나는 인용하지 않습니다 $MY_VAR
. 맞습니까? 그렇지 않다면 어떻게 인용할 수 있습니까?
다음은 분명히 작동하지 않습니다
sed -i.tmp '/"$MY_VAR"/d' /foo/bar/file.txt
답변1
첫 번째 명령에서는예참조 변수.
두 번째 명령줄 인수로 전달된 문자열에는 sed
큰따옴표가 있고 변수는 이 따옴표 안에 있으며 셸에 의해 확장됩니다.
지적했듯이 두 번째 명령은 작은 따옴표로 묶인 변수 값을 쉘이 확장하지 않기 때문에 (예상대로) 작동하지 않습니다.
$MY_VAR
첫 번째 명령은 정확하지만 슬래시를 포함하면 문제가 발생합니다. 그렇다면 sed
다음에 나타나지 않는 패턴에 대한 구분 기호를 선택하십시오 $MY_VAR
.
sed "\@$MY_VAR@d"
변수는선두따옴표 안에 나타날 때. 변수를 "엄격하게 인용"할 필요는 없습니다.선두. 즉 "hello $world!"
, 문자열 내에서는 $world
로 표시되지 않더라도 변수를 참조합니다 "$world"
.
중요한 것은 전체 문자열이 인용된다는 것입니다. 큰따옴표를 사용하면 쉘은 그 안에 있는 모든 변수를 확장합니다.
위의 예에서는 문자열이 "\@$MY_VAR@d"
참조되고 그 안에 변수가 $MY_VAR
있으므로 역시 참조됩니다(인용된 문자열 안에 있기 때문입니다).