zoukankan      html  css  js  c++  java
  • 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里的元素,可以看到成功的输出了预期值:

  • 相关阅读:
    选择排序
    插入排序
    冒泡排序
    java实现串的匹配和替换
    动态字符串的存储结构的实现
    静态串的存储结构以及增删改查
    链式队列的操作实现
    java中程序的执行的原理如怎么创建空间,创建对象等
    java中的环境变量的配置
    java的JVM以及java中代码的运行过程
  • 原文地址:https://www.cnblogs.com/xdao/p/bash_tips.html
Copyright © 2011-2022 走看看