shell脚本中比较时忽略特殊字符

shell脚本中比较时忽略特殊字符

在我的脚本中,我正在比较临时变量,如果它为空,我想更新临时变量。但下面的脚本不起作用。

脚本:

temp=`head -5 $filename1 | tail -1`
if [ "$temp" == " " ]
then
    temp=`head -6 $filename1 | tail -1`
    echo "Blank - Updated temp value"
else
    echo "$temp not blank"
fi

经过故障排除后,我在使用该od命令时发现了这一点。当我检查临时变量时,它有特殊字符,因为它没有考虑它有空白。

echo $temp | od -c
0000000  \r  \n
0000002

您能帮忙解决如何忽略上述特殊字符吗?

答案1

首先要做的事情是:

if [ "$temp" == " " ]

比较运算符实际上是=, not ==。后者可以在某些 shell 中工作,但不是标准的。另外,您不是将变量与空字符串进行比较,而是将变量与包含单个空格的字符串进行比较,该空格可能是也可能不是您的文件所包含的内容。

如果文件可以包含额外的空格,则最好使用sed或删除所有空格tr。然后你可以用它[ -z "$temp" ]来测试它是否为空。所以:

temp=$(head -5 $filename | tail -1 | tr -d ' \t\r')
if [ -z "$temp" ] ; then ...

您可以使用head和来选择一行:tailsed

temp=$(sed -n '5p' | tr -d ' \t\r')
if [ -z "$temp" ] ; then ...

(5p表示“在第 5 行,(p)打印该行”,并-n禁止打印任何行的默认操作。)


实际上,我不想进行测试,而是想用脚本遍历文件awk来获取第五行或第六行,具体取决于第五行是否有任何内容:

temp=$(tr -d ' \t\r' < $filename1 | awk '(NR==5 && $0) || NR==6 {print; exit}' )

(NR==5测试当前行(记录)号,$0扩展到该行的内容,如果该行不为空,则为“true”,&&并且||是通常的或者运营)

答案2

使用sed和删除所有空白字符... temp=$(head -5 $filename1 | tail -1 | sed -r 's/\s+//g')

相关内容