【问题标题】:how to specify an command line argument with a variable in bash如何在bash中使用变量指定命令行参数
【发布时间】:2014-08-19 04:21:38
【问题描述】:

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

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

..打开要读取的文件...

但是我希望这可以由一个看起来像这样的单班轮来完成:

INFILE=$($#)

但它不起作用。与 INFILE=$"$#" 相同。是否可以直接用“$#”指定参数索引

【问题讨论】:

    标签: bash command-line-arguments


    【解决方案1】:

    尝试使用 INFILE="${@: -1}" 获取最后一个参数。

    【讨论】:

    • 我的武器库中也有这个工具有一段时间了,但我一直不明白它为什么会起作用。你能解释一下吗?
    【解决方案2】:

    您在 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}"
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2016-11-15
        • 1970-01-01
        • 2014-07-10
        • 1970-01-01
        • 2016-05-12
        • 2013-06-19
        • 2023-04-08
        • 2011-10-16
        • 1970-01-01
        相关资源
        最近更新 更多