getopts 不会连续调用两次吗? [复制]

2024-03-09

由于某种原因,这些选项在第一次调用时工作正常lib_progress_bar -c "@" -u "_" 0 100,但在第二次通话及之后,一切都是默认的,因为它看起来像getopts c:u:d:p:s:%:m: flag第二次不是真的,或者至少当我使用时这种情况从未被执行set -x

#!/bin/bash



lib_progress_bar() {
    local current=0
    local max=100 
    local completed_char="#"    
    local uncompleted_char="."  
    local decimal=1 
    local prefix=" ["
    local suffix="]"
    local percent_sign="%"
    local max_width=$(tput cols)

    local complete remain subtraction width atleast percent chars
    local padding=3

    while getopts c:u:d:p:s:%:m: flag; do
        case "$flag" in
            c) completed_char="$OPTARG";;
            u) uncompleted_char="$OPTARG";;
            d) decimal="$OPTARG";;
            p) prefix="$OPTARG";;
            s) suffix="$OPTARG";;
            %) percent_sign="$OPTARG";;
            m) max_width="$OPTARG";;
        esac
    done
    shift $((OPTIND-1))


    current=${1:-$current} 
    max=${2:-$max} 


    if (( decimal > 0 )); then
        (( padding = padding + decimal + 1 ))
    fi


    let subtraction=${#completed_char}+${#prefix}+${#suffix}+padding+${#percent_sign}
    let width=max_width-subtraction


    if (( width < 5 )); then
        (( atleast = 5 + subtraction ))
        echo >&2 "the max_width of ($max_width) is too small, must be atleast $atleast" 
        return 1 
    fi


    if (( current > max ));then
        echo >&2 "current value must be smaller than max. value"
        return 1
    fi

    percent=$(awk -v "f=%${padding}.${decimal}f" -v "c=$current" -v "m=$max" 'BEGIN{printf('f', c / m * 100)}')

    (( chars = current * width / max))

    # sprintf n zeros into the var named as the arg to -v
    printf -v complete '%0*.*d' '' "$chars" ''
    printf -v remain '%0*.*d' '' "$((width - chars))" ''

    # replace the zeros with the desired char
    complete=${complete//0/"$completed_char"}
    remain=${remain//0/"$uncompleted_char"}

    printf '%s%s%s%s %s%s\r' "$prefix" "$complete" "$remain" "$suffix" "$percent" "$percent_sign"

    if (( current >= max )); then
        echo ""
    fi
}


lib_progress_bar -c "@" -u "_" 0 100 
echo
lib_progress_bar -c "@" -u "_" 25 100
echo
lib_progress_bar -c "@" -u "_" 50 100
echo

exit;

只需添加:

local OPTIND

在你的函数的顶部。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

getopts 不会连续调用两次吗? [复制] 的相关文章

  • 如何使用 bash 测试文件系统的目录限制

    我需要测试可以在文件系统 网络安装驱动器和本地 USB 驱动器 上创建多少目录和文件 我现在使用这个 bash 行 for i in 0 999999 do mkdir p i pushd i done 我知道可能可以做得更好 并且我想知道
  • npm 运行如何工作?

    当我打字时会发生什么npm run
  • 如何让 STDOUT 和 STDERR 都转到终端和日志文件?

    我有一个脚本 将由非技术用户交互式运行 该脚本将状态更新写入 STDOUT 以便用户可以确定脚本运行正常 我希望将Stdout和STDERR重定向到终端 以便用户可以看到脚本正在工作 并查看是否存在问题 我还希望将两个流都重定向到日志文件
  • 如何使用 echo 写入非 ASCII 字符?

    如何写非ASCII http en wikipedia org wiki ASCII使用 echo 的字符 是否有转义序列 例如 012或类似的东西 我想使用以下方法将 ASCII 字符附加到文件中 echo gt gt file 如果您关
  • 通过 bash 从文件中检索电子邮件主题

    我有一个 shell 脚本 它将文件从服务器邮件文件夹下载到 NAS 设备 以便客户端拥有本地备份的副本 文件保存为11469448248 H15587P19346 smtp x14 eu 2 S文件 我已将扩展名更改为标准 eml 格式
  • Bash 参数引号和 eval

    我编写了一个 bash 日志记录库 用我公司当前正在使用的一些复杂脚本来实现 在进行日志调用时 我一直致力于提供调用脚本的脚本文件名 BASH SOURCE 和行号 LINENO 但是 我不想依赖用户或实现脚本来将这两个变量作为参数传递 如
  • 如何在 C# 中启动文件

    编辑 我觉得自己像个白痴 我有一种感觉 像下面的答案会起作用 但没有看到任何与下面的答案类似的谷歌结果 所以当我看到这段复杂的代码时 我想它一定是这样的 我搜索并找到了这个Windows 列出并启动与扩展关联的应用程序 https stac
  • 如何在Shell脚本中解析字符串

    我想在 shell 脚本中解析以下字符串 VERSION 2 6 32 54 0 11 def 这里我想得到两个值 first 263254 second 11 我使用以下方法来获取第一个值 first expr substr VERSIO
  • bash:清理三个文件的外连接,保留文件成员资格

    考虑以下三个文件 其标题位于第一行 file1 id name in1 1 jon 1 2 sue 1 file2 id name in2 2 sue 1 3 bob 1 file3 id name in3 2 sue 1 3 adam 1
  • 用于编辑 /etc/sudoers 文件的正则表达式模式

    我想删除 etc sudoers 文件中的 uncommnet 轮组 那么我应该使用什么正则表达式模式 cat etc sudoers Allows members of the sys group to run networking so
  • 配置confixtx.yaml文件?

    我正在尝试使用以下内容构建 Hyperledger Fabric 网络 Smartforce 订购者组织 Falcon io ORG1 弗罗斯特 io ORG2 我已经使用 cryptogen 工具生成了所有加密材料 不希望使用 confi
  • shell中如何求数组的长度?

    shell中如何求数组的长度 例如 arr 1 2 3 4 5 我想得到它的长度 在本例中是 5 a 1 2 3 4 echo a 4
  • 为什么是 ”& ;”无效的语法?

    我正在尝试在终端上运行 for 循环 我希望将每次迭代发送到后台进程 以便所有迭代同时运行 以下是命令一一运行 for i in sra do fastq dump split files i done only 我突出显示了分号 要同时运
  • 如何在 Linux/OS X 上温和地终止 Firefox 进程

    我正在使用 Firefox 进行一些自动化操作 尽管我可以从 shell 打开 Firefox 窗口 但我无法正确终止它 如果我kill火狐进程与kill 3 or kill 2当我下次打开新的 Firefox 窗口时 命令会询问我是否要在
  • 在后台使用 HERE_DOC 方法运行脚本

    我有一个应该在后台运行的脚本 我必须在运行 bash 后立即回答一个问题 我该怎么做 nohup python script py lst lt
  • shell解析json并循环输出组合变量

    杰斯克喜欢我之前的话题 https stackoverflow com questions 74063588 shell parsing json contains spaces in string 我知道如何解析带有空格的简单 json
  • 如何重命名 bash 函数?

    我正在围绕另一个定义 bash 函数的软件包开发一些方便的包装器 我想用我自己的同名函数替换他们的 bash 函数 同时仍然能够从我的函数中运行他们的函数 换句话说 我需要重命名它们的函数 或者为其创建某种持久别名 当我创建同名函数时 该别
  • exec()、shell_exec()、curl_exec() 的安全漏洞

    有时 我会使用 exec shell exec 和curl exec 以下是典型用途 假设其中有 PHP 变量 即第一个变量中的 html 用户有可能修改其内容 从安全漏洞的角度来看 我应该关注什么 escapeshellcmd 和 esc
  • BASH 中的空函数

    我正在使用 FPM 工具创建 deb 包 此工具在从支持的文件中删除包之前 之后创建 不幸的是FPM生成的bash脚本包含这样的函数 dummy 该脚本退出时出现错误 语法错误 意外 BASH 不允许空函数吗 哪个版本的 bash linu
  • 如何回忆上一个 bash 命令的参数?

    Bash 有没有办法回忆上一个命令的参数 我通常这样做vi file c其次是gcc file c Bash 有没有办法回忆上一个命令的参数 您可以使用 or 调用上一个命令的最后一个参数 Also Alt can be used to r

随机推荐

  • Java字符串数组反转

    我试图反转 java 数组中的所有字符串 但似乎用第一个字符串覆盖了所有字符串 private static void palindrome String s int flag 0 String reverse for int i 0 i
  • 学习如何分析项目

    我刚刚偶然开始为我公司的一个客户 中小企业 分析一个项目 我是一名 Net 开发人员 5 年 在分析软件方面经验很少 来自学校的 UML 我们刚刚结束了与用户两周的交谈 并得到了一份不错的需求清单 显然 我们已经过滤掉了最重要的需求 并且必
  • 使用 fetchedResultsController 删除表视图中的行

    在 swype 删除期间 此方法最重要的几行 void tableView UITableView tableView commitEditingStyle UITableViewCellEditingStyle editingStyle
  • 如何在 ActionScript 3 中获取用户的屏幕分辨率?

    ActionScript 3 有没有办法检测用户的屏幕分辨率 这些会将数字返回到输出窗口 trace Capabilities screenResolutionX trace Capabilities screenResolutionY
  • Netty:如何处理从 ChunkedFile 接收到的块

    我是 netty 新手 我正在尝试将分块文件从服务器传输到客户端 发送块工作得很好 问题在于如何处理接收到的块并将它们写入文件 我尝试的两种方法都会给我带来直接缓冲区错误 任何帮助将不胜感激 Thanks Override protecte
  • 使用 LINQ to Entities 将多条记录插入表的正确方法

    正如我们许多人所做的那样 我设置了一个简单的循环来从数据库添加多个记录 一个典型的例子是这样的 方法一 A list of product prices List
  • 从图像中删除周围的空白

    我有一组从客户那里收到的产品图片 每张产品图片都是某物的照片 并且是在白色背景下拍摄的 我想裁剪图像的所有周围部分 但只保留中间的产品 这可能吗 举个例子 http www 5dnet de media catalog product d
  • Eclipse 如何针对第三方框架进行代码补全?

    How does the Eclipse editor work to enable code completion For example within the XML editor for Hibernate property file
  • 非静态内部类对象不再被引用后会被垃圾回收吗?

    我有一个类似于以下的 spring bean public class MyServiceImpl private MyDAO myDAO public class MyInnerClass implements SomeInterface
  • 如何在 JavaFX 应用程序中显示 HTML

    我正在开发一个 FontViewer 应用程序 它根据所选的字体样式更改文本的字体 这是我的应用程序的控制器类 public class FXMLDocumentController implements Initializable FXM
  • 使用动作脚本获取IP地址?

    是否可以通过Flash swf Action Script 3获取客户端IP地址 然后将其传递到php文件以将其存储在数据库中 无需在 Flash 中执行此操作 只需在服务器上的 php ip REMOTE ADDR 中执行此操作即可
  • 为什么调试器内存窗口在 VS 2015 中不可用?

    Visual Studio 调试器具有这些内存窗口 用于检查原始内存 在 Visual Studio 2015 中 这些仍然存在 因为存在关联的命令 好吧 文档也是这么说的 然而他们并没有出现 在菜单中 调试 gt Windows gt 没
  • 为什么 django 会忽略来自线路的 HTTP_X_FORWARDED_PROTO 但在测试中却不会?

    如果 HTTP X FORWARDED PROTO 通过网络传输 为什么 django 会忽略它 我在 settings xml 中添加了以下配置 make sure we know when we are secure when we a
  • Java 中的字符串连接和自动装箱

    当您将 String 与 int 等原语连接起来时 autobox价值第一 ex String string Four 4 它如何将值转换为字符串Java 要查看 Java 编译器生成的内容 使用它总是有用的javap c显示实际生成的字节
  • Matplotlib 子图太窄且布局紧凑

    我目前正在尝试使用 GridSpec 在 Matplotlib Python 3 6 Matplotlib 2 0 0 中绘制许多子图 这是最小的工作示例 import matplotlib pyplot as plt from matpl
  • make_unique 完美转发

    为什么没有std make unique标准 C 11 库中的函数模板 我发现 std unique ptr
  • Alien::wxWidgets 在 OSX10.10 上安装失败

    我正在尝试使用 wxWidgets 版本 3 0 2 安装 Alien wxWidgets 版本 0 67 但无论我做什么 都会收到以下错误 checking if C compiler clang mmacosx version min
  • Spring BindingResult错误[重复]

    这个问题在这里已经有答案了 我收到以下错误消息 java lang IllegalStateException Neither BindingResult nor plain target object for bean name bill
  • 如何防止Delphi ADO将整个表加载到内存中?

    我不是 Delphi 程序员 但我有一个旧的 Delphi 7 应用程序需要修复 并且它正在使用 ADO 数据库表 MS Access 包含 100 000 行 当我设置 ADOTable Active true 时 它 开始将整个表加载到
  • getopts 不会连续调用两次吗? [复制]

    这个问题在这里已经有答案了 由于某种原因 这些选项在第一次调用时工作正常lib progress bar c u 0 100 但在第二次通话及之后 一切都是默认的 因为它看起来像getopts c u d p s m flag第二次不是真的