续1-26 3).
bc用法:
特点:支持小数计算
i=2
i=`echo $i + 1|bc` ------效率低
##bc支持科学计算,所以这种方法非常强大
echo 5.4 + 5|bc (可以加空格)
通过表达式计算:
seq -s "+" 10|bc (计算1加到10)
echo "scale=2;5.23 * 3.13"|bc (保留两位小数)
echo "obase=2;8"|bc (8换成2进制)
shell变量的输入
read [参数] [变量名]
-p:设置提示信息
-t:设置输入等待的时间,单位默认为秒
read -p "pls input a number:" var
read -t 3 -p "pls input a number:" var
read -t 10 -p "pls input two number:" a1 a2 (a1前面有空格)
eg1:
原是脚本cat test.sh
#!/bin/sh
a=6 (赋值语句左右不能有空格,有空格时报错)
b=2 (赋值语句左右不能有空格,有空格时报错)
echo "a-b = $(($a-$b))"
echo "a+b = $(($a+$b))"
echo "a*b = $(($a*$b))"
echo "a/b = $(($a/$b))"
echo "a**b = $(($a**$b))"
echo "a%b = $(($a%$b))"
改成read读入:
cat test_read.sh
#!/bin/sh
法1.read -t 10 -p "pls input two number:" a b
法2.echo -n "pls input two number:" (-n 不换行)
read a b
echo "a-b = $(($a-$b))"
echo "a+b = $(($a+$b))"
echo "a*b = $(($a*$b))"
echo "a/b = $(($a/$b))"
echo "a**b = $(($a**$b))"
echo "a%b = $(($a%$b))"
sh test_read.sh
如果读入的不是整数,或者参数个数不是2个,以上shell脚本的执行会有什么结果?如何解决这两个问题?
Shell中判断整数的方法:
1.
cat test_read.sh ((read读入))
#!/bin/sh
while true
do
read -t 10 -p "pls input two number:" a b
expr $a + 0 >&/dev/null (#expr $a + 0 >/dev/null 2>&1 效果相同)
[ $? -ne 0 ] && continue
expr $b + 0 >&/dev/null
[ $? -ne 0 ] && continue||break
done
echo "a-b = $(($a-$b))"
echo "a+b = $(($a+$b))"
echo "a*b = $(($a*$b))"
echo "a/b = $(($a/$b))"
echo "a**b = $(($a**$b))"
echo "a%b = $(($a%$b))"
continue:终止当前循环,进行下一个循环。(仅仅跳出当前循环)
break:跳出这个循环,进行循环外面的内容.(break命令允许跳出所有循环(终止执行后面的所有循环)。)
cat argv_01.sh (命令行传参)
#!/bin/sh
a="$1"
b="$2"
Usage(){
echo "Usage:sh $0 num1 num2"
exit 1
}
if [ $# -ne 2 ];then
Usage
fi
expr $a + 0 >&/dev/null (#expr $a + 0 >/dev/null 2>&1 效果相同)
[ $? -ne 0 ] && Usage
expr $b + 0 >&/dev/null
[ $? -ne 0 ] && Usage
echo "a-b = $(($a-$b))"
echo "a+b = $(($a+$b))"
echo "a*b = $(($a*$b))"
echo "a/b = $(($a/$b))"
echo "a**b = $(($a**$b))"
echo "a%b = $(($a%$b))"
输入错误时:提示使用方法,但是退出、、、可以改进、、、
条件测试
1.测试语句
语法说明:
格式1:test <测试语句>
格式2:[ <测试语句> ]
格式3:[[ <测试语句> ]]
说明:
格式1,和格式2是等价的。
格式3为扩展的test命令
test -f file && echo 1||echo 0
touch file
test -f file && echo 1||echo 0
test ! -f file && echo 1||echo 0 (支持非)
[ -f file ] && echo 1||echo 0
[ -f file ] && cat file
[ ! -f file ] && cat file 报错
[[ -f file ]] && cat file
Pro:
在[[]]中可以使用通配符进行模式匹配。&&、||、>、<、等操作符可以应用于[[]]中,但是不能应用[]中。
对整数进行关系运算,也可以使用Shell的算术运算符(())。
2.文件测试操作符
-f -d -s -e -r -w
a -nt b (a newer than b)
a -ot b (a older than b)
3.字符串测试操作符
作用:比较两个字符串是否相同、字符串长度是否为零,字符串是否为NULL(bash区分零长度字符串和空字符串)等。
“=”比较两个字符串是否相等,与“==”等价
[ "${a}"="${b}" ]
常用字符串测试操作符
-z 串长度为0为真,(zero)
-nz 串长度不为0为真
"串1" = "串2" 等价于 "串1" == "串2"
"串1" != "串2"
以上表格中的字符串测试操作符号务必用""引起来。
Pro: [ -n "$myvar" ]
4.整数二元比较操作符:
在[]中使用 在(())和[[]]中使用
-eq ==
-ne !=
-gt >
-ge >=
-lt <
-le <=
Pro: "<" 小于,if[[ "$a"<"$b" ]],if [ "$a"\<"$b" ]。在[]中需要转义,因为shell也用<和>重定向。
= != 在单[] 不需要转义
[ 2 \> 1 ] && echo 1||echo 0 [ 2 -gt 1 ] && echo 1||echo 0
[ 2 \< 1 ] && echo 1||echo 0 [ 2 -lt 1 ] && echo 1||echo 0
5.逻辑操作符
在[]中使用的逻辑操作符 在[[]]中使用的逻辑操作符
-a && 与,两端都为真,则真
-o || 或,两端有一个为真则真
! ! 非,相反则为真
bc用法:
特点:支持小数计算
i=2
i=`echo $i + 1|bc` ------效率低
##bc支持科学计算,所以这种方法非常强大
echo 5.4 + 5|bc (可以加空格)
通过表达式计算:
seq -s "+" 10|bc (计算1加到10)
echo "scale=2;5.23 * 3.13"|bc (保留两位小数)
echo "obase=2;8"|bc (8换成2进制)
shell变量的输入
read [参数] [变量名]
-p:设置提示信息
-t:设置输入等待的时间,单位默认为秒
read -p "pls input a number:" var
read -t 3 -p "pls input a number:" var
read -t 10 -p "pls input two number:" a1 a2 (a1前面有空格)
eg1:
原是脚本cat test.sh
#!/bin/sh
a=6 (赋值语句左右不能有空格,有空格时报错)
b=2 (赋值语句左右不能有空格,有空格时报错)
echo "a-b = $(($a-$b))"
echo "a+b = $(($a+$b))"
echo "a*b = $(($a*$b))"
echo "a/b = $(($a/$b))"
echo "a**b = $(($a**$b))"
echo "a%b = $(($a%$b))"
改成read读入:
cat test_read.sh
#!/bin/sh
法1.read -t 10 -p "pls input two number:" a b
法2.echo -n "pls input two number:" (-n 不换行)
read a b
echo "a-b = $(($a-$b))"
echo "a+b = $(($a+$b))"
echo "a*b = $(($a*$b))"
echo "a/b = $(($a/$b))"
echo "a**b = $(($a**$b))"
echo "a%b = $(($a%$b))"
sh test_read.sh
如果读入的不是整数,或者参数个数不是2个,以上shell脚本的执行会有什么结果?如何解决这两个问题?
Shell中判断整数的方法:
1.
cat test_read.sh ((read读入))
#!/bin/sh
while true
do
read -t 10 -p "pls input two number:" a b
expr $a + 0 >&/dev/null (#expr $a + 0 >/dev/null 2>&1 效果相同)
[ $? -ne 0 ] && continue
expr $b + 0 >&/dev/null
[ $? -ne 0 ] && continue||break
done
echo "a-b = $(($a-$b))"
echo "a+b = $(($a+$b))"
echo "a*b = $(($a*$b))"
echo "a/b = $(($a/$b))"
echo "a**b = $(($a**$b))"
echo "a%b = $(($a%$b))"
continue:终止当前循环,进行下一个循环。(仅仅跳出当前循环)
break:跳出这个循环,进行循环外面的内容.(break命令允许跳出所有循环(终止执行后面的所有循环)。)
cat argv_01.sh (命令行传参)
#!/bin/sh
a="$1"
b="$2"
Usage(){
echo "Usage:sh $0 num1 num2"
exit 1
}
if [ $# -ne 2 ];then
Usage
fi
expr $a + 0 >&/dev/null (#expr $a + 0 >/dev/null 2>&1 效果相同)
[ $? -ne 0 ] && Usage
expr $b + 0 >&/dev/null
[ $? -ne 0 ] && Usage
echo "a-b = $(($a-$b))"
echo "a+b = $(($a+$b))"
echo "a*b = $(($a*$b))"
echo "a/b = $(($a/$b))"
echo "a**b = $(($a**$b))"
echo "a%b = $(($a%$b))"
输入错误时:提示使用方法,但是退出、、、可以改进、、、
条件测试
1.测试语句
语法说明:
格式1:test <测试语句>
格式2:[ <测试语句> ]
格式3:[[ <测试语句> ]]
说明:
格式1,和格式2是等价的。
格式3为扩展的test命令
test -f file && echo 1||echo 0
touch file
test -f file && echo 1||echo 0
test ! -f file && echo 1||echo 0 (支持非)
[ -f file ] && echo 1||echo 0
[ -f file ] && cat file
[ ! -f file ] && cat file 报错
[[ -f file ]] && cat file
Pro:
在[[]]中可以使用通配符进行模式匹配。&&、||、>、<、等操作符可以应用于[[]]中,但是不能应用[]中。
对整数进行关系运算,也可以使用Shell的算术运算符(())。
2.文件测试操作符
-f -d -s -e -r -w
a -nt b (a newer than b)
a -ot b (a older than b)
3.字符串测试操作符
作用:比较两个字符串是否相同、字符串长度是否为零,字符串是否为NULL(bash区分零长度字符串和空字符串)等。
“=”比较两个字符串是否相等,与“==”等价
[ "${a}"="${b}" ]
常用字符串测试操作符
-z 串长度为0为真,(zero)
-nz 串长度不为0为真
"串1" = "串2" 等价于 "串1" == "串2"
"串1" != "串2"
以上表格中的字符串测试操作符号务必用""引起来。
Pro: [ -n "$myvar" ]
4.整数二元比较操作符:
在[]中使用 在(())和[[]]中使用
-eq ==
-ne !=
-gt >
-ge >=
-lt <
-le <=
Pro: "<" 小于,if[[ "$a"<"$b" ]],if [ "$a"\<"$b" ]。在[]中需要转义,因为shell也用<和>重定向。
= != 在单[] 不需要转义
[ 2 \> 1 ] && echo 1||echo 0 [ 2 -gt 1 ] && echo 1||echo 0
[ 2 \< 1 ] && echo 1||echo 0 [ 2 -lt 1 ] && echo 1||echo 0
5.逻辑操作符
在[]中使用的逻辑操作符 在[[]]中使用的逻辑操作符
-a && 与,两端都为真,则真
-o || 或,两端有一个为真则真
! ! 非,相反则为真