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里的元素,可以看到成功的输出了预期值:

时间: 2024-11-02 23:25:03

bash的一些小技巧的相关文章

[小技巧] 在bash中生成随机数

译至:http://d.hatena.ne.jp/anmino/20091017/1255705586 bash的SHELL参数RANDOM可以生成0-32767的随机数.想设定从1到N的随机数范围的话,可以使用:$ ( ( (RANDOM % n) + 1 )) #!/bin/sh #random_bash.sh for n in 1 2 3 4 5 6 7 8 9 10; do random=$(( (RANDOM % 10) + 1 )) echo -n "$random " d

[小技巧] bash 中快速跳转到目录里

该技巧仅仅适用于如下情况: $ ls /tmp $ cp a.txt /tmp 上述的命令里的最后一个参数是需要跳转的目录时, 按 Alt + . 键,即可快速输出对应的目录. 例子: $ ls /tmp $ cd -> 然后按 Alt + . 这时, /tmp会被自动补全. [小技巧] bash 中快速跳转到目录里

linux 小技巧总结

(1)linux判断文件是否存在 if [ -f filename]: then      ......#要执行的语句 fi 具体例子: file=/usr/local/oracle/oradata/archived_log/file.txt if [ -f $file ];then             #判断文件是否存在,存在就追加   echo $file_i >> $file   else                               #否则复写   echo $fil

[每天一个Linux小技巧] gdb 下一次运行多个命令

一般gdb运行的时候,我们仅仅能输入一个命令. 如: (gdb) c (gdb) bt 假设想运行多个命令怎么办? 能否像bash那样, 使用; 如 ls; ls 结论是不行. 但能够通过gdb 内建函数的的方式来实现: (gdb) def cbt >c >bt 10 >end (gdb) 也能够追加到 $HOME/.gdbinit下, 每次启动gdb后会自己主动载入. [每天一个Linux小技巧] gdb 下一次运行多个命令,布布扣,bubuko.com

Ubuntu使用之Svn命令小技巧

注: [svn Path]:是指要取代码分支的服务器绝对路径 [Path]:是指终端相对当前目录的相对路径,如果是在当前目录下,就省略路径 ①.取svn服务器的代码: svn co [svn Path] ②.查看当前目录的svn状态: svn st ③.查看某个目录的svn状态: svn st [Path]dirName ④.查看某文件在svn上的修改记录: svn log [Path]fileName ⑤.查看某文件/目录在svn上的最近n次修改记录(n必须是大于0的整数): svn log

【转载】有哪些省时小技巧,是每个Linux用户都应该知道的

前言:有网友在问答网站Quora上提问:“有哪些省时小技巧,是每个Linux用户都应该知道的?” Joshua Levy 平常就在 Linux 平台工作,并且他积累了不少实用命令行技巧,他在回复中精选出一部分.对技术用户来说,这些技巧挺重要或实用,但知道的人并不多.下文略有点长,一般来说,用户也不需要对全部内容都了解,但为了达到省时方便的目的,Joshua Levy 仍不遗余力做了校对,以保证列出的每一条都值得一读,前提是你是一位Linux重度用户. 为了获取文中提到的一个命令的更多信息,先试下

对于shell脚本参数获取时的一点小技巧

问题如下: 根据脚本参数的个数$#进行一个循环,在依次输出每个参数$1 $2 $3...... 我有一个循环变量i $i 取到这时的i为1,我想使用这个1再去调用$1,也是就是打印出第一个参数 就是$($i)的意思来取到第几个参数,当然$($i)是不好用的 当时纠结了好久,最后上百度提问,两位高手给出了答案: 1) #!/bin/sh NUMBER=$# echo $NUMBER i=1 while [ $i -le $NUMBER ] do a[$i]=$1 #将数组a[i]赋值为$1,即取得

Linux的95个小技巧

Linux的95个小技巧 by WEB全栈工程师 on 2012 年 03 月 27 日 这里总结了Linux使用中的一些小技巧 1.实现RedHat非正常关机的自动磁盘修复 先登录到服务器,然后在/etc/sysconfig里增加一个文件autofsck,内容如下:AUTOFSCK_DEF_CHECK=yesPROMPT=yes 2.改变文件或目录之最后修改时间(变为当前时间)执行格式:touch name ( name 可为文件或目录名称.) 3.如何设置login后欢迎信息 修改/etc/

对于shell脚本获取参数的一些小技巧

问题如下: 根据脚本参数的个数$#进行一个循环,在依次输出每个参数$1 $2 $3...... 我有一个循环变量i $i  取到这时的i为1,我想使用这个1再去调用$1,也是就是打印出第一个参数 就是$($i)的意思来取到第几个参数,当然$($i)是不好用的 当时纠结了好久,最后上百度提问,两位高手给出了答案: 1) #!/bin/sh NUMBER=$# echo $NUMBER i=1 while [ $i -le $NUMBER ] do a[$i]=$1 #将数组a[i]赋值为$1,即取