LinuxShell编程学习日记

作者: 胡浩源
相关文档:
  1. 《shell编程基础》
  2. 《Linux系统下C程序开发详解》第4章
目录:
  1. 变量赋值,引用和比较
  2. 流程控制
    1. if语句
    2. && 和 || 操作符
    3. case语句
    4. select 语句
    5. while/for循环


又来了新的磁盘阵列了,这次是华为-赛门铁克的,之前使用的iozone的绘图脚本给出的结果让我一直觉得很不舒服。那个原始文件大小很多余,绘出来的结果很有气势,分析起来却很不直观。如图:

虽然可以发现FileSize也是影响也是影响性能的比较关键的因素之一,但是无法比较直观的给出二元图还是比较遗憾的。所以接下去要干的事情就比较清晰了,iozone的绘图脚本实际上就是个调用gnuplot的shell,那么我要学两个东西:shell和gnuplot。我选择先学习shell。
学习shell的资料一抓一大把,我搜了个ubuntu社区的《shell编程基础》,还有《Linux系统下C程序开发详解》第4章,因为高级的我的确也用不着。

变量赋值,引用和比较

赋值用等号,引用加$号,要记得是等号两边不能有空格,如果出现num=10;$numer之类的情况要加花括号${num}er,否则他会去找名叫numer的变量。

还有如果想把命令行的输出结果赋给一个变量的话需要使用``。比如d=`file $1`,这是左上角和~在一起的那个,不是引号。

需要注意shell的默认赋值是字符串赋值。比如:

var=1
var=$var+1
echo

打印出来的不是2而是1+1。为了达到我们想要的效果有以下几种表达方式:

let "var+=1"
var=$[$var+1]
var=`expr $var + 1`#注意加号两边的空格,否则还是按照字符串的方式赋值。

let表示数学运算,expr用于整数值运算,每一项用空格隔开,$[]将中括号内的表达式作为数学运算先计算结果再输出。

shell里面数值的比较不能使用常见的<,>等运算符,而是采用了命令的方式,详见bash 比较运算符。

流程控制

if语句

if ....; then
....
elif ....; then
....
else
....
fi
这个傻子也能看明白把,主要要说的是用来判断条件的表达式,用一对[ ]围起来,必须前后有空格。具体的如下:
  1. [ -f "somefile" ] :判断是否是一个文件
  2. [ -x "/bin/ls" ] :判断/bin/ls是否存在并有可执行权限
  3. [ -n "$var" ] :判断$var变量是否有值
  4. [ "$a" = "$b" ] :判断$a和$b是否相等

另外在写的时候别忘记分号,条件语句后面有分号,执行语句后面是没有的,有几个if就需要有几个fi,elif不算。
#!/bin/sh
if [ -f "if.sh" ];then echo begin to excute
if [ -b "$var" ]; then echo failed
elif [ -x "if.sh" ];then echo excute if.sh
fi
fi

&& 和 || 操作符


&&表示如果左边为真,那继续执行右边,||则是如果左边为假,执行右边。

case语句


case ... in
...) do something here ;;
esac
case in是用来匹配一个字符串的,是完全匹配,不会检索case的字符串是否被in后面跟的字符串包容。而且跟的是两个分号,esac不要写错。
#!/bin/sh
case "$1" in
"hello world")
echo "hellworld";;
"hello everyone")
echo "hello everyone";;
esac

$1的意思就是输入的第一个参数,以此类推。

select 语句


select var in ... ; do
break;
done
.... now $var can be used ....

select还是挺有用的,用来让用户选择一个变量需要的赋值。如果有报错的话需要将#!/bin/sh改成#!/bin/bash,这是ubuntu wiki上现成的,否则对于我这个初学者来说估计又要折腾半天 。
#!/bin/bash
echo "who's your girl?"
select girl in "Mary" "HanMeimei" "LiHong";
do break;
done
echo "your girl is $girl"

while/for循环


while ...; do
....
done
这个不用解释什么了,break跳出循环,continue跳出当前循环进入下一次。
#!/bin/bash
i=0
while [ $i -lt 5 ];
do let "i+=1";
echo $i;
done


for var in ....; do
....
done

for会遍历一个用空格分隔的字符串列表并且给var赋值。
#!/bin/sh
for i in $*;
do echo `file $i`;
done

以上脚本会读入每一个输入的参数并且输出他的文件信息,$*对应于输入的以空格分隔的所有参数。


更多相关文章

  1. 我用的mysqlcc,我想看别人执行过哪些语句怎么看?
  2. sql查询每个学生的最高成绩mysql语句
  3. 一条SQL语句实现添加不重复记录
  4. SQL查找条件语句构造类
  5. 如何利用SQL语句查询数据库中所有表的名称?
  6. sql语句延时执行或者是指定时间执行
  7. 减去两个SELECT语句以产生单个结果?
  8. C#中操作Oracle时的SQL语句参数的用法
  9. 求助:请大侠帮我把下面的查询语句改写为可以在SQL"作业"中定时执

随机推荐

  1. Excel函数(3):查找引用
  2. Excel函数(4)日期、文本函数
  3. 把 React 作为 UI 运行时来使用 [每日前
  4. 数据透视表,一篇就够了
  5. 一文带你了解数据保护的重要性
  6. Excel数据获取
  7. 青铜和黄金选手分别怎么玩转python列表?
  8. CSS Flexbox 可视化手册 [每日前端夜话(0
  9. 用Python生成自己专属的手机春节壁纸
  10. super(props) 真的那么重要吗?[每日前端夜