这是我的情况。 我有两个文件有logging,每个logging的3-25个字符是一个标识符。 基于这个,我需要比较它们两个,如果它们的标识符匹配,用新的文件数据更新旧文件。 标识符以01开头。请看下面的脚本。 这是一个错误,因为“我不能理解的第12行的预期。
#!/bin/ksh while read line do c=`echo $line|grep '^01' ` if [ $c -ne NULL ]; then var=`echo $line|cut -c 3-25` fi while read i do d=`echo $i|grep '^01' ` if [ $d -ne NULL ]; then var1=`echo $i|cut -c 3-25` if [ $var -eq $var1 ]; then $line=$i fi fi done < test_monday done < test_sunday
请提前帮助我
我认为你需要的是:
if [ "$d" != NULL ];
尝试。
除非你正在编写一个脚本来移植到原来的Bourne shell或其他不支持该功能的脚本,否则在Bash和ksh中你应该使用[[
字符串和文件的测试形式 。
对引用和转义的需求减少,模式和正则表达式匹配等附加条件以及使用&&
和||
的能力 而不是-a
和-o
。
if [[ $var == $var1 ]]
而且,“NULL”在Bash和ksh中不是特殊的值,所以你的测试总是会成功的,因为$d
是针对字符串“NULL”进行测试的。
if [[ $d != "" ]]
要么
if [[ $d ]]
对于数值(不包括前导零,除非使用八进制),您可以使用数字表达式。 您可以在此上下文中省略变量的美元符号。
numval=41 if ((++numval >= 42)) # increment then test then echo "don't panic" fi
没有必要为子串使用echo
和cut
。 在Bash和ksh中你可以这样做:
var=${line:3:23}
注意: cut
使用字符位置作为范围的开始和结束,而这个shell构造使用起始位置和字符计数,所以你必须相应地调整数字。
避免使用反引号是一个好主意。 用$()
代替。 这可以嵌套,引用和转义减少或更容易。
我想你可以使用DIFF命令
diff file1 file2 > whats_the_diff.txt