• bash的一些小技巧


    1、从输入读入变量

    eg:read -ep "input yes or no: " flag

    用e选项表示编辑,可以使用backspace删除

    2、数组

    a、索引数组

    declare -a arr=(var1 var2 var3) 用空格分割,如果直接访问变量$arr,

    则获取的是数组的第一个元素,访问要是用${arr[idx]}来。

    也可声明数组后再赋值,即declare -a arr;arr[0]=var1;arr[1]=var2;arr[3]=var3

    如下:

    获取所有数组元素把索引换为@,获取数组长度则要在获取所有数组的变量前加#

    如下:

    b、关联数组

    关联数组把-a,换为-A即可,其它和索引数组类似,但是直接访问变量将没有输出。

    这也好理解,因为没有第一个元素的概念了,而且可以看到获取所有key对应的值时,也是没有顺序的。

    3、字符串转变量

    使用eval命令求值

    eval可以用返回值存储变量,这就有可以和关联数组,实现比较好玩的东西了。

    4、多维数组

    declare -A map1=(
            [key1]=a1
            [key2]=b1
        )
    
    declare -A map2=(
            [key1]=a2
            [key2]=b2    
        )
    
    declare -a arr=(map1 map2)

    如果这时候想获取数组arr里的第一个元素的key1值,估计大家会想到

    tmp=${arr[0]};echo ${tmp[key1]}

    然而输出的是map1,因为map1只是个字符串,并不是指向$map1变量。

    于是可能会想到,这么修改,declare -a arr=($map1 $map2),可是结果是什么也没输出。

    后来我找了一些资料,也没找到解决的方法。或许是bash不支持。

    让我们用eval来试试。

    eval tmp="${map1[key1]}";echo $tmp;

    $表示转义,即不要当变量解析,可以看到成功输出a1。

    那么我们把map1构造出来,${arr[0]}即map1,完整如下:

    eval tmp="${${arr[0]}[key1]}";echo $tmp

    那么我们就可以在循环里做些事情了:

    declare -A map1=(
            [key1]=a1
            [key2]=b1
        )
    
    declare -A map2=(
            [key1]=a2
            [key2]=b2    
        )
    
    declare -a arr=(map1 map2)
    
    for var in ${arr[@]}; do
        eval tmp="${$var[key1]}"
        echo $tmp
    
    done    

    这里的$var即数组arr里的元素,可以看到成功的输出了预期值:

  • 相关阅读:
    第十四届中北大学ACM程序设计竞赛 J.ZBT的游戏
    洛谷P1248 加工生产调度
    洛谷P1736 创意吃鱼法
    洛谷P3372 【模板】线段树 1
    洛谷P1330 封锁阳光大学
    洛谷P3275 [SCOI2011]糖果
    Android 开发60条技术经验总结(转)
    Genymotion常见问题汇总(转)
    页面跳转与数据传递
    网络编程(二)
  • 原文地址:https://www.cnblogs.com/xdao/p/bash_tips.html
Copyright © 2020-2023  润新知