遇到这个问题的麻烦,我可以使用一些帮助......
创建一个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的输出...
答案 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