Bash
Bash腳本:檢查文件是否為文本文件
我正在編寫一個基於菜單的 bash 腳本,其中一個菜單選項是發送帶有文本文件附件的電子郵件。我無法檢查我的文件是否為文本文件。這是我所擁有的:
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
我不斷收到錯誤提示:分隔符必須是單個字元。
問題發生在
cut -d\ -f2
. 將其更改為cut -d\ -f2
.To
cut
,參數如下所示:# bash: args(){ for i; do printf '%q \\\n' "$i"; done; } # args cut -d\ -f2 cut \ -d\ -f2 \
這就是問題所在。
\
將空格轉義為空格文字,而不是 shell 中參數之間的分隔符,並且您沒有添加額外的空格,因此整個-d\ -f2
部分顯示為一個參數。您應該添加一個額外的空格,-d\
並-f2
顯示為兩個參數。為了避免混淆,許多人使用引號
-d' '
代替。PS:我寧願使用文件而不是使所有內容都變成ASCII,而是使用
if file "$attachment2" | grep -q text$; then # is text else # file doesn't think it's text fi
file $attachment
從它說的事實來看file "$attachment"
,我猜您的腳本無法處理包含空格的文件名。但是,請注意文件名可以包含空格,並且編寫良好的腳本可以處理它們。那麼請注意:$ file "foo bar" foo bar: ASCII text $ file "foo bar" | cut -d' ' -f2 bar:
一種流行且強烈推薦的方法是空終止文件名:
$ file -0 "foo bar" | cut -d $'\0' -f2 : ASCII text
- 該
file
命令對文件是什麼類型的文件進行有根據的猜測。自然,猜測有時是錯誤的。例如,file
有時會查看一個普通的文本文件並猜測它是一個 shell 腳本、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