![shell脚本中比较时忽略特殊字符](https://linux22.com/image/107106/shell%E8%84%9A%E6%9C%AC%E4%B8%AD%E6%AF%94%E8%BE%83%E6%97%B6%E5%BF%BD%E7%95%A5%E7%89%B9%E6%AE%8A%E5%AD%97%E7%AC%A6.png)
在我的脚本中,我正在比较临时变量,如果它为空,我想更新临时变量。但下面的脚本不起作用。
脚本:
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
和来选择一行:tail
sed
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')