我正在开发一个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"
,而不是。如果去掉双引号,shell将对变量的值执行通配符展开和分词。除非你知道这是你想要的,否则就用双引号。命令替换$PrintQueue/$PrintFile
$(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