确定文件类型的shell脚本

时间:2014-12-12 23:51:32

标签: shell

遇到这个问题的麻烦,我可以使用一些帮助......

创建一个shell脚本fileType.sh,它接受一个命令行参数,一个文件路径(可能是相对的或绝对的)。该脚本应检查该文件并打印由短语

组成的单行

Windows ASCII

如果文件是带有CR / LF行终止符的ASCII文本文件,或

其他东西

如果文件是二进制或带有“Unix”LF行终止符的ASCII。

例如:

./ fileType.sh~cs252 / Assignments / ftpAsst / d3.dat

Windows ASCII

./ fileType.sh / bin / cat

其他东西

./ fileType.sh fileType.sh

其他东西

./ fileType.sh / usr / share / dict / words

其他东西

在给定现有文件的合法路径时,您的脚本不应生成任何其他输出。 (如果给出不存在的文件的路径不正确,它可能会产生任何你喜欢的东西。)

Unix新手,我有一些C ++经验。

这就是我脚本中的内容。

#!/bin/sh
grep -r 'Windows ASCII' $1
if $(file == "ASCII TEXT");then
echo Windows ASCII
else
echo Something Else 
fi

这是我的输出:

./ fileType.sh:4:./fileType.sh: [file:not found

其他东西

#!/bin/sh

grep -r "Windows ASCII" $1
if test "$( file "$1")" = ' ASCII text, with  CRFL line terminators'; then
echo Windows ASCII
else 
echo Something else
fi

我的输出现在只是其他东西,当我传入的文件应该给出Windows ASCII的输出...

2 个答案:

答案 0 :(得分:2)

您的脚本正在尝试执行名为“[file”的命令。那不是你想要的。没有提供有关此解决方案的可行性的建议,但实现您似乎想要的语法是:

if test "$( file "$1" )" = 'ASCII TEXT'; then

if [ "$( file "$1" )" = 'ASCII TEXT' ]; then 

[是一个命令(无论是内置于shell还是外部都无关紧要),这与命令test完全相同,只是它期望它的最后一个参数为] 。这是一个令人发指的kludge,试图使语法看起来好像括号是shell语言中的标记。 IMO,使用test要好得多,因为它清楚地表明它不是语法的一部分。

答案 1 :(得分:1)

实际实现要求您解释/测试file的结果返回更多。威廉的回答指出了你的方向。您是否需要传统shell编程的解决方案(如 Bourne Shell )或者您是否正在寻找 Bash (或等效项目)有点不清楚)解决方案。上面,我猜这种混淆包围着:

if test "$( file "$1" )" = 'ASCII TEXT'; then

虽然这将确认您的文件是带有lf分隔符的文本,不包括所有其他分隔符,但它不会让您知道该文件是否包含CRLF行结尾的行或不(只是它不是'ASCII TEXT')。要唯一确定文件是否包含CRLF行结尾,您需要测试file输出以查找CRLF

无论shell如何,方法都是一样的。捕获file命令的结果,并测试结果是否包含CRLF。 shell之间的区别在于你如何完成测试。以下示例提供了一种方法来测试 Bourne Shell ,并在 Bash 中再次进行测试(注意:有很多方法可以完成测试,这只是每种方法都有一种方法:

#!/bin/sh

line=`file -b "$1"`

## Bourne Shell
win=0
for i in $line; do                                # search for CRLF in $line
    if test `expr match "$i" "CRLF"` -gt 0 ; then
        win=1
        break
    fi
done

if test "$win" -eq 1 ; then 
    printf "Windows ASCII\n"
else
    printf "Something else\n"
fi

## BASH
if [[ "$line" =~ "CRLF" ]]; then                  # use substring operator
    printf "Windows ASCII\n"
else
    printf "Something else\n"
fi

/ CRLF示例:

$ ./Type.sh ../../utl/tst/config.win.ini
Windows ASCII
Windows ASCII

/ LF的示例:

$ ./Type.sh ../../utl/tst/config.ini
Something else
Something else