同一bash输入中的单引号和双引号

时间:2019-04-02 22:35:53

标签: bash character-encoding

我想为bash读取函数提供输入,该函数同时包含单引号和双引号,然后将其与存储的值进行比较。

此脚本在启动时会随机询问一个问题,以查找我要记住的某些命令的正确语法。但是其中一些命令包含单引号和双引号,那么如何使用bash处理呢?

#!/bin/bash

echo "What is the secret string?"
read secret

if [ "$secret" = "123" ]
then
  echo "You're Awesome!!!"
else
  echo "You're memory sucks!!"
fi

因此,如果$ question是“嗨,我的名字是'Ed'”,并且在同一输入中包含单引号和双引号,那么我该如何处理这种魔术?

3 个答案:

答案 0 :(得分:0)

没有魔法可以工作。用户输入的内容在您的脚本中永远不会成为语法-绝不会被评估为代码-因此它可以包含任何内容。 *

* NUL字符(\ 0)本身除外,因为它是字符串终止符。

答案 1 :(得分:0)

read包含引号的字符串不需要任何特殊要求,但是我会使用read -r来防止它与反斜杠混淆。您还可以使用-p选项来提供提示(而不是echo单独提供提示):

read -r -p "What is the secret string? " secret

这里唯一棘手的事情是指定要比较的字符串。一种选择是将其表示为双引号字符串,并用反斜杠对其中的双引号进行转义。您还需要以相同的方式转义任何美元符号,反引号或反斜杠:

if [ "$secret" = "dq: \", sq: ', dollar: \$" ]
then
        echo "You're Awesome!!!"
else
        echo "Your memory sucks!!"
fi

这是上面代码的示例运行:

$ ./secrettest.sh
What is the secret string? dq: ", sq: ', dollar: $
You're Awesome!!!

答案 2 :(得分:0)

我的问题是关于在代码中指定Gordon提到的字符串,而不是从输入中读取它。我在原件中没有使用双引号和单引号,这就是为什么它不起作用的原因。 所以

if [ "$secret" = "command \'with \"options\"\'" ]

应该是这个

if [ "$secret" = "command 'with \"options\"'" ]

谢谢大家。