Shell脚本学习之路---算术运算&数值比较&字符串比较

7 篇文章 0 订阅
6 篇文章 0 订阅

31.read:从键盘读取输入

$read variable
$echo $variable
$read -p "Enter value: " value #-p:代表prompt,显示提示语。

如果未在read命令后面指定变量,那么会将输入值存储到默认的变量REPLY中

#!/bin/bash
echo "where do you stay ?"
read
echo "you stay in $REPLY"

read后面也可以跟多个变量,那么键盘输入的也会按照空格进行分开,并依次填入到各个变量中去。

#!/bin/bash
echo "What is your name?"
read fname mname lname
echo "Your first name is : $fname"
echo "Your middle name is : $mname"
echo "Your last name is : $lname"

read也可以将内容存到一个数组中:

read -a cities
echo "Name of city is ${cities[2]}"

如果希望用户按enter键,可以用read命令后面跟一个无用的变量。

echo "please press enter to proceed further"
read temp
echo "now backup operation wil be started!"

32.here操作符。

语法格式:
将2个here之间的内容作为命令cat的输入。here可以替换为任意的分界符,cat也可以替换为其他命令。

$cat << here
sss
fff
here

例子:
执行一个压缩备份操作,并将操作结果发送到指定邮箱。

 1 tar -cvf /Users/liudong/tmp.gz  /Users/liudong/tmp  2>/dev/null
  2 [ $? -eq 0 ] && status="Success" || status="Failed"
  3 #send email to administrator
  4 mail -s 'Backip status' 735106520@qq.com <<end_of_msg
  5 The backup job finished.
  6 End date: $(date)
  7 Status:$status
  8 end_of_msg

文本文件字符串替换功能:
将flowers.txt中的Rose替换为Lily。ed为一个系统内的一个文本编辑器。

  1 cat flowers.txt
  2 ed flowers.txt << quit
  3 ,s/Rose/Lily/g
  4 w
  5 q
  6 quit
  7 cat flowers.txt

如何在here操作中使用字面量的方式显示一些系统变量,如USER PATH NAME

  1 filename="test1"
  2 cat << 'Quoted_End_Marker'
  3 When we add quotes before and after here document marker,we can     include variables Such as $USER, $PATH, $name and similar
  4 Quoted_End_Marker

here结合<<<使用:

wc -w <<< 'Good Morning and have a nice day !' #别忘了这个单引号

33.wc:统计并显示文本文件的行数 单词数 字符数

34.文件操作符相关。

将文件与文件描述符进行绑定:
write描述符:

  1 exec 3> sample_out.txt #将sample_out.txt作为输出文件,并将文件描述符3分配给该文件。
  2 echo "This is a test message for sample_out.file file" >&3 #写内容到文件描述符3中
  3 date >&3 # 将命令的输出写入到文件中
  4 exec 3<&- #关闭与文件描述符相关联的文件。

read描述符:

exec 3< sample_out.txt
cat <&3
exec 3<&-

同时作为write read描述符:

  1 file_name="sample_out.txt"
  2 exec 3<> $file_name
  3 echo """
  4  Do not dwell in the past,
  5  do not dream of the future,
  6  concentrate the mind on thre presetn moment. - Buddha
  7 """ >&3
  8 exec 3>&-

读取本机信息的例子:

  1 cp /etc/hosts hosts2
  2 grep -v '^#' hosts2 > hosts3
  3 exec 3< hosts3
  4 exec 4> hostsfinal
  5 read <& 3 address1 name_1 extra_info
  6 read <& 3 address2 name_2 extra_info
  7 echo $name_1 $address1 >& 4
  8 echo $name_2 $address2 >& 4
  9 exec 3<&-
 10 exec 4<&-

read write命令总结:

CommandWhat it does
exec command该命令将取代当前shell环境并执行,不会再返回到当前shell环境了。
exec > data.txt打开data.txt并作为标准输出
exec < data.txt打开data.txt并作为标准输入
exec 3< data.txt打开data.txt作为输入,描述符设置为3
sort <&3对data.txt执行sort操作
exec 4>data.txt打开data.txt作为输出,描述符设置为4
ll>&4命令ll的输出被重定向到data.txt
exec 6<&5建立一个描述符5的拷贝6
exec 4&-关闭文件描述符4(不论是read还是write)

35、调试模式.

通过设置执行参数-n,可以让shell不执行而是只进行语法检查。
设置执行参数-v,可以让shell在执行每条命令前先打印命令内容。

参数值含义
bash -n script_name只解释并分析语法错误,而不执行
bash -v script_name显示脚本中的命令
bash -x script_name显示脚本命令的执行堆栈,类似于函数调用的堆栈
bash -xv script_name同时打开-x -v
bash +xv script_name关闭掉-x -v参数

36.set命令。

设置脚本参数的生效范围。

#-x参数只是在执行这一段代码时生效,参数可以是-f -v -n,含义与上面一致。
set -x
section of script
set +x

37、算术运算相关。

任何时候,我们在脚本里面声明一个变量,默认情况下,shell都是把该变量当做一个字符串。

declare -i value #声明一个整型变量
运算符语法格式:
$ value=4 + 4 # error
$ value=4+4#yes
$ value="4 + 4" #yes
$ value=4.5# error,不能将浮点数赋值给整数。

38.let:算术命令。

使用let命令,就不需要单独声明某个变量为整型了。

  1 value=6
  2 let value=value+1
  3 echo $value
  4
  5 let "value=value+4"
  6 echo $value
  7
  8 let "value+=1"
  9 echo $value

