파일에 쓰기 전에 변수의 백틱을 이스케이프 처리하고 싶습니다. 불행하게도 이 라인 중 일부에는 불쾌한 항목이 있습니다.
(foo 확장을 피하고 싶습니다. foo="ModPagespeedLoadFromFileRuleMatch disallow .*" 를 문자 그대로 가져와서 대체를 실행하고 싶습니다. 어떤 확장도 원하지 않습니다. 이는 파일에 배치하라는 지시일 뿐입니다.)
foo="ModPagespeedLoadFromFileRuleMatch disallow .*"
echo ${foo//\\/\\\\}
이것은 나에게 다음을 제공합니다:
ModPagespeedLoadFromFileRuleMatch disallow . .. .bash_history .bashrc .cloud-locale-test.skip .filemin .gnupg .local .mysql_history .profile .rnd .rpmdb .ssh
나는 또한 이것을 시도했습니다 :
foo='ModPagespeedLoadFromFileRuleMatch disallow .*';
bar=$( printf "$foo" | sed 's/\\/\\\\/g' );
echo $bar
foo='ModPagespeedLoadFromFileRuleMatch disallow .*';
bar=$( echo "$foo" | sed 's/\\/\\\\/g' );
echo $bar
같은 질문.
내가 여기서 무엇을 놓치고 있는 걸까요?
추신. 이 시도:
foo='ModPagespeedLoadFromFileRuleMatch disallow .*'
echo "$foo"
그런 다음 이것을 시도해 보세요(파이핑할 때 이런 일이 발생하지 않기를 바랍니다).
foo='ModPagespeedLoadFromFileRuleMatch disallow .*'
echo "$foo" |
두 번째 예의 파이프에 주목하세요.
답변:
foo="ModPagespeedLoadFromFileRuleMatch\ disallow .*"
echo "${foo//\\/\\\\}"
foo='ModPagespeedLoadFromFileRuleMatch disallow .*';
bar=$( printf "$foo" | sed 's/\\/\\\\/g' )
echo "$bar"
foo='ModPagespeedLoadFromFileRuleMatch disallow .*';
bar=$( echo "$foo" | sed 's/\\/\\\\/g' );
echo "$bar"
답변1
문제는 전달한 확장에 대한 참조가 없다는 것입니다 echo
.
결과 문자열 필드를 공백으로 된 단어(기본값 가정 $IFS
)로 분할하고 가장 중요한 것은 각 단어에 파일 이름(와일드카드)을 생성하기 위해 인용 해제 확장이 호출됩니다.
그 중 하나는 .*
이것이 현재 디렉토리의 모든 숨겨진 이름으로 확장된다는 것입니다.
대신에:
foo="ModPagespeedLoadFromFileRuleMatch disallow .*"
echo "${foo//\\/\\\\}"
아니면 더 나은,
foo="ModPagespeedLoadFromFileRuleMatch disallow .*"
printf '%s\n' "${foo//\\/\\\\}"
이것은 출력됩니다
ModPagespeedLoadFromFileRuleMatch disallow .*
당신도 같은 문제가 있습니다 echo $bar
.
또한보십시오: