【问题标题】:Shell Script(bash) - Accept only positive integer or comma separated positive integersShell Script(bash) - 只接受正整数或逗号分隔的正整数
【发布时间】:2017-09-27 21:17:20
【问题描述】:

我有一个要求,其中 $1 应该只是一个大于零的正整数或逗号分隔的正整数列表。

./xyz.sh 1

或者

./xyz.sh 1,11,124

任何其他输入 - 脚本应该退出。

$1 - 命令行参数

我试过了:

PARA_METERS=\`echo $1\`  
if [[  "$PARA_METERS" =~ ^([1-9]+,)*[1-9]+$ ]]; then 

echo $1|/usr/bin/perl -0777 -ne '/^([1-9]+,)*[1-9]+$/ && print' 

这适用于命令行,但不适用于脚本。

\#!/bin/bash 是我正在使用的外壳。我无法在 shell 脚本中处理它!

我可以在脚本中使用Python/Perlsed/awk 来检查正则表达式并进行验证。

OS: Linux 2.6.32-358.32.3.el6.x86_64
Shell: GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)

【问题讨论】:

    标签: bash shell


    【解决方案1】:

    我认为你在正则表达式上是正确的,你只需要稍微改变一下:

    re='^[1-9][0-9]*(,[1-9][0-9]*)*$'
    [[ $1 =~ $re ]] && echo 'it works!'
    

    正则表达式匹配一个或多个数字的整数(不允许前导零),可选地后跟任意数量的相同事物,前面是逗号。

    测试一下:

    validate () {
        re='^[1-9][0-9]*(,[1-9][0-9]*)*$'
        [[ $1 =~ $re ]] && echo 'it works!'
    }
    
    validate 1 # it works!
    validate 1,11,124 # it works!
    

    【讨论】:

    • 非常感谢@Tom 它运行良好!我在正则表达式的开头添加了一个插入符号,使其变为 ^[1-9][0-9]*(,[1-9][0-9]*)* 否则如果我匹配 -10在没有插入符号的情况下使用它。因此,+ [[ -10 =~ [1-9][0-9]*(,[1-9][0-9]*)* ]] 匹配并控制转到不应该出现的主要功能。
    • 是的,我认为开头和结尾的锚点很重要,我已将它们添加到我的答案中。
    猜你喜欢
    • 1970-01-01
    • 2018-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多