Проверьте команду execute после проверки типа файла - PullRequest
1 голос
/ 26 июня 2011

Я работаю над сценарием 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 ]

1 голос
/ 26 июня 2011

Вы проходите много дополнительной работы.Вот идиоматический код, я позволю странице справочника дать объяснение частей:

#!/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 будет выполнять ту же работу с меньшими хлопотами
  • оператор case обладает удивительной силой
0 голосов
/ 26 июня 2011

Во-первых, две общие проблемы программирования оболочки:

  • Не анализировать вывод 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
0 голосов
/ 26 июня 2011
#!/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
...