Проверьте команду 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
Другие вопросы по тегам