将用户输入存储为允许空格和特殊字符的字符串吗?

时间:2019-02-14 17:54:54

标签: bash

我正在尝试编写一个脚本,该脚本将用户输入存储为字符串。这些是要求:(将一串字符作为输入,包括特殊字符,空格和&c)

到目前为止,我正在使用以下内容:

read -p 'input here' userinput

这用于将输入定义为存储变量。有人告诉我,这需要正则表达式来解决,但我不确定该正则表达式在哪里出现,因为据我所知,read解释特殊字符没有问题。

万一需要,我想出的正则表达式是[a-zA-Z0-9&*$#@!%\s]

我只是想知道在哪里使用此正则表达式为上述正则表达式定义字符类。

2 个答案:

答案 0 :(得分:1)

读取输入行而不弄乱输入的标准方法是:

IFS= read -r -p 'input here' userinput

-r(“原始”)选项告诉read不要将输入中的反斜杠解释为转义符(尤其是在该行的末尾,它不是连续标记)。 IFS=部分在这里是因为read将在输入的开头和结尾处修剪空白。 “空白”是由IFS变量定义的,因此将其设置为none意味着不会进行任何裁剪。请注意,对IFS的分配是read命令的前缀,因此它只影响一个命令,而不必在以后将其重新设置为正常。哦,不要留出IFS=read之间的空格,否则就意味着完全不同。

顺便说一句,正则表达式(输入中允许使用字符吗?)看起来像使用\s来表示空间。这是一种Perlism,许多正则表达式引擎不会识别它(或者将其解释为两个单独的字符:反斜杠和字母“ s”)。确保为要使用的工具使用正确的regrex方言。

答案 1 :(得分:0)

如果我理解您的问题,那么您需要使用-r的{​​{1}}选项(例如,

)来禁用单词拼写并将反斜杠视为普通字符。
read

来自man bash:

  

#!/bin/bash IFS= read -rp 'input here ' userinput echo "'$userinput'" 反斜杠不充当转义字符。反斜杠是   被认为是生产线的一部分。特别是反斜杠换行符   对不能用作行延续。

在命令开头设置-r会禁用单词拆分功能,使您可以读取开头和结尾的空格。

使用/输出示例

具有两个前导空格和两个尾随空白:

IFS=

具有两个前导空格和两个尾随空格,并且您的字符类带有特殊字符:

$ bash readall.sh
input here   two preceeding and two trailing
'  two preceeding and two trailing  '

我看到@GordanDavisson得到了相同的结果。伟大的思想家也是如此。

如果您还有其他问题,请告诉我。