1

ファイルタイプに応じてコマンドを実行する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

4

3 に答える 3

1

あなたは多くの余分な仕事を経験しています。慣用的なコードは次のとおりです。マニュアルページに各部分の説明を記載します。

#!/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

いくつかの注目すべき点:

  • bash の代わりに sh を使用すると、移植性が向上し、操作方法の選択肢が狭まります
  • グロブパターンが同じ仕事を手間をかけずに行う場合は、 ls を使用しないでください
  • caseステートメントには驚くべき力があります
于 2011-06-26T11:50:19.073 に答える
0

まず、2つの一般的なシェルプログラミングの問題:

  • の出力を解析しないでください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
于 2011-06-26T12:38:44.603 に答える
0
#!/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
于 2011-06-26T11:49:41.820 に答える