一些有用的 shell 知识

    1. 判断某类型或特征的文件是否存在,比如判断一个脚本是否曾经执行过的标志就是其会生成某种开头或后缀名的文件,但我们并不能确定具体的文件名是什么,这样就不能用 if [ -f name.postfix ]; then dosomgthing; fi 这种形式,这种时候可以稍微迂回一下
      files=$(ls prefix*.postfix 2>/dev/null | wc -l)
      if [ "$files" != "0" ]; then
      dosomething
      fi

      也就是首先获得满足条件的文件数目,然后判断数目是否等于零。处理方法很容易想到,主要问题是用 ls 显示文件名的话,如果匹配不到任何文件名,则会有提示报错。这里的主要知识点是可以用 2> 只重定向错误输出到 /dev/null  。wc -l 命令是统计数据流中的单词数目。参考自https://blog.csdn.net/zhuhai__yizhi/article/details/77267598

    2. 脚本中任何命令执行失败则退出整个脚本。这个是很常见的需求,比如一个自动处理数据的脚本,前后名利之间存在依赖,如果其中有流程执行出错,则剩余部分也不需要再执行了。稍微笨一点的方法是流程中的每一步都返回一个状态值,然后根据状态值判断是否执行后续命令还是退出脚本。一个稍微显得聪明点的做法是脚本设置成命令错误就退出,做法是在脚本的开头包含 set -e 。参考自https://blog.csdn.net/drbinzhao/article/details/8281645
    3. python脚本的返回值可以通过 sys 模块返回,如 sys.exit(1) 
    4. shell 脚本定义函数并返回数组。一些很长的 shell 脚本可能会通过定义函数等使脚本写的更加模块化,增加可读性,或者提高代码复用。这种场景下需要一些定义函数或者返回数组等的知识。
      function lstemptydir {
          local ind=0
          local dirlst
          for dirname in `ls 2000* -d`; do
              if [ -d $dirname ]; then
                  cd $dirname;
                  files=$(ls photo/ftb*.fits 2>/dev/null | wc -l)
                  if ! [[ -d photo && "$files" != "0" ]]; then
                      dirlst[${ind}]=`pwd`
                      ind=$(($ind+1))
                  fi
                  cd ..
              fi
          done
          echo ${dirlst[*]}
      }
      
      result=($(lstemptydir))
      echo ${#result[@]}
      for name in ${result[@]}; do
          echo $name;
      done

      参考自:https://www.runoob.com/linux/linux-shell-func.html
      http://c.biancheng.net/view/812.html
      https://blog.csdn.net/guizaijianchic/article/details/78012179
      https://stackoverflow.com/questions/14839199/returning-array-from-a-bash-function

    Visits: 152

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

*