浅析shell脚本编程之if语句、for语句及shell脚本中>/dev/null 2>&1具体说明

一、if 语句

  例子,我们项目 jenkins 里使用的

if type cnpm >/dev/null 2>&1; then 
  echo cnpm exists, start install 
else
  echo cnpm not exist, install cnpm 
  npm install -g cnpm --registry=https://registry.npm.taobao.org
fi
npm cache clean --force
cnpm install
npm run gray

  如果 cnpm 存在,直接安装依赖;如果不存在,就先设置 cnpm。

1、单分支if语句:

// 格式:
if 条件; then
    语句1
    语句2
    ...
fi

2、双分支if语句:

if 条件; then
    语句1
else
    语句1
fi

3、多分支if语句:

if 条件1; then
    语句1
elif 条件2; then
    语句1
elif 条件3; then
    语句1
else
    语句1
fi

二、for语句

// 格式:
for 变量 in 列表;do
    语句1;
    语句2;
    ...
done 

  比如:写一个脚本,分别显示 /tmp/1.dir /tmp/2.dir /tmp/3.dir三个文件的时间戳,并将这三个文件被修改的时间改为201003030303.03

#!/bin/bash
for Dir in /tmp/1.dir /tmp/2.dir /tmp/3.dir; do
    stat $Dir
    touch -m -t 201003030303.03 $Dir
    stat $Dir
done

三、shell脚本中>/dev/null 2>&1具体说明

  在最开始的例子中看到 >/dev/null 2>&1,所以可以了解下是什么东西

  详细内容的话,看这篇博客:shell脚本中>/dev/null 2>&1具体说明,我这里只说具体意思  

1、/dev/null是一个特殊的设备文件,这个文件接收到的任何数据都会被丢弃。因此,null这个设备通常也被称为位桶(bit bucket)或黑洞。

  简单地理解就是,重定向操作给这个/dev/null文件的所有东西都会被丢弃。

  因为这些文件描述符输出的字符串,总是会显示出来的。如果我们在shell编程的时候,操作到某一条命令的返回结果,我们不想要这个时候又不想让这个输出结果打印到屏幕上我们就可以重定向到/dev/null这个文件来,由/dev/null这个文件负责处理后事。

  这个丢弃的结果又不能粗暴的认为是删除错误输出,这个操作是一个丢弃重定向输入输出的操作。

2、2>&1,将错误输出绑定到标准输出上。由于此时的标准输出是默认值,也就是输出到屏幕,所以错误输出会输出到屏幕。

3、>filename, 将标准输出1重定向到filename中。

4、>/dev/null 2>&1 对比 >/dev/null 2>/dev/null

  首先command > file 2>file 的意思是将命令所产生的stdout标准输出信息和stderr错误的输出信息送到file 中。

  command > file 2>file 这样的写法,stdout和stderr都直接送到file中,file会被打开两次,这样stdout和stderr会互相覆盖,这样写相当使用了FD1和FD2两个同时去抢占file的管道。

  而command >file 2>&1 这条命令就将stdout直接送向file,stderr 继承了FD1管道后,再被送往file,这种写法file文件只被打开了一次,即只使用了一个管道FD1就包括了stdout和stderr的内容。

  从IO效率上,command >file 2>&1命令的效率要比command > file 2>file的命令效率高,所以在编写shell脚本时,我们较多时间使用command > file 2>&1的写法。

浅析shell脚本编程之if语句、for语句及shell脚本中>/dev/null 2>&1具体说明

上一篇:<只看这个就够了。。。>Android自动化测试及性能优化


下一篇:ym——Android之ListView性能优化