一、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的写法。