39.expr:也是用来执行算术命令的。

expr 40 + 2 #42
expr 40+2# 40+2 如果想expr作用于算术运算,那么后面的表达式中的数字与运算符之间要留空格。
expr 40 / 10 # 4
expr 40 * 2 #error *要通过转义才被识别为乘号
expr 40 \* 2 # 80

例子:

  1 x=5
  2 y=2
  3 z=`expr $x + $y`
  4 echo $z

40、算术运算表达式。

两种格式都行:
$(( expression ))
[ e x p r e s s i o n ] 和 e x p r 表 达 式 的 明 显 区 别 就 是 不 用 在 变 量 前 面 加 [ expression ] 和expr表达式的明显区别就是不用在变量前面加 [expression]expr符号。

  1 x=5
  2 y=2
  3 z=$(( x + y ))
  4 echo $z
  1 x=5
  2 y=2
  3 z=$[ x + y ]
  4 echo $z

稍微复杂点的表达式:如何计算计算a的b次方

a=5
b=3
c=$[ $a ** $b ] # 这个就表示a的b次方
echo $c

其他例子:

B=10
A=$[ B + 10]
echo $A
echo $[ 3 + 4 -5 ]

算术运算的优先级控制

echo $[(3 + 4) * 5]

涉及到交互运算的脚本:

  1 echo "enter first value"
  2 read number_1
  3 echo "enter second value"
  4 read number_2
  5 total=`expr $number_1 + $number_2`
  6 echo $total
  7 sum=$((number_1 + number_2))
  8 echo "sum is $sum"
  9 echo "sum is $[ number_1 + number_2]"

判断一个输入数字是奇数还是偶数。

echo "Please enter a value"
read x
#三种运算书写方式。
y=`expr $x%2`
#y=$[ x%2 ]
#y=$((x%2))
if test $y -eq 0
then
echo "Entered number is even"
else
echo "Entered number is odd"
fi

41.数字的不同进制表示。

variable=base#number-in-that-base
#十进制21的不同表示方法
x=2#10101
x=8#25
x=16#15

42.浮点数运算。

在bashshell中,只能进行整数运算,如果要进行浮点数运算,就需要借助其他工具,如awk,bc

$ echo "scale=2;15/2" | bc
output:7.50 # scale代表设置的精度,既小数点后的位数

$bc #输入bc,会在当前shell中进入bc的命令行状态。
((83.12+32.13)*37.3)

43.$?

用来获取上一条shell命令的执行结果。也包括操作是否成功或者逻辑结果是否为true.

$ x=10;y=20;((x>y));echo $?
output:1

44.test

判断name的值是否为Ganesh
$ test $name = Ganesh
$ echo $?

也可以替换为[[]]

$ [[ $name = Ganesh]]
$ echo $?

$ [[ $name = [Gg]???? ]] #通配符匹配
$ echo $?

45.&& ||短路逻辑运算符

$ [[ $name == Ganesh && $friend == "John"]]
$ [ $name == Ganesh ] && [ $friend == "John"]

46.字符串比较的关键字

Test operatorTest true if
-n string字符串长度是否不为0.
-z string字符串长度是否为0
string1 != string2两个字符串是否不相等
string1 == string2 或者 string1 = string2两个字符串是否相等
string1 > string2 或者 string1 < string2比较字符串的大小

注意:= != 与字符串之间的空格不能省略。

47.数值的比较。

i1:integer_1
i2:integer_2

Test operatorTest true if
[ i1 -eq i2 ]i1与i2相等
[ i1 -ne i2 ]i1与i2不相等
[ i1 -gt i2 ]i1大于i2
[ i1 -ge i2 ]i1大于或等于i2
[ i1 -lt i2 ]i1小于i2
[ i1 -le i2 ]i1小于等于i2
[[ i1 > i2 ]]i1小于i2
[[ i1 != i2 ]]i1与i2不相等
[[ i1 == i2 ]]i1与i2相等
[[ i1 && i2 ]]逻辑与
[[ i1 || i2 ]]逻辑或
test i1 -eq i2使用test关键字

备注:[] [[]]可以使用test关键字替代

48.文件 目录相关命令。

Test operatorTests true if
-b file_name是否为块文件
-c file_name是否为字符文件
-d file_name目录是否存在
-e file_name文件是否存在
-f file_name文件为普通文件,非目录
-G file_name文件存在,并且属于组用户
-L file_name文件是否为符号链接
-r file_name文件可读
-s file_name文件大小不为0
-w/x file_name文件可写.可执行

49.文件比较命令。

Test operatorTests true if
[ file_1 -nt file_2]文件1比文件2新
[ file_1 -ot file_2]文件1比文件2旧
[ file_1 -ef file_2]文件1和文件2的inode相同

50.字符串逻辑测试。

Test operatortests true if
[ string_1 -a string_2 ]string_1和string_2都是true
[ string_1 -o string_2 ]string_1或者string_2都是true
[ !string_1 ]string_1未match到
[[ pattern_1 && pattern_2 ]]pattern_1和pattern_2都是true
[[ pattern_1 || pattern_2 ]]pattern_1或者pattern_2都是true
[[ !pattern_1 ]]pattern_1未匹配到
字符串通配符匹配
name=Ganesh
[[ $name == [Gg]anesh ]] 
[[ $name == [Gg]anesh && friend == "Lydia" ]]
echo $?

shopt -s extglob
city=Kannur
[[ $city == [Kk]a+(n)ur ]]
echo $?
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值