zoukankan      html  css  js  c++  java
  • 浅析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的写法。

  • 相关阅读:
    memcached客户端memadmin安装使用
    git之一: 在windows下安装git和使用总结
    nginx常用命令
    mysql授权 REVOKE 添加用户等
    mysql密码忘记解决
    个人常用alias
    解决zabbix图形界面中文乱码
    JsonPath的使用
    Httpclient 支持https(转)
    字符串拼接‘+’实现
  • 原文地址:https://www.cnblogs.com/goloving/p/14952072.html
Copyright © 2011-2022 走看看