0

我想使用 .sh 文件制作一个 Pathogen 助手脚本。我知道如果你让它可执行,它可以作为命令运行,但我不知道该怎么做-o --optionsarguments类似的事情。

基本上这就是我想要回答的,我真正需要知道的是如何做类似的事情:

pathogen install git://...

或类似的规定。任何帮助表示赞赏。:)

4

2 回答 2

1

据我所知,bash 内置getopts不处理长 arg 解析机制。

getopt(1)是您正在寻找的工具。

不完全是一个程序,但你会明白的

PARSED_OPTIONS=$(getopt -n "$0"  -o h123: --long "help,one,two,three:"  -- "$@")
while true;
do
  case "$1" in

    -h|--help)
      echo "usage $0 -h -1 -2 -3 or $0 --help --one --two --three"
     shift;;

    -1|--one)
      echo "One"
      shift;;

    --)
      shift
      break;;
  esac
done

看看这里给出的代码示例和解释。

于 2013-09-20T20:53:32.403 回答
1

传递参数是两者中最简单的(参见SO 上的“什么是特殊的美元符号 shell 变量? ”):

#!/bin/sh
echo "$#"; # total number of arguments
echo "$0"; # name of the shell script
echo "$1"; # first argument

假设文件名为“stuff”(无扩展名)并且运行结果./stuff hello world

3
stuff
hello

要传入单个字母开关(带有可选的关联参数),例如,./stuff -v -s hello您需要使用getopts. 请参阅SO 上的“你如何使用 getopts ”和这个很棒的教程。这是一个例子:

#!/bin/sh
verbose=1
string=
while getopts ":vs:" OPT; do
    case "$OPT" in
        v) verbose=0;;
        s) string="$OPTARG";;
    esac;
done;
if verbose; then
    echo "verbose is on";
fi;
echo "$string";

getopts加上while需要进一步解释的行:

  • while- 启动 while 循环,getopts处理完所有内容后返回
  • getopts :vs: OPT;-getopts具有 2 个参数的程序:vs:OPT
    • getopts- 返回while可以迭代的东西
    • :vs:- 第一个参数,它描述了getopts在解析 shell 行时将寻找 什么开关
      • :- 第一个冒号getopts退出调试模式,省略它以使getopts详细
      • v- 找到开关-v,这后面不会有参数,只是一个简单的开关
      • s:- 找到-s后面有参数的选项
    • OPT- 将存储使用的字符(开关的名称),例如“v”或“s”
  • OPTARGwhile- 在每次迭代期间将值加载到其中的变量。For v,$OPTARG不会有值,但 fors会有。

冒号:告诉 getopts 在切换后查找参数。唯一的例外是,如果字符序列以:then 开头,它会切换getopts到/切换到调试/详细模式。例如:

getopts :q:r:stu:v将使 getopts 退出调试模式,并告诉它 switch qruwill 需要 args,而stu不会。这将适用于以下情况:stuff -q hello -r world -s -t -u 123 -v

getopts tuv只会告诉 getopts 搜索 switch tu并且v没有参数,例如stuff -t -u -v,并且是详细的

于 2013-09-20T20:54:08.223 回答