遇到这个问题的麻烦,我可以使用一些帮助......
创建一个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”
时,我得到了“别的东西”答案 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