Bash 使用getopts读取作为最终位置放置的一个可选参数

Bash 使用getopts读取作为最终位置放置的一个可选参数,bash,arguments,getopts,Bash,Arguments,Getopts,我编写了一个bash脚本,它采用了灵活数量的参数,现在我想为每个参数添加一个可选参数(-l) 我目前很难获得想要的行为 我希望正确执行以下所有操作: ./Script.sh arg1 arg2 arg3 -l opt ./Script.sh arg1 arg2 arg3 ./Script.sh arg1 arg2 arg3 arg4 -l opt ./Script.sh arg1 arg2 arg3 arg4 arg5 问题是无法设置$OPTIND。 如果将-l opt放在第一个参数之前,则

我编写了一个bash脚本,它采用了灵活数量的参数,现在我想为每个参数添加一个可选参数(
-l

我目前很难获得想要的行为

我希望正确执行以下所有操作:

./Script.sh arg1 arg2 arg3 -l opt 
./Script.sh arg1 arg2 arg3
./Script.sh arg1 arg2 arg3 arg4 -l opt
./Script.sh arg1 arg2 arg3 arg4 arg5
问题是无法设置
$OPTIND
。 如果将
-l opt
放在第一个参数之前,则以下循环有效

while getopts ":l:" option
do
    case "$option" in
        t) 
            F_NAME=$OPTARG 
            ;;
    esac
done
shift $((OPTIND - 1))
但是,将可选的
-l
作为最后一个参数是必需的。
实现这一点最简单的方法是什么?

getopts
符合posix标准命令行语法,其中首先是标志选项。所以它不容易用于非标准情况

但是,您可能有
getopt(1)
(请参见
man1getopt
)的Gnu实现,它可以处理置换选项标志以及长选项。然而,作为一个界面,它并不是那么容易

或者你可以自己解释这个论点

for ((i=1; i<=$#; ++i)); do
  if [[ ${!i} == "-l" ]]; then
    ((++i))
    OPT_L=${!i}
  else
    # handle the argument (in "${!i]")
  fi
done

for((i=1;i
getopts
符合posix标准命令行语法,其中首先是标志选项。因此,对于非标准情况,使用它并不容易

但是,您可能有
getopt(1)
(请参见
man1getopt
)的Gnu实现,它可以处理置换选项标志以及长选项。但是,它不是一个简单的接口

或者你可以自己解释这个论点

for ((i=1; i<=$#; ++i)); do
  if [[ ${!i} == "-l" ]]; then
    ((++i))
    OPT_L=${!i}
  else
    # handle the argument (in "${!i]")
  fi
done

for((i=1;i
getopts
符合posix标准命令行语法,其中首先是标志选项。因此,对于非标准情况,使用它并不容易

但是,您可能有
getopt(1)
(请参见
man1getopt
)的Gnu实现,它可以处理置换选项标志以及长选项。但是,它不是一个简单的接口

或者你可以自己解释这个论点

for ((i=1; i<=$#; ++i)); do
  if [[ ${!i} == "-l" ]]; then
    ((++i))
    OPT_L=${!i}
  else
    # handle the argument (in "${!i]")
  fi
done

for((i=1;i
getopts
符合posix标准命令行语法,其中首先是标志选项。因此,对于非标准情况,使用它并不容易

但是,您可能有
getopt(1)
(请参见
man1getopt
)的Gnu实现,它可以处理置换选项标志以及长选项。但是,它不是一个简单的接口

或者你可以自己解释这个论点

for ((i=1; i<=$#; ++i)); do
  if [[ ${!i} == "-l" ]]; then
    ((++i))
    OPT_L=${!i}
  else
    # handle the argument (in "${!i]")
  fi
done

for((i=1;i我发现了一个技巧,可以在getopts中使用带有可选参数的参数

Jan Schampera在bash-hackers.org上的回复中给出了管理可选参数在命令中的情况的方法:

(请参阅:本页的最深处) 但它不管理在命令末尾给出选项的情况

在这种情况下,这被认为是错误的,因为没有给出参数,
getopts
opt
变量设置为“”(冒号),并将
OPTARG
设置为故障选项值。 因此,我们必须使用
案例$OPTARG
来管理“”案例

假设我们编写的脚本有三个选项:

  • a
    :无参数
  • b
    :带有必需的参数
  • v
    :使用
    0
    2
    之间的值设置详细度。默认值为
    0
    ,在使用
    -v
    调用脚本时使用预设值,无参数或使用错误值
代码如下:


我发现了一个技巧,可以在getopts中使用带有可选参数的参数

Jan Schampera在bash-hackers.org上的回复中给出了管理可选参数在命令中的情况的方法:

(请参阅:本页的最深处) 但它不管理在命令末尾给出选项的情况

在这种情况下,这被认为是错误的,因为没有给出参数,
getopts
opt
变量设置为“”(冒号),并将
OPTARG
设置为故障选项值。 因此,我们必须使用
案例$OPTARG
来管理“”案例

假设我们编写的脚本有三个选项:

  • a
    :无参数
  • b
    :带有必需的参数
  • v
    :使用
    0
    2
    之间的值设置详细度。默认值为
    0
    ,在使用
    -v
    调用脚本时使用预设值,无参数或使用错误值
代码如下:


我发现了一个技巧,可以在getopts中使用带有可选参数的参数

Jan Schampera在bash-hackers.org上的回复中给出了管理可选参数在命令中的情况的方法:

(请参阅:本页的最深处) 但它不管理在命令末尾给出选项的情况

在这种情况下,这被认为是错误的,因为没有给出参数,
getopts
opt
变量设置为“”(冒号),并将
OPTARG
设置为故障选项值。 因此,我们必须使用
案例$OPTARG
来管理“”案例

假设我们编写的脚本有三个选项:

  • a
    :无参数
  • b
    :带有必需的参数
  • v
    :使用
    0
    2
    之间的值设置详细度。默认值为
    0
    ,在使用
    -v
    调用脚本时使用预设值,无参数或使用错误值
代码如下:


我发现了一个技巧,可以在getopts中使用带有可选参数的参数

Jan Schampera在bash-hackers.org上的回复中给出了管理可选参数在命令中的情况的方法:

(请参阅:本页的最深处) 但它不管理c