有什么方法可以stdin
在展开之前或 shell 对其执行任何操作之前读取原始文本吗?假设我想运行一个脚本,其中用户输入一个字符串然后打印出来,我怎样才能获得以下行为:
$ 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
扩展(如果有的话)是在您打印时发生的,而不是在您阅读时发生的。 (正如贾尔斯所说,神奇之处在于 %q。但即使 echo "$var" 也没有扩展)。 Read 将所有文字字符获取到变量中,反斜杠除外。裸变量的回声被扩展。 “quote”字符串中变量的回显不会扩展:
xxmetac.sh:
#!/bin/bash
read str
echo you entered:
echo $str
echo "$str"
测试:
$ ls
file1 file2 file3
$ xxmetac.sh
*
you entered:
file1 file2 file3
*
而且大多数 shell 元字符即使在回显时也并不特殊。可能只有文件通配符:
*?[-]{,}
不特别:
!#@$^%()|<>
$ xxmetac.sh
>
you entered:
>
>
$ xxmetac.sh
|
you entered:
|
|
$ xxmetac.sh
@$^%()|<>
you entered:
@$^%()|<>
@$^%()|<>
他们很特别在命令行上
$ !#@$^%()|<>
@$^%()|<>
bash: syntax error near unexpected token `|'