如何在Linux中使用Terminal命令将文件parameter passing给我的bash脚本?

所以我的问题是我怎样才能传递文件参数到我的bash脚本在Linux中使用terminal命令? 目前我正在试图在bash中创build一个可以从terminal获取文件参数的程序,并将其用作程序中的一个variables。 例如我在terminal运行myprogram --file=/path/to/file

我的程序

 #!/bin/bash File=(the path from the argument) externalprogram $File (other parameters) 

我的程序如何实现?

如果你只是运行你的脚本,它会更容易(和更“适当”,见下文)

 myprogram /path/to/file 

然后你可以在脚本中以$1访问路径(参数#1,同样$2是参数#2等)

 file="$1" externalprogram "$file" [other parameters] 

要不就

 externalprogram "$1" [otherparameters] 

如果你想从诸如--file=/path/to/file类的东西中提取路径,通常用getopts shell函数完成。 但是,这比引用$1更复杂,而且,像--file=这样的开关也是可选的。 我猜你的脚本需要提供一个文件名,所以在一个选项中传递它是没有意义的。

你可以使用getopt来处理bash脚本中的参数。 那里没有太多的解释。 这里是一个例子:

 #!/bin/sh OPTIONS=$(getopt -o hf:gb -l help,file:,foo,bar -- "$@") if [ $? -ne 0 ]; then echo "getopt error" exit 1 fi eval set -- $OPTIONS while true; do case "$1" in -h|--help) HELP=1 ;; -f|--file) FILE="$2" ; shift ;; -g|--foo) FOO=1 ;; -b|--bar) BAR=1 ;; --) shift ; break ;; *) echo "unknown option: $1" ; exit 1 ;; esac shift done if [ $# -ne 0 ]; then echo "unknown option(s): $@" exit 1 fi echo "help: $HELP" echo "file: $FILE" echo "foo: $FOO" echo "bar: $BAR" 

也可以看看:

  • “canonical”示例: http : //software.frodo.looijaard.name/getopt/docs/getopt-parse.bash
  • 博客文章: http : //www.missiondata.com/blog/system-administration/17/17/
  • man getopt

Bash支持一个名为“位置参数”的概念。 这些位置参数表示在调用Bash脚本时在命令行中指定的参数。

位置参数由名称$0$1$2 …等引用。 $0是脚本本身的名字, $1是脚本的第一个参数, $2是第二个,等等。 $*表示所有的位置参数,除了$0 (即从$1开始)之外。

一个例子:

 #!/bin/bash FILE="$1" externalprogram "$FILE" <other-parameters> 

假设你像David Zaslavsky所说的那样做,那么第一个参数就是要运行的程序(不需要选项解析),你正在处理如何将参数2传递给你的外部程序的问题。 这是一个方便的方法:

 #!/bin/bash ext_program="$1" shift "$ext_program" "$@" 

这个shift将删除第一个参数,重命名其余的( $2变成$1, and so on). $ @`指的是参数,就像一个单词的数组(它必须被引用!)。

如果你必须有你的--file语法(例如,如果有一个默认的程序运行,所以用户不一定要提供一个),只需将ext_program="$1"替换为$1所需的任何解析,也许使用getopt或getopts。

如果你想推出自己的,只是一个特定的情况下,你可以做这样的事情:

 if [ "$#" -gt 0 -a "${1:0:6}" == "--file" ]; then ext_program="${1:7}" else ext_program="default program" fi