如何在bash中使用变量指定命令行参数

时间:2014-08-18 20:03:30

标签: bash command-line-arguments

我希望我的bash脚本采用2或3个参数,最后一个参数始终是要打开的输入文件。所以参数索引应该取决于提供的参数数量。我知道这可以通过if语句实现,如:

if [ $# -eq 3 ]; then
  INFILE=$3
elif [ $# -eq 2 ]; then
  INFILE=$2
fi

..打开文件阅读...

然而,我希望这可以通过一个看起来像这样的衬里来完成:

INFILE=$($#)

虽然不起作用。与INFILE = $" $#"相同的事情。是否可以直接用" $#"

指定参数索引

3 个答案:

答案 0 :(得分:3)

尝试使用 INFILE="${@: -1}"得到最后一个论点。

答案 1 :(得分:1)

你看到了一个众所周知的shell限制。 : - )

您可以通过逐步执行现有参数来获取最后一个参数:

#!/bin/bash

while [ ! -z "$2" ]; do
  shift
done

echo "Last argument: $1"

在Bourne(非Bash)shell中,你可以用eval执行此操作,这是邪恶的:

#!/bin/bash

eval "echo \"Last argument: \$$#\""

如果你不需要bash之外的可移植性,你也可以使用@数组:

#!/bin/bash

echo "Last argument: ${@: -1}"

答案 2 :(得分:1)

您正在尝试对数组进行间接引用,因此${!#}也可以正常工作。