使用SH脚本创建CLI命令

时间:2013-09-20 20:29:35

标签: shell vim

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

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

pathogen install git://...

或者那些东西。任何帮助表示赞赏。 :)

2 个答案:

答案 0 :(得分:1)

据我所知,bash builtin 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

查看给出here的代码示例和解释。

答案 1 :(得分:1)

传递参数是两者中最容易的(参见SO上的“What are special dollar sign shell variables?”):

#!/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和How do you use getopts上的“this great tutorial”。这是一个例子:

#!/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";

getoptswhile的行需要进一步解释:

  • while - 启动while循环,遍历所有内容getopts在处理后返回
  • getopts :vs: OPT; - 包含2个参数getopts:vs:的计划OPT
    • getopts - 返回while可以迭代的内容
    • :vs: - 第一个参数,它描述了getopts在解析shell行时查找的内容
      • : - 第一个冒号将getopts退出调试模式,省略此项以使getopts详细
      • v - 找到开关-v,这之后就没有参数了,只是一个简单的开关
      • s: - 找到带有参数的选项-s
    • OPT - 将存储使用的字符(开关的名称),例如“v”或“s”
  • OPTARG - 在每个while迭代期间加载值的变量。对于v$OPTARG不会有值,但对于s,它会有。

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

getopts :q:r:stu:v会将getopts从调试模式中移除,并告诉它qru切换器需要args,而stu不会。这适用于以下内容:stuff -q hello -r world -s -t -u 123 -v

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