【问题标题】:how to pass other arguments besides flags如何传递标志以外的其他参数
【发布时间】:2020-07-04 02:10:39
【问题描述】:

我正在尝试通过传入绝对路径作为第一个参数 ($1) 来执行我的文件。我还想从该绝对路径开始添加标志,但我不知道如何告诉 optargs 从 $2 向前开始计数,因为如果我将绝对路径作为 $1 传递,它似乎会破坏 getopts 循环。

我在猜测我必须在以下代码中为第一个参数实现移位:

while getopts :lq flag; do
case $flag in
l) echo "executing -l flag"
;;
q) echo "executing -q flag"
;;
esac
done

我不确定如何处理这个问题。欢迎任何提示,谢谢。

【问题讨论】:

  • 提供示例命令和预期输出。它有助于更​​好地回答。
  • 请注意,一般来说,选项应该在之前参数;这是 POSIX 指定的行为。 GNU 允许将位置参数放在第一位是一个扩展,而且是一个相当不幸的扩展,因为它使解析模棱两可(要求用户添加 -- end-of-options sigil 以防止以破折号开头的参数被错误地解析为选项)在没有其他情况的情况下。请参阅第 12.2 节,以 pubs.opengroup.org/onlinepubs/9699919799/basedefs/… 结尾

标签: bash shell sh getopt getopts


【解决方案1】:

getopts 确实会在看到第一个非选项参数时停止处理参数。对于你想要的,如果它不是一个选项,你可以显式地移动第一个参数。类似的东西

if [[ $1 != -* ]]; then
    path=$1
    shift
fi

while getopts :lq flag; do
    ...
done

【讨论】:

    【解决方案2】:

    保留文件参数之前的选项(即绝对路径)。 许多标准 bash 命令遵循相同的做法。

    例子:

    wc -wl ~/sample.txt
    ls -lR ~/sample_dir
    

    因此,如果您遵循上述做法,您的代码将如下所示。 即使未提供选项,此代码也有效。 一般来说,这是选项的理想行为。

    # Consider last argument as file path
    INPUT_FILEPATH=${*: -1} 
    echo $INPUT_FILEPATH
    
    # Process options
    while getopts :lq flag
    do
    case $flag in
    l) echo "executing -l flag"
    ;;
    q) echo "executing -q flag"
    ;;
    esac
    done
    

    示例执行:

    bash sample.sh /home/username/try.txt

    /home/username/try.txt
    

    bash sample.sh -lq /home/username/try.txt

    /home/username/try.txt
    executing -l flag
    executing -q flag
    

    【讨论】:

      猜你喜欢
      • 2017-04-06
      • 1970-01-01
      • 1970-01-01
      • 2014-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-02
      相关资源
      最近更新 更多