在bash shell脚本中,我试图获取标志之前的参数。
当争论出现在旗帜之后时,我知道我可以使用getopts并使案例像echo "there's an -g flag! Argument: $OPTARG
但是我不知道如何在旗帜之前采取争论。假设我想处理此命令:./filename 2345 -g
。
参数是一个PID,该标志试图将参数作为。
提前致谢!
答案 0 :(得分:0)
我们假设您的-g
代表global
,并且您支持在或之前传递-g
,而其数字的含义会发生变化。一个大多数传统的解析器(不符合基线POSIX约定,因为后者要求所有选项都在任何位置参数之前)可能看起来有点如下:
#!/usr/bin/env bash
args=( )
global=0
while (( $# )); do
case $1 in
-g) global=1 ;;
--) shift; args+=( "$@" ); break ;;
-*) echo "Unrecognized argument $1" >&2; exit 1 ;;
*) args+=( "$1" ) ;;
esac
shift
done
if (( global )); then
echo "Doing something with global PID ${args[0]}"
fi
也就是说:将您的位置参数存储在一个单独的位置(在本例中为args
数组),并根据需要返回它们。
如果你真的想把你的最后一个参数存储在一个变量中,当你看到-g
时再引用那个变量,当然,你可以这样做:
#!/usr/bin/env bash
last_arg=
while (( $# )); do
case $1 in
-g) global=$last_arg ;;
esac
last_args=$1
shift
done
if [[ $global ]]; then
echo "Global value is $global"
fi
......但是:不要。这违反了POSIX和GNU命令行实用程序约定,因此对于任何长期UNIX用户都会感到惊讶。
答案 1 :(得分:0)
你可以简单地反转参数列表:
set -- "$(tac < <(printf "%s\n" "$@"))"
您可以在 pure bash 中执行此操作:
o=();for i in "$@";do o=("$i" "${o[@]}");done;set -- "${o[@]}"
或更好:作为别名(因为函数无法改变$@
):
alias revargs='o_ra=(); for i_ra in "$@";do
o_ra=("$i_ra" "${o_ra[@]}");done;set -- "${o_ra[@]}";unset o_ra i_ra'