[英]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.