我希望我的bash脚本采用2或3个参数,最后一个参数始终是要打开的输入文件。所以参数索引应该取决于提供的参数数量。我知道这可以通过if语句实现,如:
if [ $# -eq 3 ]; then
INFILE=$3
elif [ $# -eq 2 ]; then
INFILE=$2
fi
..打开文件阅读...
然而,我希望这可以通过一个看起来像这样的衬里来完成:
INFILE=$($#)
虽然不起作用。与INFILE = $" $#"相同的事情。是否可以直接用" $#"
指定参数索引答案 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)
您正在尝试对数组进行间接引用,因此${!#}
也可以正常工作。