如何编写一个与用户确认现有变量值的 Bash 函数

     2023-02-23     94

关键词:

【中文标题】如何编写一个与用户确认现有变量值的 Bash 函数【英文标题】:how to write a Bash function that confirms the value of an existing variable with a user 【发布时间】:2014-11-18 01:44:12 【问题描述】:

我有大量配置变量,我希望用户对其值进行确认。因此,可能存在一些指定运行号的变量,我希望脚本询问用户该变量的当前值是否正常。如果用户响应该值不正确,则脚本会请求一个新值并将其分配给变量。

我已经对一个函数进行了初步尝试,但它的运行有些困难;它停滞不前。我会重视解决问题的一些帮助,以及对我正在使用的方法的任何批评。代码如下:

confirmVariableValue()
    variableName="$1"
    variableValue="$!variableName"
    while [[ "$userInput" != "n" && "$userInput" != "y" ]]; do
        echo "variable "$variableName" value: "$variableValue""
        echo "Is this correct? (y: continue / n: change it / other: exit)"
        read userInput
        # Make the user input lowercase.
        userInput="$(echo "$userInput" | sed 's/\(.*\)/\L\1/')"
        # If the user input is "n", request a new value for the variable. If the
        # user input is anything other than "y" or "n", exit. If the user input
        # is "y", then the user confirmation loop ends.
        if [[ "$userInput" == "n" ]]; then
            echo "enter variable "$variableName" value:"
            read variableValue
        elif [[ "$userInput" != "y" && "$userInput" != "n" ]]; then
            echo "terminating"
            exit 0
        fi
    done
    echo "$variableValue"


myVariable="run_2014-09-23T1909"
echo "--------------------------------------------------------------------------------"
echo "initial variable value: "$myVariable""
myVariable="$(confirmVariableValue "myVariable")"
echo "final variable value: "$myVariable""
echo "--------------------------------------------------------------------------------"

【问题讨论】:

这个问题似乎跑题了,因为它是关于代码审查的。 没有。代码不起作用。我不知道为什么,正在请求帮助。 @chepner:只有一部分是代码审查。有错误报告:“它停止”。 在哪里停顿了?程序是停止运行,还是不管输入如何都不会停止要求确认,还是什么? 部分问题在于函数返回值的方式。从技术上讲,该函数的所有打印输出都被该函数“返回”。但是,在调用函数时会发生停顿。我认为这是因为它正在等待用户响应,但在执行此操作时没有打印输出。如果你运行代码,行为应该是可观察的。 【参考方案1】:

问题出在这里:

myVariable="$(confirmVariableValue "myVariable")"

你的问题,比如

    echo "Is this correct? (y: continue / n: change it / other: exit)"

正在进入myVariable,而不是屏幕。

尝试向 STDERR 或除 STDOUT 之外的任何其他文件描述符打印问题。

基于意见的评论:我会对这样的配置脚本不满意。它太健谈了。对我来说更好:

打印出描述和默认值 并询问Press Enter for confirm or enter a new value or <something> for exit>

您也可以使用以下技术:

将 bash readline 库用于 read 命令和 -e 使用-i value设置编辑的默认值 使用printf -v variable 打印到变量中,因此您不需要使用var=$(...) 也不需要任何(可能)危险的评估...

示例:

err()  echo "$@" >&2; return 1; 

getval() 
    while :
    do
        read -e -i "$!1" -p "$1>" inp
        case "$inp" in
            Q|q) err "Quitting...." || return 1 ;;
            "") err "Must enter some value" ;;
            *)
                #validate the input here

                #and print the new value into the variable
                printf -v "$1" "%s" "$inp"
                return 0
                ;;
        esac
    done


somevariable=val1
anotherone=val2
x=val3

for var in somevariable anotherone x
do
    getval "$var" || exit 
    echo "new value for $var is: =$!var="
done

【讨论】:

