Bashスクリプト:ファイルがテキストファイルであることを確認してください。

Bashスクリプト:ファイルがテキストファイルであることを確認してください。

私はメニューベースのbashスクリプトを書いていますが、メニューオプションの1つはテキストファイル付きの電子メールを送信することです。私のファイルがテキストファイルであることを確認できません。これが私が持っているものです:

fileExists=10
until [ $fileExists -eq 9 ]
do
  echo "Please enter the name of the file you want to attach: "
  read attachment
  isFile=$(file $attachment | cut -d\ -f2)
  if [[ $isFile = "ASCII" ]]
    then
      fileExists=0
    else
      echo "$attachment is not a text file, please use a different file"
  fi
done

エラーが発生し続けます。区切り文字は単一文字でなければなりません。

ベストアンサー1

  1. file $attachment 代わりにという事実を判断すると、file "$attachment"あなたのスクリプトはスペースを含むファイル名を処理できないようです。ただし、ファイル名にはスペースを含めることができ、よく書かれたスクリプトを使用してそれを処理できます。それから注意してください:

    $ file "foo bar"
    foo bar:  ASCII text
    
    $ file "foo bar" | cut -d' ' -f2
    bar:
    

    広く使用され、強く推奨される方法は、ファイル名をnullで終了することです。

    $ file -0 "foo bar" | cut -d $'\0' -f2
    :  ASCII text
    
  2. このfileコマンドは、ファイルのファイル形式に関する情報に基づいて推測します。もちろん推測が間違っている場合もある。たとえば、file時にはプレーンテキストファイルを見て、それがシェルスクリプト、Cプログラム、または他のものであると推測します。したがって、出力があるかどうかを確認したくありません。file はい ASCII text、あなたが知りたいことは説明するファイルはテキストファイルです。マニュアルページを見ると、ファイルがテキストファイルの場合、出力にその単語が含まれているfileことがわかりますが。出力には次の単語が含まれます。textshell commands textfiletext

    isFile=$(file -0 "$attachment" | cut -d $'\0' -f2)
    case "$isFile" in
       (*text*)
          echo "$attachment is a text file"
          ;;
       (*)
          echo "$attachment is not a text file, please use a different file"
          ;;
    esac
    

おすすめ記事