如何“读取”并回显用户输入的内容?

如何“读取”并回显用户输入的内容?

我正在编写这个脚本:当你输入

"my name is [your name]"

它告诉你

"hi, [your name]".

但是,我不知道如何制作[your name]您输入的任何内容。我制作了一个具有特定名称的脚本,但我希望它能够回显用户输入的任何名称:

#!/bin/bash
read -p "Say something: " sth
  if [[ $sth = "my name is ralph" ]]
      then
          echo "Hi $(echo $sth | cut -f 4 -d ' ')"
  else
      echo "I didn't understand that"
  fi

因此这将会回显Hi ralph,但如何让它回显Hi [your name]您输入的任何名称?

答案1

你没有给出具体细节,但一般来说你捕捉到了姓名像这样。

#!/bin/bash   

regex='[Mm]y(\ name\ is\ )(\w*)'

read -p "Say something: " response

echo $response

if [[ "$response" =~ $regex ]]; then

        name=$(echo $response | cut -d' ' -f4)

        echo "Hi $name"
else
        echo "I didn't understand that"

fi

答案2

您可以使用正则表达式测试=~来捕获之后的内容my name is

$ read -rp "Say something: "; if [[ "$REPLY" =~ [Mm]y\ name\ is\ .* ]]; then echo "Hi "${REPLY:11}"" ; fi
Say something: my name is zanna
Hi zanna

在这里我用了一个参数扩展删除前 11 个字符(my name is)并打印其后的内容,但如果用户输入的内容不止他们的名字,结果可能不是您想要的:

Say something: my name is pixie and I eat flowers
Hi pixie and I eat flowers

乔治的回答使用仅打印第 4 个字段来处理此问题cut(但我猜用户可能会输入My name is Super Rainbow Unicorn并且您可能不希望 shell 仅回复Hi Super)。

更具可读性,并带有else

read -rp "Say something: "
if [[ "$REPLY" =~ [Mm]y\ name\ is\ .* ]]
  then 
    echo "Hi "${REPLY:11}""
  else
    echo "I didn't understand that."
fi

答案3

Zanna 和 George 都正确地使用了正则表达式,但实际上并没有使用 Bash 的正则表达式支持来提取姓名。例如:

regex='[Mm]y(\ name\ is\ )(\w*)'
read -p "Say something: " response

if [[ "$response" =~ $regex ]]; then

正则表达式测试完成后[[ ]],bash 会提供数组中匹配的正则表达式组BASH_REMATCH。例如(输入My name is foo bar baz):

$ printf "%s\n" "${BASH_REMATCH[@]}"
My name is foo
 name is 
foo

因此,稍微修改一下组:

$ regex='My name is (\w.*)'
$ [[ "$response" =~ $regex ]]
$ printf "%s\n" "${BASH_REMATCH[@]}"
My name is foo bar baz
foo bar baz

更好的是,你可以告诉 bash 使用不区分大小写的正则表达式匹配:

shopt -s nocasematch

综合以上所有:

regex='My name is (\w.*)'
read -rp "Say something: "
shopt -s nocasematch
if [[ $REPLY =~ $regex ]]
then 
    echo "Hi ${BASH_REMATCH[1]}"
else
    echo "I didn't understand that."
fi

(此外,这有助于很容易地提取名字的第一个单词或最后一个单词。)

答案4

从其他人的回复中得到这个,然后我自己做了一些修改。这只是一个简单的东西,你可以轻松地将其变成命令。没有对格式的解释,它不会防止无效输入等。

read -p username: username ; curl -s "https://api.github.com/users/$username/repos?per_page=100" | grep -o 'git@[^"]*'

相关内容