哦,我不知道printf -v。太棒了! 啊,这很漂亮。感谢您对问题的清晰解释以及不仅对用户更友好,而且在代码中更高效的解决方案。 @d3pd 很高兴为您提供帮助。 ;)【参考方案2】:

我不会让他们回答“是”然后输入新值。如果他们需要,只需让他们输入新值,或者将其留空以接受默认值。

这个小功能可以让您在一次调用中设置多个变量:

function confirm() 
    echo "Confirming values for several variables."

    for var; do
        read -p "$var = $!var ... leave blank to accept or enter a new value: "
        case $REPLY in
        "") # empty use default
            ;;
        *) # not empty, set the variable using printf -v
            printf -v "$var" "$REPLY"
            ;;
        esac
    done

这样使用:

$ foo='foo_default_value'
$ bar='default_for_bar'
$ confirm foo bar
Confirming values for several variables.

foo = foo_default_value ... leave blank to accept or enter a new value: bar
bar = default_for_bar ... leave blank to accept or enter a new value:

foo=[bar], bar=[default_for_bar]

当然,如果空白可以是默认设置,那么您需要考虑到这一点,例如 @jm666 使用 read -i

【讨论】:

在用户输入时使用eval可能有点危险...(人为因素,错误...) @jm666:是的。现在我知道了printf -v(感谢您的提示!),我已经消除了eval 的最后合理使用。 :) 还要检查declare(排版)。还允许设置变量。乐于助人:) 非常感谢您的用户友好性建议以及可以很好地处理多个变量的干净代码。

如何将变量值从循环a更新到另一个循环b-在bash中(代码片段)

...我有一个具有多个函数和多个循环的程序)。我的问题:如何在第二个while循环中更新变量的值(在第一个while循环内增加)?这是一个例子(第一个循环增加counter_value但第二个循环增加到“1”):#!/bin/bashcounter_v 查看详情

Bash shell:如何从变量值重新格式化字符串日期

】Bashshell:如何从变量值重新格式化字符串日期【英文标题】:Bashshell:Howtoreformatstringdatefromavariablevalue【发布时间】:2022-01-1200:51:25【问题描述】:我了解如何使用date命令重新格式化日期,我对此很好。但是,我正在努力解决... 查看详情

如何在Visual Studio中检查函数末尾的变量值

】如何在VisualStudio中检查函数末尾的变量值【英文标题】:Howtocheckthevalueofthevariableattheendofafunctioninvisualstudio【发布时间】:2021-01-0822:45:31【问题描述】:我知道我们可以使用局部变量来检查VisualStudio中的变量值,但我们可以查... 查看详情

matlab如何保留变量值

...kuandu调用函数chineselisan就可以得到多个EucDist值。要求:如何保留函数kuandu调用函数chineselisan所得到的每一个EucDist值,请给出集体程序,谢谢!  在使用matlab时,通常要将计算的结果保存到mat文件中。使用的命令是:savefilename... 查看详情

shell怎么取远程服务器的变量值

...作环境,包括用户的宿主目录,命令查找的路径等。我们如何查看我们的环境变量呢?我推荐大家使用#set|more命令,set命令用于查看系统的环境变量,由于环境变量可能会比较长,这是我们可以加上一个|more用于分页查看。屏幕... 查看详情

检查内联函数内的变量值

...数的代码。代码用C++编写并使用MSVC2010编译。我的问题是-如何检查内联函数中变量的值?这是代码示例:classApublic:void*GetMember()returnm_data;private:void*m_data; 查看详情

Bash:从字符串中提取变量值

...述】:我需要从日志文件中提取变量“错误”的值。这是一个示例行:WARN(PeriodicRecovery)IJ000906:error=15checkserver.log我需要捕获“错误”的值。查看类似的答案,我想出了:echo"WARN(PeriodicRecov 查看详情

离开方法时如何保存变量值?

