检查文件类型后检查执行命令



我正在开发一个bash脚本,该脚本根据文件类型执行命令。我想使用"文件"选项,而不是文件扩展名来确定类型,但我对这方面的脚本知识非常陌生,所以如果有人能帮助我,我将非常感谢!-谢谢

这里的脚本我想包括的功能:

 #!/bin/bash
 export PrintQueue="/root/xxx";
 IFS=$'n'
 for PrintFile in $(/bin/ls -1 ${PrintQueue}) do
     lpr -r ${PrintQueue}/${PrintFile};
 done

重点是,所有PDF文件都应该使用lpr命令打印,所有其他文件都应该用ooffice -p 打印

您正在经历许多额外的工作。这是惯用代码,我将让手册页提供这些片段的解释:

#!/bin/sh
for path in /root/xxx/* ; do
    case `file --brief $path` in
      PDF*) cmd="lpr -r" ;;
      *) cmd="ooffice -p" ;;
    esac
    eval $cmd "$path"
done

一些值得注意的地方:

  • 使用sh而不是bash提高了可移植性,并缩小了做事方式的选择范围
  • 当glob模式可以以较少的麻烦完成相同的工作时,不要使用ls
  • 案情陈述具有惊人的威力

首先,两个常见的shell编程问题:

  • 不要解析ls的输出。它不可靠而且完全没有用。使用通配符,它们既简单又健壮
  • 总是在变量替换前后加双引号,例如"$PrintQueue/$PrintFile",而不是$PrintQueue/$PrintFile。如果去掉双引号,shell将对变量的值执行通配符展开和分词。除非你知道这是你想要的,否则就用双引号。命令替换$(command)也是如此

从历史上看,file的实现有不同的输出格式,它们是为人类而不是解析而设计的。大多数现代实现都可以选择输出MIME类型,这很容易解析。

#!/bin/bash
print_queue="/root/xxx"
for file_to_print in "$print_queue"/*; do
  case "$(file -i "$file_to_print")" in
    application/pdf;*|application/postscript;*)
      lpr -r "$file_to_print";;
    application/vnd.oasis.opendocument.*)
      ooffice -p "$file_to_print" &&
      rm "$file_to_print";;
    # and so on
    *) echo 1>&2 "Warning: $file_to_print has an unrecognized format and was not printed";;
  esac
done
#!/bin/bash
PRINTQ="/root/docs"
OLDIFS=$IFS
IFS=$(echo -en "nb")
for file in $(ls -1 $PRINTQ)
do
        type=$(file --brief $file | awk '{print $1}')
        if [ $type == "PDF" ]
        then
                echo "[*] printing $file with LPR"
                lpr "$file"
        else
                echo "[*] printing $file with OPEN-OFFICE"
                ooffice -p "$file"
        fi  
done
IFS=$OLDIFS

相关内容

  • 没有找到相关文章

最新更新