繁体   English   中英

Bash脚本中的RegEx(for-loop)

[英]RegEx in bash-script (for-loop)

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

基本

如果未指定in子句,则默认情况下, for循环将循环执行命令行参数:

for arg; do
    echo "$arg"
done

如果你想要明确,你可以把所有的参数都称为"$@" 上面的循环相当于:

for arg in "$@"; do
    echo "$arg"
done

从bash手册页:

特殊参数

$@ - 从一个开始扩展到位置参数。 当扩展发生在双引号内时,每个参数都会扩展为单独的单词。 也就是说, "$@"相当于"$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

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

迭代更接近你正在努力的论点的另一种方法是:

for ((i=1; i<=$#; i++))
do
    echo "${@:i:1}"
done

但是John Kugelman所展示的for arg语法是最好的。 但是,有时阵列切片很有用。 此外,在此版本中,与John的一样,参数数组保持不变。 使用shift会丢弃其元素。

您应该注意,您尝试使用方括号的内容根本不是正则表达式。

我建议做其他事情:

while [ -n "$1" ] ; do
  # Do something with $1
  shift
  # Now whatever was in $2 is now in $1
done

shift关键字将$ 2的内容转换为$ 1,将$ 3的内容转换为$ 2等.pp。

让我们说下面的论点:

a b c d

shift ,争论现在是:

b c d

使用while循环,您可以解析任意数量的参数,甚至可以执行以下操作:

while [ -n "$1" ] ; do
  if [ "$1" = "-f" ] ; then
    shift
    if [ -n "$1" ] ; then
      myfile="$1"
    else
      echo "-f needs an additional argument"
    end
  fi
  shift
done

想象一下,参数是一个数组,$ n是该数组的索引。 shift删除第一个元素,因此索引1现在引用shift之前索引为2的元素。 我希望你明白我想说的话。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM