首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将[!$number =~ ^[0-9]+$ ]改为BASH中的word选项?

如何将[!$number =~ ^[0-9]+$ ]改为BASH中的word选项?
EN

Unix & Linux用户
提问于 2019-06-15 20:39:15
回答 3查看 174关注 0票数 0

我的脚本中有一个输入,它写入运行某些软件所需的文件,但是该软件只允许两个可能的选项之一,即LO和LDO。

我已经编写的输入位于以下代码的顶部,底部的代码是建议我要操作的代码。

我想问“重叠(LO或LDO):”和一个错误消息,如果其中一个选项没有输入并重复该步骤,而不是再次遍历整个脚本,而不是搜索0到9之间的值。

from我可以收集到什么,我需要更改^以包含LO和LDO,但是我不知道标点符号是什么,也不知道如何做到

代码语言:javascript
复制
### My Script ###
read -p "Overlap (LO or LDO): " OVERLAP

### Recommended Script ###
#!bin/bash
number=""
while [[ ! $number =~ ^[0-9]+$ ]]; do
    echo Please enter your age
    read number
done
echo You are $number years old
EN

回答 3

Unix & Linux用户

发布于 2019-06-15 22:01:22

输入和验证循环通常如下所示:

代码语言:javascript
复制
while true; do
    read -p 'Overlap (LO or LDO): ' overlap

    case $overlap in
        LO|LDO) # ok
            break
            ;;
        *) # not ok
            echo 'Please enter LO or LDO' >&2
    esac
done

也就是说,当你验证答案是正确的时,你就有了一个无限循环。

很明显,你也可以这样做

代码语言:javascript
复制
while true; do
    read -p 'Overlap (LO or LDO): ' overlap

    if [ "$overlap" = LO ] || [ "$overlap" = LDO ]; then
        # ok
        break
    fi
    # not ok
    echo 'Please enter LO or LDO' >&2
done

或者,对于具有select的shell:

代码语言:javascript
复制
echo 'Select overlap:' >&2
select overlap in LO LDO; do
    case $REPLY in
        [12]) # ok
            break
            ;;
        *) # not ok
            echo 'Please select LO or LDO' >&2
    esac
done
票数 2
EN

Unix & Linux用户

发布于 2019-06-15 20:55:56

您可以使用&&和操作符:

代码语言:javascript
复制
#! /bin/bash
overlap=""
first=1
while [[ $overlap != LO && $overlap != LDO ]] ; do
    if [[ ! $first ]] ; then
        echo 'Wrong answer, please answer LO or LDO!' >&2
    fi
    read -p 'Overlap (LO or LDO): ' overlap
    unset first
done

您还可以使用regex:

代码语言:javascript
复制
until [[ $overlap =~ ^LD?O$ ]] ; do
    ...
  • ^与字符串的开头匹配。
  • ?使前面的内容可选
  • $与字符串的末尾匹配。
票数 1
EN

Unix & Linux用户

发布于 2019-06-15 22:10:15

另一种方法

代码语言:javascript
复制
while read -p "Overlap (LO or LDO): " overlap;
do
 [[ "$overlap" =~ ^LD?O$ ]] && break || echo "Not LO or LDO"
done
票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/525181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档