所以我的问题是如何使用Linux中的终端命令将文件参数传递给我的bash脚本?
目前我正在尝试在bash中创建一个程序,该程序可以从终端获取文件参数并将其用作程序中的变量。比如我跑
终端myprogram --file=/path/to/file
。
#!/bin/bash
File=(the path from the argument)
externalprogram $File (other parameters)
我如何通过我的程序实现这一目标?
答案 0 :(得分:55)
如果您只是以
运行脚本,它会更容易(并且更“正确”,见下文)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=
这样的开关也是可选的。我猜你的脚本需要提供一个文件名,所以在选项中传递它是没有意义的。
答案 1 :(得分:19)
您可以使用getopt处理bash脚本中的参数。 getopt的解释并不多。这是一个例子:
#!/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"
另见:
答案 2 :(得分:12)
Bash支持一个名为“位置参数”的概念。这些位置参数表示在调用Bash脚本时在命令行上指定的参数。
位置参数由名称$0
,$1
,$2
...等引用。 $0
是脚本本身的名称,$1
是脚本的第一个参数,$2
是第二个,等等。$*
表示所有位置参数,除了$0
(即以$1
开头)。
一个例子:
#!/bin/bash
FILE="$1"
externalprogram "$FILE" <other-parameters>
答案 3 :(得分:2)
假设你按照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