保存标志之前的参数

时间:2016-11-17 21:06:06

标签: bash

在bash shell脚本中,我试图获取标志之前的参数。

当争论出现在旗帜之后时,我知道我可以使用getopts并使案例像echo "there's an -g flag! Argument: $OPTARG

一样

但是我不知道如何在旗帜之前采取争论。假设我想处理此命令:./filename 2345 -g

参数是一个PID,该标志试图将参数作为。

提前致谢!

2 个答案:

答案 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'
相关问题