.png)
stdin
확장하기 전이나 쉘이 작업을 수행하기 전에 원시 텍스트를 읽을 수 있는 방법이 있습니까 ? 사용자가 문자열을 입력한 다음 인쇄하는 스크립트를 실행한다고 가정해 보겠습니다. 어떻게 다음 동작을 얻을 수 있습니까?
$ sh test.sh
Please enter a string:
***<><><||&&*&$PATH
You entered:
***<><><||&&*&$PATH
''
사용자가 그렇게 하지 않더라도 암시적으로 텍스트를 모든 메타 문자로 묶거나 모든 메타 문자를 이스케이프하는 방법이 있습니까 ?
답변1
이 시도:
$ read -r -p 'Please enter a string >>> ' var
$ printf '%q\n' "$var"
\*\*\*\<\>\<\>\<\|\|\&\&\*\&\$PATH
답변2
확장(있는 경우)은 읽을 때가 아니라 인쇄할 때 발생합니다. (Giles가 말했듯이 마법은 %q에 있습니다. 그러나 echo "$var"조차도 확장되지 않습니다.) Read는 백슬래시를 제외한 모든 리터럴 문자를 변수로 가져옵니다. 노출된 변수의 에코가 확장됩니다. "인용문" 문자열의 변수 에코는 확장되지 않습니다.
xxmetac.sh:
#!/bin/bash
read str
echo you entered:
echo $str
echo "$str"
시험:
$ ls
file1 file2 file3
$ xxmetac.sh
*
you entered:
file1 file2 file3
*
그리고 대부분의 쉘 메타문자는 에코될 때에도 특별하지 않습니다. 파일 와일드카드만 가능합니다.
*?[-]{,}
특별하지 않다:
!#@$^%()|<>
$ xxmetac.sh
>
you entered:
>
>
$ xxmetac.sh
|
you entered:
|
|
$ xxmetac.sh
@$^%()|<>
you entered:
@$^%()|<>
@$^%()|<>
그들은 특별해요명령줄에서
$ !#@$^%()|<>
@$^%()|<>
bash: syntax error near unexpected token `|'