使用shell脚本确定文件类型
遇到这个问题时,我需要一些帮助 创建一个shell脚本fileType.sh,它接受一个命令行参数,即文件路径(可能是相对的或绝对的)。脚本应该检查该文件并打印一行,其中包含短语使用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
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
也可能是一个错误。考虑使用