从命令行获取原始输入(忽略 shell 元字符)

从命令行获取原始输入(忽略 shell 元字符)

有什么方法可以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 `|'

相关内容