Bash脚本中的RegEx(for-loop)

def*_*ser 2 linux bash shell sh

我想通过使用for循环解析给shell脚本的参数.现在,假设我有3个参数,类似 for i in $1 $2 $3 应该做的工作,但我不能预测参数的数量,所以我想使用RegEx作为范围,$#作为最后一个参数的数量.我不知道如何在for循环中使用这些RegEx',我尝试了一些for i in $[1-$#] 不起作用的东西 .该循环仅运行1次,并且计算1 - $#,而不是用作RegEx.

Joh*_*ica 7

基本

一个for默认循环将遍历所有的命令行参数,如果你不指定in子句:

for arg; do
    echo "$arg"
done
Run Code Online (Sandbox Code Playgroud)

如果你想要明确,你可以得到所有的论点"$@".上面的循环相当于:

for arg in "$@"; do
    echo "$arg"
done
Run Code Online (Sandbox Code Playgroud)

从bash手册页:

特殊参数

$@ - 从1开始扩展到位置参数.当扩展发生在双引号内时,每个参数都会扩展为单独的单词.也就是说,"$@"相当于"$1" "$2" ....如果双引号扩展发生在一个单词中,则第一个参数的扩展与原始单词的开头部分连接,最后一个参数的扩展与原始单词的最后一部分连接.当没有位置参数时,"$@"$@扩展为空(即,它们被移除).

高级

对于重型参数处理,getopt+ shift是要走的路.getopt将预处理命令行,以便为用户提供一些指定参数的灵活性.例如,它将扩展-xzf-x -z -f.它--在将标志与文件名分开的所有标志之后添加一个参数; 这使您可以运行cat -- -my-file以显示-my-file前导短划线上没有barfing 的内容.

试试这个样板代码的大小:

#!/bin/bash

eval set -- "$(getopt -o a:bch -l alpha:,bravo,charlie,help -n "$0" -- "$@")"

while [[ $1 != -- ]]; do
    case "$1" in
      -a|--alpha)
        echo "--alpha $2"
        shift 2
        ;;

      -b|--bravo)
        echo "--bravo"
        shift
        ;;

      -c|--charlie)
        echo "--charlie"
        shift
        ;;

      -h|--help)
        echo "Usage: $0 [-a ARG] [-b] [-c]" >&2
        exit 1
        ;;
    esac
done
shift
Run Code Online (Sandbox Code Playgroud)

请注意,每个选项都有一个短的等长,例如-a--alpha.该-a标志接受一个参数,因此它在调用中指定为a:和,并且在其大小写结尾处.alpha:getoptshift 2