使用shell脚本确定文件类型

使用shell脚本确定文件类型,shell,sh,Shell,Sh,遇到这个问题时,我需要一些帮助 创建一个shell脚本fileType.sh,它接受一个命令行参数,即文件路径(可能是相对的或绝对的)。脚本应该检查该文件并打印一行,其中包含短语 Windows ASCII 如果文件是带有CR/LF行终止符的ASCII文本文件,或 Something else 如果文件是二进制文件或带有“Unix”LF行终止符的ASCII文件 例如: % ./fileType.sh ~cs252/Assignments/ftpAsst/d3.dat Windows ASCI

遇到这个问题时,我需要一些帮助

创建一个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文本”和短语“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”时,我得到了“其他东西”

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

#!/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…`
,以及将多个条件折叠成一个
case
语句。这也避免了
中的标记上的循环,这似乎是非常单调和浪费的

#!/bin/sh
case $(file -b "$1") in
    # I guess the message has ASCII before CRLF always, but cover all bases
    *CRLF*ASCII* | *ASCII*CRLF*)
        echo "Windows ASCII" ;;
    *)
        echo "Something else" ;;
esac

奇怪地类似于但肯定是一个更好的问题。请注意,您的脚本是Bourne shell样式的脚本,而不是
tcsh
脚本,因此您的标记不准确,因为问题不是您从中运行命令的shell,而是运行此脚本的shell。在
if
中使用
|
是可疑的<代码>测试不会在标准输出上生成输出,
expr
不会从标准输入中读取任何内容。您可能想到了
|
操作符。在测试中使用
$1
而不是
$i
也可能是一个错误。考虑使用 Case运算符。<代码> <代码>是命令替换的一部分,它为<代码>测试< /代码>提供参数(如果OP不使用反向引号而不是<代码> $(…)<代码> >,这将更容易看到。这两种解决方案看起来都有效,但当我提交时,自动检查程序说它无法读取.cpp文件。。。运行时失败:./fileType.sh“aardavark.cpp”如果无法访问此测试文件,则很难判断是什么原因导致此问题。你有其他的信息吗?