for循环自定义中的范围变量

SHLelieveld

我对for循环中的范围变量有疑问。在for循环中,我知道您可以使用{..}来定义范围。但我希望它可以由客户定义。所以脚本要求一个范围值,我希望它是灵活的。像这样:

#!/bin/bash
while true; 
    do
    echo "Some explenation..."
    read -p "Possible values are: ALL or RANGE (to define a specific range):" answer
    case $answer in
            #ALL
            [aA][lL][lL] )
            echo "ALL is selected, 1 to 250"
            RANGE="{1..250}"
            break
            ;;
            #RANGE
            [rR][aA][nN][gG][eE] )
            echo "Range is selected, please define a custom range. Notation should be like: <start>..<stop>"
            echo "or: <single> <single>"
            echo "or a combination of both. Like: 1..23 28 29 101..145 180 212"
            read RANGE
            break
            ;;
            #OTHERS
            * )
            echo "Typo error!! Not correct, type again ALL, PRI, SEC or 
RANGE"
            ;;
    esac
    done
echo ""
echo "Range for this execution is set to:"
echo "$RANGE"
for NEXI in $RANGE
    do
    sleep 0.2
    echo "Nexus number: $NEXI"
    done
echo ...

但是,当我输入{1..10} 52 54 {120..128}时,输出为:

Nexus number: {1..10}
Nexus number: 52
Nexus number: 54
Nexus number: {120..128}

虽然我希望它像:

Nexus number: 1
Nexus number: 2
Nexus number: 3
Nexus number: 4
Nexus number: 5
Nexus number: 6
Nexus number: 7
Nexus number: 8
Nexus number: 9
Nexus number: 10
Nexus number: 52
Nexus number: 54
Nexus number: 120
Nexus number: 121
... etc.

完全写出来。

我该如何改变才能做到这一点?

谢谢。

芒登

问题是大括号扩展发生在变量扩展之前。如中所述man bash

扩展的顺序是:大括号扩展;波浪线扩展,参数和变量扩展,算术扩展和命令替换(以从左到右的方式完成);分词 和路径名扩展。

这意味着当您具有诸如$varcontains{1..3}和do之类的内容时echo "$var",外壳程序会将变量扩展为其值之前查找可能的括号扩展由于括号位于变量中,因此这意味着外壳上看不到括号,因此不执行括号扩展。

eval如果该变量是一个范围,则一种变通方法是该变量。for循环之前添加以下行

if [[ $RANGE =~ ^[0-9]+\.\.[0-9]+$ ]]; then
        RANGE=$(eval echo {$RANGE})
fi

现在,更笼统地说,避免在shell脚本中使用CAPITAL变量名通常是一个好主意。环境变量通常大写,如果碰巧使用与定义的env变量相同的名称,则可能导致混淆。因此,为了安全起见,请使用小写的变量名。

而且,这是一个非常烦人的程序,需要调试并且同样烦人。不要在运行时提示用户输入信息!相反,请更改脚本并使其带有参数。键入值很困难,烦人,容易出错,并且不能自动执行。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

可以查看自定义指令中的范围吗?

来自分类Dev

自定义plist文件中的变量

来自分类Dev

构造自定义的for循环

来自分类Dev

具有自定义步骤的循环的C ++范围

来自分类Dev

Angular中的多个自定义指令范围

来自分类Dev

自定义Gnuplot中的颜色范围

来自分类Dev

自定义帖子循环

来自分类Dev

在自定义范围输入中显示刻度位置

来自分类Dev

自定义指令中范围对象内的嵌套对象

来自分类Dev

在PostgreSQL中索引自定义范围类型的数组

来自分类Dev

Weld CDI自定义范围中的种子值

来自分类Dev

在for循环头中定义的变量范围

来自分类Dev

如何在Android中制作自定义范围栏?

来自分类Dev

自定义“比较”和Highcharts中的轴范围

来自分类Dev

Azure中的自定义OAuth范围

来自分类Dev

SwiftUI中的自定义范围滑块

来自分类Dev

ng-repeat中具有隔离范围的自定义指令:循环项突然为空

来自分类Dev

构造自定义的for循环

来自分类Dev

在会话范围或bean中存储自定义组件的属性

来自分类Dev

循环自定义属性

来自分类Dev

Wordpress中的自定义循环分页

来自分类Dev

自定义日期范围

来自分类Dev

在PostgreSQL中索引自定义范围类型的数组

来自分类Dev

Weld CDI自定义范围中的种子值

来自分类Dev

Word文档中的自定义变量

来自分类Dev

自定义指令中的孤立范围

来自分类Dev

自定义范围输入

来自分类Dev

Python中自定义函数中的输入或变量满足条件时如何退出while循环

来自分类Dev

自定义python模块中的变量