这是我的情景。 我有两个文件有记录,每个记录的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
请提前帮助我
答案 0 :(得分:1)
我认为你需要的是:
if [ "$d" != NULL ];
尝试。
答案 1 :(得分:1)
除非您正在编写可移植到原始Bourne shell的脚本或其他不支持该功能的脚本,否则请在Bash和ksh you should use the [[
form of test中查找字符串和文件。
减少了引用和转义的需求,模式和正则表达式匹配等附加条件以及使用&&
和||
代替-a
和{{1}的能力}。
-o
此外,“NULL”在Bash和ksh中不是特殊值,因此您的测试将始终成功,因为if [[ $var == $var1 ]]
针对文字字符串“NULL”进行了测试。
$d
或
if [[ $d != "" ]]
对于数值(除非您使用八进制,否则不包括前导零),您可以使用数字表达式。您可以在此上下文中省略变量的美元符号。
if [[ $d ]]
没有必要将numval=41
if ((++numval >= 42)) # increment then test
then
echo "don't panic"
fi
和echo
用于子字符串。在Bash和ksh中你可以做到:
cut
注意:var=${line:3:23}
使用范围开头和结尾的字符位置,而此shell结构使用起始位置和字符数,因此您必须相应地调整数字。
get away from using backticks是个好主意。请改用cut
。这可以嵌套,引用和转义可以减少或更容易。
答案 2 :(得分:0)
我认为你可以使用DIFF命令
diff file1 file2 > whats_the_diff.txt