Проверьте команду execute после проверки типа файла
Я работаю над сценарием bash, который выполняет команду в зависимости от типа файла. Я хочу использовать опцию "file", а не расширение файла, чтобы определить тип, но я чертовски новичок в этом сценарии, так что если кто-то может мне помочь, я был бы очень благодарен! - Спасибо!
Вот в скрипт я хочу включить функцию:
#!/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
3 ответа
Вы проходите много дополнительной работы. Вот идиоматический код, я позволю man-странице предоставить объяснение частей:
#!/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 увеличивает переносимость и сужает выбор того, как делать вещи
- не используйте ls, когда шаблон glob будет выполнять ту же работу с меньшими хлопотами
- описание дела имеет удивительную силу
#!/bin/bash
PRINTQ="/root/docs"
OLDIFS=$IFS
IFS=$(echo -en "\n\b")
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
Во-первых, две общие проблемы программирования оболочки:
- Не разбирайте вывод
ls
, Это ненадежно и совершенно бесполезно. Используйте шаблоны, они просты и надежны. - Всегда ставьте двойные кавычки вокруг переменных замен, например
"$PrintQueue/$PrintFile"
не$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