我正在开发一个shell脚本,它接受一个命令行参数,一个文件路径(可能是相对的或绝对的)。该脚本应检查该文件并打印由短语组成的单行:
Windows ASCII
如果文件是带有CR / LF行终止符的ASCII文本文件,或
其他东西
如果文件是二进制或带有“Unix”LF行终止符的ASCII。
目前我有以下代码。
#!/bin/sh
file=$1
if grep -q "\r\n" $file;then
echo Windows ASCII
else
echo Something else
fi
它正确地显示信息,但是当我通过诸如/ bin / cat传递非Windows ASCII类型的东西时,它仍然将其视为Windows ASCII。当我传递.txt文件类型时,它会按预期显示其他内容,它只显示在显示Windows ASCII的文件夹上。我想我没有正确处理它,但我不确定。有关如何解决此问题的任何指示?
答案 0 :(得分:1)
如您所指定,您只需要区分两种情况,这应该有效。
#!/bin/sh
file="$1"
case $(file "$file") in
*"ASCII text, with CRLF line terminators" )
echo "Windows ASCII"
;;
* )
echo "Something else"
;;
esac
正如您指定#!/bin/sh
,或者如果您的目标是完全向后兼容,则可能需要更改
$(file "$file")
与
`file "$file"`
要将脚本与包含空格的文件名一起使用,请注意所有$
变量名称现在都用双引号括起来。并且当你调用脚本时,你还必须引用文件名中的空格字符,即
myFileTester.sh "file w space.txt"
OR
myFileTester.sh 'file w space.txt'
OR
myFileTester.sh file\ w\ space.txt
OR
此外,如果您必须开始区分file
可以分析的所有可能情况,那么您手上就会有一个相当大的案例陈述。 AND file
因其返回的不同消息而臭名昭着,具体取决于/etc/file/magic
,操作系统,版本等的内容。
IHTH
答案 1 :(得分:0)
使用file
命令查找文件类型:
$ file /etc/passwd
/etc/passwd: ASCII English text
$ file /bin/cat
/bin/cat: Mach-O 64-bit executable x86_64
$ file test.txt
test.txt: ASCII text, with CRLF line terminators