expr: non-numeric argument

今天要做一个计算,脚本如下:

#!/bin/bash
HIT=$(/app/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379 info | grep "keyspace_hits" | awk -F‘:‘ ‘{print $2}‘)
MISS=$(/app/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379 info | grep "keyspace_misses" | awk -F‘:‘ ‘{print $2}‘)
all=`expr $HIT + $MISS`
echo $all

运行报错:expr: non-numeric argument,最后各种测试,单独给HIT和MISS赋值,没报错,就是不知道哪里的原因,查看运行详细模式:

仔细一看,后面有"\r",以为是编码的问题

# cat -v 1.sh 
#!/bin/bash
HIT=$(/app/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379 info | grep "keyspace_hits" | awk -F‘:‘ ‘{print $2}‘)
MISS=$(/app/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379 info | grep "keyspace_misses" | awk -F‘:‘ ‘{print $2}‘)
all=`expr $HIT + $MISS`
echo $all

没发现哪里有问题,算了,还是先转一下吧:

 yum install dos2unix

转格式:

# dos2unix 1.sh 
dos2unix: converting file 1.sh to UNIX format ...

再执行,还是不行:

# sh 1.sh 
expr: non-numeric argument

我想试试删除一下"\r"吧

sed -i ""s/\r//"" 1.sh

执行还是不行:

# sh 1.sh 
expr: non-numeric argument

最后恍然大悟,"\r"是计算结果里带出来的!!!

修改脚本:

# vim 1.sh 
#!/bin/bash
HIT=$(/app/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379 info | grep "keyspace_hits" | awk -F‘:‘ ‘{print $2}‘)
MISS=$(/app/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379 info | grep "keyspace_misses" | awk -F‘:‘ ‘{print $2}‘)
echo $HIT
echo $MISS
HIT1=`echo $HIT | tr -d ‘\r‘`
MISS1=`echo $MISS | tr -d ‘\r‘`
all=`expr $HIT1 + $MISS1`
echo $all

再执行:

真是FUCK了DOG了,竟然这个小问题,浪费了我半个小时,所以要认真!

时间: 2024-10-06 15:21:44

expr: non-numeric argument的相关文章

linux shell基础语法

1.第一个Shell脚本 打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好,如果你用php写shell 脚本,扩展名就用php好了. 输入一些代码: #!/bin/bash echo "Hello World !" "#!" 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell.echo命令用于向窗口输出文本. 运行Shell脚本有两种方法. 1.1作为可执行程序 将上面的代码保存为t

YASM User Manual

This document is the user manual for the Yasm assembler. It is intended as both an introduction and a general-purpose reference for all Yasm users. 1.?Introduction Yasm is a BSD-licensed assembler that is designed from the ground up to allow for mult

[Bash Shell] Shell学习笔记

1. Shell简介 Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的.Shell既是一种命令语言,又是一种程序设计语言.作为命令语言,它交互式地解释和执行用户输入的命令:作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支. 它虽然不是Unix/Linux系统内核的一部分,但它调用了系统核心的大部分功能来执行程序.建立文件并以并行的方式协调各个程序的运行.因此,对于用户来说,s

shell编程(二)

Shell echo命令 echo是Shell的一个内部指令,用于在屏幕上打印出指定的字符串.可以使用echo实现更复杂的输出格式控制. 显示转义字符 echo "\"It is a test\"" 结果是:"It is a test" 显示变量 name="OK" echo "$name It is a test" 结果是:OK It is a test 如果变量与其它字符相连的话,需要使用大括号({ }

shell从入门到放弃(下)

一.了不起的循环之for循环 与其他编程语言类似,Shell支持for循环. for循环一般格式为:for 变量 in 列表 do     command1     command2     ...     commandN done 列表是一组值(数字.字符串等)组成的序列,每个值通过空格分隔.每循环一次,就将列表中的下一个值赋给变量. in 列表是可选的,如果不用它,for 循环使用命令行的位置参数. 例如,顺序输出当前列表中的数字: for loop in 1 2 3 4 5  do   

Unix Shells: Bash, Fish, Ksh, Tcsh, Zsh

Hyperpolyglot grammar | quoting and escaping | charactersvariables | variable expansion | brace, tilde, command, and pathname expansion | special variablesarithmetic and conditional expressionsarrays | associative arraysfunctions | command resolution

Linux Shell脚本教程:30分钟玩转Shell脚本编程(笔记)

资料链接 Shell有两种执行命令的方式: 交互式(Interactive):解释执行用户的命令,用户输入一条命令,Shell就解释执行一条. 批处理(Batch):用户事先写一个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条一条地敲命令. shell脚本有循环和控制语句,为解释执行,不需要编译. 常见的Shell脚本解释器: 有bash.sh.csh.ksh等.我们说的Shell其实是指Shell脚本解释器. bash:Linux默认的shell

Oracle NULL相关函数

一.NVL 官方解释: Purpose NVL lets you replace null (returned as a blank) with a string in the results of a query. If expr1 is null, then NVL returns expr2. Ifexpr1 is not null, then NVL returns expr1. 如果expr1是null,则返回expr2,如果expr1 is not null,则返回expr1. Th

高效查看MySQL帮助文档的方法

在mysql的使用过程中, 可能经常会遇到以下问题: 某个操作语法忘记了, 如何快速查找? 如何快速知道当前版本上某个字段类型的取值范围? 当前版本都支持哪些函数?希望有例子说明.. 当前版本是否支持某个功能? 对于上面列出的问题, 我们可能想到的方法是查找MySQL的文档, 这些问题在官方文档都可以很清楚地查到, 但是却要耗费大量的时间和精力. 所以对于以上问题, 最好的解决办法就是使用MySQL安装后自带的帮助文档, 这样在遇到问题时就可以方便快捷地进行查询. 按层次查看帮助 查看目录 如果

Sed&awk笔记之awk篇

http://blog.csdn.net/a81895898/article/details/8482333 Awk是什么 Awk.sed与grep,俗称Linux下的三剑客,它们之间有很多相似点,但是同样也各有各的特色,相似的地方是它们都可以匹配文本,其中sed和awk还可以用于文本编辑,而grep则不具备这个功用.sed是一种非交互式且面向字符流的编辑器(a "non-interactive" stream-oriented editor),而awk则是一门模式匹配的编程语言,因为