使用shell脚本确定文件类型

时间:2014-12-13 19:44:11

标签: shell sh

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

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

组成的单行
Windows ASCII

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

Something else

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

例如:

% ./fileType.sh ~cs252/Assignments/ftpAsst/d3.dat
Windows ASCII
% ./fileType.sh /bin/cat
Something else
% ./fileType.sh fileType.sh
Something else
% ./fileType.sh /usr/share/dict/words
Something else
%

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

如果file命令的输出包含短语“ASCII text”和短语“CRLF”,则该文件为Windows ASCII文本。

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

这就是我在剧本中的内容。

#!/bin/sh
line='file -b "$1"`

win=o
for i in $line; do
    if test `expr match "$1" "CRFL" | expr match "$1" "ASCII"` -gt 0 ; then
            win =1
            break
    fi
done

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

我正在使用tcsh,基本上我正在尝试同时搜索两个变量。在C ++中,我会使用“&&”运营商。我不知道unix是否有这样的操作员,所以我试图将它们“管”起来......没有运气。

当我得到“Windows ASCII”

时,我得到了“别的东西”

1 个答案:

答案 0 :(得分:1)

您的脚本中有一些奇怪的引用和拼写错误。这是一个固定版本。

#!/bin/sh
line=`file -b "$1"`  # backticks fixed

win=o
for i in $line; do  # fixed CRLF pro CRFL; fix bogus expr | expr
    if test `expr match "$1" "CRLF"` -gt 0 || test `expr match "$1" "ASCII"` -gt 0 ; then
            win=1   # cannot have space before equals sign
            break
    fi
done

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

立即改进是避免expr,并使用现代语法进行流程替换 - $(file ...)而不是`file ...`,并将多个条件转换为单个{ {1}}陈述。这也避免了case中令牌的循环,这似乎相当单一和浪费。

line