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

How can I pass a file argument to my bash script using a Terminal command in Linux?

本问题已经有最佳答案,请猛点这里访问。

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

我的程序

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

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


如果将脚本运行为

1
myprogram /path/to/file

然后您可以访问脚本中的路径作为$1(对于参数1,类似地,$2是参数2,等等)。

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

或者只是

1
externalprogram"$1" [otherparameters]

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


可以使用getopt处理bash脚本中的参数。关于getopt的解释不多。下面是一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/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"

参见:

  • "规范"示例: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开始)。

一个例子:

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


假设您按照david zaslavsky的建议进行操作,那么第一个参数就是要运行的程序(不需要进行选项解析),您将处理如何将参数2传递给外部程序的问题。这是一个方便的方法:

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

shift将删除第一个参数,重命名其余的参数($2变为$1, and so on).$@`引用参数,作为一个单词数组(必须引用!).

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

如果你想自己动手,对于一个特定的案例,你可以这样做:

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