Bash中的命令行参数

81

我想编写一个Bash脚本,可以接收不同的参数。它应该像普通的Linux控制台程序一样使用:

my_bash_script -p 2 -l 5 -t 20

需要将数值2保存在名为“pages”的变量中,将参数l保存在名为“length”的变量中,将数值20保存在名为“time”的变量中。如何最好地实现这个功能?


一个变量在哪里?参数与您运行的程序相关,而不是在这种情况下与bash相关。'myProgramm'需要参数吗? - Joe
我想用Bash编写一个能够实现这个功能的程序。 - Pascal
请注意,除非您使用“。”(. myProgram -p2 -l 5 -t 20)调用脚本,否则您设置的变量仅存在于“myProgram”中,而不是从中调用它的shell中。 - chepner
我真的觉得他的意图是让myProgramm成为一个bash脚本。如果是这种情况,getopts是正确的。为了避免混淆,也许应该将myProgramm命名为my_bash_script。嘿,我会编辑它的。 - Captain Lepton
2个回答

128

使用内置的getopts命令:
这里有一个教程

pages=  length=  time=

while getopts p:l:t: opt; do
  case $opt in
  p)
      pages=$OPTARG
      ;;
  l)
      length=$OPTARG
      ;;
  t)
      time=$OPTARG
      ;;
  esac
done

shift $((OPTIND - 1))

shift $((OPTIND - 1)) 可以将命令行参数向左移动,这样你就可以访问脚本可能有的参数,例如 $1, $2, ...


“getopt无法处理空参数字符串或带有嵌入式空格的参数。请忘记它曾经存在过。” - Federico
9
@Federico,你混淆了 getoptgetopts... 你应该仔细阅读引述的内容(并请撤销你的负评)。你还可以在这里阅读更多信息:http://blog.onetechnical.com/2012/07/16/bash-getopt-versus-getopts/。 - tzelleke

13

以下是类似的内容:

pages=
length=
time=

while test $# -gt 0
do
    case $1 in
        -p)
            pages=$2
            shift
            ;;
        -l)
            length=$2
            shift
            ;;
        -t)
            time=$2
            shift
            ;;
        *)
            echo >&2 "Invalid argument: $1"
            ;;
    esac
    shift
done

1
最好使用getopts,而不是-1。 - Steven Mackenzie
2
@StevenMackenzie,我不确定我能同意。如果您查看[BashFAQ#35](http://mywiki.wooledge.org/BashFAQ/035),手动解析示例(其中这是进一步简化)确实执行了许多getopts无法执行的操作。因此,遵循这种做法更加灵活。 - Charles Duffy
2
@StevenMackenzie,...我们也处于一个被GNUisms宠坏的世界,例如能够混合使用可选和位置参数(除了使用“--”来明确表示前者结束和后者开始)。使用这种类型的解析器,在默认情况下很容易做出像args+=("$1")这样的事情;而在getopts中,OPTIND的截止是硬性的。 - Charles Duffy
Bash FAQ 35(如上所述)告诉我所有我需要知道的东西。 - Brian Agnew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接