】离开方法时如何保存变量值?【英文标题】:Howtosaveavariablesvaluewhenleavingthemethod?【发布时间】:2017-05-2709:52:43【问题描述】:我有一个方法可以计算用户从atm取款的次数(因为有限制),还可以计算用户当天取款的金额。但是... 查看详情

angularJS:禁用基于变量值的链接,并显示消息框

...时间】:2016-03-1617:12:45【问题描述】:我正在努力弄清楚如何根据布尔变量的值禁用ng-click事件。我有一个表单,用户必须单击(+)符号/链接才能添加新记录,当用户这样做时,会触发一个小函数,并将布尔值设置为false。 查看详情

每当静态变量值更改时触发函数

...【发布时间】:2015-10-1506:22:59【问题描述】:我正在开发一个iPhone应用程序,使用swift通过蓝牙与另一台设备通信。我的问题是,每当变量从CoreBluetooth接收到新数据时,我想在另一个类上触发一个函数(更改显示值)。有人可以... 查看详情

请教matlab中如何输出一个函数的最大值对应的变量值

参考技术Aclear;clc;n=601:3999;Tq=-19.313+295.27*(n/1000)-165.44*(n/1000).^2+40.874*(n/1000).^3-3.8445*(n/1000).^4;[max_Tq,nn]=max(Tq);disp('最大值:');disp(max_Tq);disp('对应的n的值:');disp(n(nn))输出结果:最大值:174 查看详情

一个函数如何实现return好几个返回值

1.全局变量法(慎用)(宏定义也可以实现)使用全局变量的原因由于全局变量的作用域是从变量定义处开始直到程序结束,而对于编写有多个返回值的C语言函数,我们可以考虑把要返回的多个值定义成全局变量。当函数被调用时... 查看详情

编写一个循环来选择变量值的所有组合,在 R 中生成正方程值

】编写一个循环来选择变量值的所有组合,在R中生成正方程值【英文标题】:WritealooptoselectallcombinationofvariablevaluesgeneratingpositiveequationvaluesinR【发布时间】:2019-05-1501:43:30【问题描述】:我有以下四个方程(a,b,c,d),有几个不同的... 查看详情

编写包含变量值的多行字符串

】编写包含变量值的多行字符串【英文标题】:WriteaMulti-LineStringwithVariableValuesIncluded【发布时间】:2018-11-2207:03:08【问题描述】:我的程序参数要求我有一个包含在程序过程中输入的变量值的单个格式化字符串。由于涉及的数据... 查看详情

9.26

函数对象:指的是函数的内存地址可以想一个变量值一样去使用1.变量值可以被引用2变量值可以当做参数传给另外一个函数3.变量值可以当做函数的返回值4.变量值可以是容器类型的元素=======================================================... 查看详情

如何在没有设置器的情况下设置私有变量值?

】如何在没有设置器的情况下设置私有变量值?【英文标题】:Howtosetaprivatevariablevaluewithoutasetter?【发布时间】:2021-10-2719:31:00【问题描述】:我目前正在执行单元测试任务。在项目中,我有一个银行帐户类和一个单元测试类。... 查看详情

如何根据用户 extjs 更改 scss 变量值

】如何根据用户extjs更改scss变量值【英文标题】:Howtochangescssvariablevaluebaseonuserextjs【发布时间】:2015-08-2409:57:07【问题描述】:我想根据用户在运行时提供的颜色更改extjs应用程序的主题颜色。是否可以覆盖scss变量并再次创建cs... 查看详情

如何将变量值与 select 语句的结果一起放入 sql 表中?

】如何将变量值与select语句的结果一起放入sql表中?【英文标题】:HowcanIavariablevalueintoasqltablealongwiththeresultsfromaselectstatement?【发布时间】:2019-07-0118:31:55【问题描述】:我正在尝试将SQL选择语句的结果与FETCH循环内的SQL变量中... 查看详情