2015—01—27 Shell学习笔记 《变量相关》(2)

续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            ||            或,两端有一个为真则真
    !            !            非,相反则为真

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值