Bash 대체는 디렉토리 구조를 보여줍니다

Bash 대체는 디렉토리 구조를 보여줍니다

파일에 쓰기 전에 변수의 백틱을 이스케이프 처리하고 싶습니다. 불행하게도 이 라인 중 일부에는 불쾌한 항목이 있습니다.

(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.

또한보십시오:

관련 정보