背景

需要批量跑一批Linux的样本,通过shell脚本文件完成自动化行为,并需要nohup达到后台运行的目的,避免占用控制器。

代码逻辑

ls $1:获取当前目录下所有文件名

排除自身(不然会嵌套循环)

获取自身文件名

  1. nameFile=`basename ${BASH_SOURCE}`
  2. 或者
  3. `basename $0`

$0

$0 是一个变量,保存了执行文件的文件名,相当于 C 语言中的 argv[0]。

但是

有一种情况$0 会出错,就是 cat abc.sh | bash 一般 $(basename $0) 比如脚本在 /root 目录下 脚本名为 abc.sh 全路径运行 $0 是 /root/abc.sh 当前目录运行时 ./abc.sh basename 取最后一个文件名。 如果是符号链接,$0 也不准 确实没有一种很好的方法来确定脚本自身文件名。 其实原理很简单。 因为维度不一样, shell 脚本运行的时候是无法直接获得比自己高一维度的信息的。 就像虚拟机里面运行的程序不知道自己是在虚拟机里面跑一个道理

${BASH_SOURCE}

当前执行的 shell 文件所在的路径及文件名。
${BASH_SOURCE-$0} 的含义?

nohup:在后台执行

但是

有部分样本如果在后台运行时需要输入,会造成执行流卡住。
只能取消后台执行,暂时没有更好的办法解决。

Shell脚本

  1. #!/bin/bash
  2. ########################################
  3. #Author : 建瓯最坏
  4. #Time : 22.10.18
  5. ########################################
  6. nameFile=`basename ${BASH_SOURCE}`
  7. function EnumFiles()
  8. {
  9. for file in `ls $1`
  10. do
  11. if [ -d $1"/"$file ]
  12. then
  13. EnumFiles $1"/"$file
  14. else
  15. if [ $file != $nameFile ]
  16. then
  17. nohup $1"./"$file
  18. # echo $1"./"$file
  19. fi
  20. fi
  21. done
  22. }
  23. EnumFiles $1