在bash命令行中了解read,echo和grep命令

卡尔提克·拉伊(Karthick Raj)

谁能一步一步解释这bash行中会发生什么?我是这里的新手,试图了解这段代码的工作原理,尤其是从echo

read char; echo -e "YES\nNO\n" | grep -i $char
库萨兰达

该行上的命令char可能会从用户以交互方式将字符串读取到变量中

echo+grep管道尝试确定输入的字符串是否是肯定与否。它通过不区分大小写地将单词YESNO输入的字符串(以输入的字符串作为模式)相匹配来做到这一点如果用户输入单词中存在的大写或小写字符或子字符串YES,则结果为YES; 如果他们输入字符串中存在的大写或小写字符或子字符串NO,则结果为NO输入类似的内容maybe将导致输出为空。

这种方法的缺点是,如果用户输入,例如,.,都YESNO将匹配作为grep将治疗的点为正则表达式相匹配的任何字符。由于$char在对的调用中未加引号grep,因此如果用户输入诸如输入之类的shell遍历模式,则也有可能导致对机器的拒绝服务攻击/*/*/*/*/../../../../*/*/*/*(示例取自于安全性,忘记了在bash中引用变量) / POSIX shell)。您还可以通过输入eg来引起命令输出混乱-r -o -e . /例如,将单独输出一行中每个非二进制文件的每个字符,然后输出其所属文件的路径名)。

您显示的代码是“奇怪且不寻常的”,因为它将用户输入用作本质上是代码的东西,即,它将用户输入用作模式,并针对此可变模式测试静态数据这与通常所做的相反,后者从用户那里获取输入,并根据静态模式测试此可变数据。

更常见的是使用类似于以下内容的代码:

read -p 'Yes/[N]o: ' yesno
if [[ $yesno == [Yy]* ]]; then
   # code for affirmative
else
   # code for non-affirmative
fi

上面的代码从用户读取一个字符串,并测试它是否以ayY字符开头if如果这样做,则将采用语句的第一个分支,但默认情况下将采用该else分支。

显然,您也可以对整个单词进行测试YES,或者[Yy][Ee][Ss]对大小写不敏感的匹配进行测试,或者通过验证进行适当的输入循环:

while true; do
    read -p 'Yes/No: ' yesno

    if [ "$yesno" = Yes ] || [ "$yesno" = No ]; then
        break
    fi

    echo 'Please enter "Yes" or "No"' >&2
done

# $yesno is either Yes or No here

(或类似的内容)。

请注意,以上两个示例代码如何仅将用户输入用作数据,而不用作模式。

最少地将原始命令重写为一些惯用的东西(但功能上有所不同,并且可能并非万无一失)会将其转换为

read yesno; printf '%s\n' "${yesno^^}" | grep -i -w -E 'yes|no'

这将返回大写YES或者NO是用户输入yesno这在功能上有所不同,因为例如,它要求用户键入的内容不只是eyes

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

BASH:grep在shell脚本中不起作用,但是echo显示正确的命令,并且可以在命令行中使用

来自分类Dev

bash命令行中的Echo Regex匹配组

来自分类Dev

shellshock bash修复程序破坏了诸如echo和cat之类的基本命令行工具吗?

来自分类Dev

传递命令行参数和命令行参数

来自分类Dev

如何设置和确定Bash的命令行编辑模式?

来自分类Dev

Bash别名/功能和命令行选项

来自分类Dev

在 bash 中解析命令行参数和标志的组合

来自分类Dev

grep命令行的readProcess的实现?

来自分类Dev

Bash:多个命令行替换

来自分类Dev

BASH /命令行的字节数

来自分类Dev

cURL命令行登录(bash)

来自分类Dev

通过Bash传递命令行参数

来自分类Dev

从bash命令行设置php变量

来自分类Dev

如何更改命令行(bash)提示?

来自分类Dev

如何更改命令行(bash)提示?

来自分类Dev

Bash:多个命令行替换

来自分类Dev

从命令行执行bash函数

来自分类Dev

BASH /命令行的字节数

来自分类Dev

从bash命令行下载Java的Heredoc

来自分类Dev

通过Bash传递命令行参数

来自分类Dev

传递包含#的bash命令行参数

来自分类Dev

遍历Bash中的命令行参数

来自分类Dev

分割bash命令行参数

来自分类Dev

从bash命令行设置php变量

来自分类Dev

Bash参数替换:命令行与脚本

来自分类Dev

在bash脚本中获取命令行

来自分类Dev

Bash无法从命令行执行

来自分类Dev

在bash命令行上如何*解释?

来自分类Dev

从 bash 命令行删除邮件