所以我的问题是我怎样才能传递文件参数到我的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"
也可以看看:
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