如何使用Linux中的终端命令将文件参数传递给我的bash脚本?

时间:2010-08-20 19:37:22

标签: linux bash shell command-line terminal

所以我的问题是如何使用Linux中的终端命令将文件参数传递给我的bash脚本? 目前我正在尝试在bash中创建一个程序,该程序可以从终端获取文件参数并将其用作程序中的变量。比如我跑 终端myprogram --file=/path/to/file

我的计划

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

我如何通过我的程序实现这一目标?

4 个答案:

答案 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