Bash如何检查参数是否为sed模式?

时间:2014-11-28 14:39:34

标签: linux bash design-patterns sed

我正在处理应该接收许多参数的bash脚本。这些论点可能很简单:

Myscript [-r] [-l|-u] <dir/file names...>

或者它可能只是一个sed模式而不是简单的参数,如:

Myscript  <sed pattern> <dir/file names...>

所以我的问题是如何检查给出的参数是否是sed模式而不是目录路径或文件名? 我已经做了一些事情,但它不适用于漫长的路径(dir1/dir2/dir

    while [[ $# > 0 ]]
    do
    key="$1"

    case $key in

        -ru|-ur)
            config_recusive
            config_upper
            shift
            ;;
        -rl|-lr)
            config_recusive
            config_lower
            shift
            ;;
        -r)
            config_recusive
            shift
            ;;
        -l)
            config_lower
            shift
            ;;
        -u)
            config_upper
            shift
            ;;
        *)
            check="^.*/.*/.*$"
            if [[ $key =~ $check ]] ; then 

                config_sed_pattern
            else
                TARGET=$key      
            fi
            shift
            ;;
    esac
done

更清楚的是,当我试图像这样运行脚本时,这是我的问题的一个例子:

./myscript -u tmp/users/regions

将路径(tmp/users/regions)作为sed模式而感到困惑。 希望我足够清楚。 等待你的帮助:) 谢谢

1 个答案:

答案 0 :(得分:1)

我认为您可以尝试在某些内容上运行该脚本

echo a | sed "$pattern" >/dev/null 2>/dev/null

然后检查$?

if [ $? != 0 ]; then # means sed failed
#...

但也许sed会认为这也是它的论点。

顺便说一句,使用getopt处理参数会使事情变得更容易。

我不认为你设计参数格式的方式是好的。也许你认为以不同的形式制作论证可以使你的程序看起来充满活力和令人敬畏。但现在你正在努力解决一个与你的严肃事务无关的问题,并浪费你自己的时间和我们的时间。这不好。让事情变得愚蠢和清晰是更好的。

在你的情况下,也许你可以添加另一个参数来表明它是一个随后的sed表达式。

YourScript -e <sed expr> <others>

以这种方式,你会知道你两周后做了什么。