检查字符串以查看它是否包含UNIX中的数字字符

ele*_*eep 7 regex unix string bash if-statement

我是UNIX的新手,今天只在工作中开始工作,但对Java有经验,并且有以下代码:

#/bin/bash
echo "Please enter a word:"
read word
grep -i $word $1 | cut -d',' -f1,2 | tr "," "-"> output
Run Code Online (Sandbox Code Playgroud)

这工作正常,但我现在需要做的是检查何时读取单词,它只包含字母,如果它有打印数字字符"无效输入!" 消息并要求他们再次输入.我假设使用if语句的正则表达式是这样做的简单方法,但是我无法理解如何在UNIX中使用它们,因为我已经习惯了它们的Java应用程序.任何有关这方面的帮助将非常感激,因为我在搜索时找不到帮助,因为在linux中使用正则表达式的所有解决方案我发现它只是处理它是否全部是数字.

Ste*_*n P 17

还有另一种方法.0如果找到匹配项,Grep将退出,因此您可以测试退出代码:

echo "${word}" | grep -q '[0-9]'
if [ $? = 0 ]; then
    echo 'Invalid input'
fi
Run Code Online (Sandbox Code Playgroud)

这是/bin/sh兼容的.


结合Daenyth和John的建议,这就变成了

if echo "${word}" | grep '[0-9]' >/dev/null; then
    echo 'Invalid input'
fi
Run Code Online (Sandbox Code Playgroud)

  • `-q`到grep在GNU之外是不可移植的.如果你想要完全的可移植性(使用sh的唯一原因),使用`>/dev/null 2>&1` (3认同)
  • 你可以通过改变`cmd;来收紧它.如果[$?= 0]; 然后``到`cmd; then`. (3认同)

Joh*_*ica 9

双括号运算符是test命令的扩展版本,它通过=~运算符支持正则表达式:

#!/bin/bash

while true; do
    read -p "Please enter a word: " word
    if [[ $word =~ [0-9] ]]; then
        echo 'Invalid input!' >&2
    else
        break
    fi
done
Run Code Online (Sandbox Code Playgroud)

这是一个特定于bash的功能.Bash是一个较新的shell,并不适用于所有类型的UNIX - 虽然"更新"我的意思是"最近才在真空管后时代开发"和"并非所有版本的UNIX"我的意思是旧版本的遗物Solaris和HP-UX.

在我看来,这是最简单的选项,而bash目前很容易移植,但如果可移植到旧的UNIX实际上很重要,那么你需要使用其他海报的兼容答案.sh是最常见和最广泛支持的shell,但是你为可移植性付出的代价正在丢失=~.