私はメニューベースの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
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
この
file
コマンドは、ファイルのファイル形式に関する情報に基づいて推測します。もちろん推測が間違っている場合もある。たとえば、file
時にはプレーンテキストファイルを見て、それがシェルスクリプト、Cプログラム、または他のものであると推測します。したがって、出力があるかどうかを確認したくありません。file
はいASCII text
、あなたが知りたいことは説明するファイルはテキストファイルです。マニュアルページを見ると、ファイルがテキストファイルの場合、出力にその単語が含まれているfile
ことがわかりますが。出力には次の単語が含まれます。text
shell commands text
file
text
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