【问题标题】:Can someone explain this short getopts bash script in plain english? (UNIX)有人可以用简单的英语解释这个简短的 getopts bash 脚本吗? (UNIX)
【发布时间】:2013-06-18 20:29:51
【问题描述】:

这是脚本:

file=$1
while getopts ":ivr" opt; do
case $opt in
i) iopt=1;;
v) vopt=1;;
r) ropt=1;;
\?)echo "invalid option: -$OPTARG" >
esac
done
shift $(($OPTIND-1))

所以我真正理解的唯一部分是转变$(($OPTIND-1))。有人可以解释其余的实际在做什么吗?顶部的file=$1 是什么意思?这是否意味着“文件”一词现在已分配给$1 列的值?

“$1 列”是指当一个命令运行时,$0 分配给命令的实际名称,$1 是第二个选项/参数,$2是给出的第三个选项/参数。例如,如果您键入:

rm -r directory/randomfiles

那么 $0 将是 rm。 -r 将是 $1。和directory/randomfiles 将是$2。这有意义吗?

总结一下:

  1. 顶部的file=$1 是什么意思,有什么意义?
  2. $opt 代表什么,它是什么意思?
  3. iopt=1 是什么意思,有什么意义?
  4. 如果我想像这样使用我的脚本: MyScriptName -r [InsertFilenameHere]我该怎么办?

我知道我在问很多问题 - 如果您能回答我的一些问题,或者指出正确的方向,我将不胜感激!

提前致谢。

【问题讨论】:

  • +1 用于指定简单的英语部分,否则有人会使用 POSIX 说话:)

标签: bash unix scripting sh getopts


【解决方案1】:

您的命令最多可以使用 3 个命令行选项,-i-r-vgetopts 命令在循环中执行以解析选项。 getopts 命令使用opt 变量来保存当前选项字符。在 case 命令中设置了一些变量来记住给脚本提供了哪些选项。

您对$1 的使用是正确的,但通常在选项被移动之前您不会提取位置参数。

要做到MyScriptName -r [InsertFilenameHere],你应该这样做:

#!/bin/bash
ropt=0
while getopts :r opt; do
    case $opt in
        r) ropt=1;;
        ?) echo "illegal option: -$OPTARG"; exit 1;;
    esac
done
shift $((OPTIND-1))
file=$1
if [[ $ropt == 0 ]]; then
    echo "error: you did not specify '-r'"
    exit 1
fi
: do something with $file

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-17
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    相关资源
    最近更新 更多