Linux笔记10——shell编程基础-4

补充

  • $#------取参数个数
  • "$n",有值取值,无值取空字符,一般都会加引号,在某些情况下避免报语法错误

一、read接收键盘输入

复制代码
[root@localhost ~]# cat demo.sh 
#!/bin/bash
echo -n "请输入你的姓名:"
read name

echo "你的名字是:"$name
[root@localhost ~]# bash demo.sh 
请输入你的姓名:zhangsan
你的名字是:zhangsan
[root@localhost ~]# 

语法:read [选项] [变量名]

  • -p:提示信息,在read等待时输入的信息
  • -t:秒数,read等待的秒数
  • -s:隐藏输入信息
  • -n:字符数,read最多能接收的字符数(达标即执行)

实验一:测试各选项的用法

复制代码
#!/bin/bash
#-p:提示信息
read -p "请输入你的姓名:" name
#-s:隐藏年龄
read -p "请输入你的年龄:" -s age
#-t:输入时间只有10秒
read -p "请输入你的性别:" -t 10 sex
#-n:电话号码最多只能输十一位
read -p "请输入你的电话号码:" -n 11 number

echo "输入你的信息:"$name $age $sex $number

实验二:可以同时接收多个参数,分别放在多个变量里

复制代码
[root@localhost ~]# cat test2.sh 
#!/bin/bash
read -p "请输入你的姓名、性别、年龄、电话号码:" name sex age number
echo "输入你的信息:"$name $age $sex $number
[root@localhost ~]# bash test2.sh
请输入你的姓名、性别、年龄、电话号码:zhangsna man 32 123456789
输入你的信息:zhangsna 32 man 123456789
[root@localhost ~]# 

实验三:尝试修改接收参数个数,再看运行效果(某些特殊选项会出现不自动换行的bug,所以这里用echo来换行)

复制代码
[root@localhost ~]# cat test2.sh 
#!/bin/bash
echo "请输入你的姓名、性别、年龄、电话号码:"
read name sex age number
echo "输入你的信息:"$name $age $sex $number
[root@localhost ~]# bash test2.sh
请输入你的姓名、性别、年龄、电话号码:
zhangsan man 32 123456 你好吗?我是谁?
输入你的信息:zhangsan 32 man 123456 你好吗?我是谁?
[root@localhost ~]# 

结论

  • 如果只提供了一个变量名,则整个输入全部赋予该变量
  • 如果提供了一个以上的变量名,则输入行分为若干字,一个接一个地赋予各个变量,而命令行上的最后一个变量取得剩余的所有值

二、shell常用运算符

1.声明指定类型的变量

注:数值运算需要使用declare声明变量类型

类型分类

  • 整数型
  • 数组型
  • 环境变量
  • 只读变量

实验一:查看变量类型

复制代码
[root@localhost ~]# name=lisi
[root@localhost ~]# declare -p name
declare -- name="lisi"

实验二:整数型(shell中变量默认类型是字符串,两个字符串相加的效果是字符拼接)

复制代码
[root@localhost ~]# n1=10
[root@localhost ~]# n2=20
[root@localhost ~]# n=$n1+$n2
[root@localhost ~]# echo $n
10+20

#整型
[root@localhost ~]# declare -i a=100 b=200
[root@localhost ~]# declare -i num=$a+$b
[root@localhost ~]# echo $num
300

注:变量类型------字符串(--)、数值(-i)、数组(-a)

2.命令:declare [+-][选项] [变量]

  • -:给变量设置类型
  • +:取消变量类型
  • -i:将变量声明成整数型
  • -a:将变量声明成数组型
  • -x:将变量声明成环境变量
  • -r:将变量声明成只读
  • -p:显示指定变量的类型和内容

注:若使用echo输出数值运算,则输出结果只会是字符串拼接,不是数值运算的结果

复制代码
#变量n是字符
[root@localhost ~]# declare -i n1=10
[root@localhost ~]# declare -i n2=20
[root@localhost ~]# n=$n1+$n2
[root@localhost ~]# echo $n
10+20
#变量n是整型
[root@localhost ~]# declare -i n
[root@localhost ~]# n=$n1+$n2
[root@localhost ~]# echo $n
30
#变量n是整型,n3和n4都是字符串
[root@localhost ~]# n3=10
[root@localhost ~]# n4=20
[root@localhost ~]# n=$n3+$n4
[root@localhost ~]# echo $n
30

即:

  • 字符串=数值+数值------字符串的拼接
  • 数值=数值+数值------数值的运算
  • 数值=字符串+字符串------数值的运算

结论:变量名的类型要更加重要一些

三、数值的运算

方法一:定义一个数值类型的变量作为结果

复制代码
#定义n为整型,计算n1+n2的值
[root@localhost ~]# declare -i n
[root@localhost ~]# n=$n1+$n2
[root@localhost ~]# echo $n
30

方法二:使用expr进行数值运算

复制代码
[root@localhost ~]# x=100
[root@localhost ~]# y=200
[root@localhost ~]# expr $x + $y
300
[root@localhost ~]# expr $x * $y
expr: 语法错误:未预期的参数 "anaconda-ks.cfg"
[root@localhost ~]# expr $x \* $y
20000
[root@localhost ~]# 

注:运算符左右两端得有空格;乘号需要使用转义符取消特殊含义

方法三:使用let进行数值计算

  • 运算符左右不需要空格,但需要声明一个新变量用于接收计算结果

  • let还能进行自增减,或指定增加量或减少量

    [root@localhost ~]# let he=x+y
    [root@localhost ~]# echo he 300 [root@localhost ~]# n=10 [root@localhost ~]# let n++ [root@localhost ~]# echo n
    11
    [root@localhost ~]# let n=n+1 [root@localhost ~]# echo n
    12
    [root@localhost ~]# let n+=5
    [root@localhost ~]# echo $n
    17
    [root@localhost ~]#

方法四:使用(())或[]进行数值运算

复制代码
[root@localhost ~]# unset x;unset y
[root@localhost ~]# x=100
[root@localhost ~]# y=200
[root@localhost ~]# echo $(($x+$y))
300
[root@localhost ~]# echo $[$x+$y]
300

补充

复制代码
#测试运算符的顺序
[root@localhost ~]# echo $((16/5))
3
[root@localhost ~]# echo $((-16/5))
-3
[root@localhost ~]# echo $((-16/-5))
3
[root@localhost ~]# echo $((16/-5))
-3
#a%b,取余结果的符号和a一致
[root@localhost ~]# echo $((16%5))
1
[root@localhost ~]# echo $((-16%5))
-1
[root@localhost ~]# echo $((-16%-5))
-1
#对一个数n取余,余数是有范围的,即[0-(n-1)]
------------
#指定范围的随机数,默认范围是[0,32767]
$ echo $RANDOM
#在0~10之间产生一个随机数
$ echo $(($RANDOM%11))
#在1~100之间产生一个随机数
$ echo $(($RANDOM%100+1))
#表格中的优先级是乘除优先于加减,但是若加减被()调用,则括号内的优先级高于乘除
[root@localhost ~]# n1=$(((11+22)*33/44))
[root@localhost ~]# echo $n1
24
#逻辑与(一般单独使用)
[root@localhost ~]# echo $((0&&0))
0
[root@localhost ~]# echo $((0&&1))
0
[root@localhost ~]# echo $((1&&0))
0
[root@localhost ~]# echo $((1&&1))
1
-----------
#shell中处理的数值都是整数类型,若处理小数用bc
5、Shell的环境变量配置
5-1、登录环境变量的配置文件
[root@localhost ~]# yum -y install bc
[root@localhost ~]# echo "2.5+3.5"|bc
6.0
[root@localhost ~]# echo "2.3*3"|bc
6.9

注:变量名取值;(命令)取命令的值;$(())取运算表达式的值

四、数组

定义:名=(值1 值2 值3....)

复制代码
[root@localhost ~]# name=(zhangsan lisi wangwu)
[root@localhost ~]# echo $name    #默认情况下只能取第一个值
zhangsan
[root@localhost ~]# echo ${name[1]}    #根据下标取值
lisi
--------------
#随机取数值name中的值
[root@localhost ~]# echo ${name[$RANDOM%3]}
zhangsan
或
[root@localhost ~]# echo ${name[$(($RANDOM%3))]}
zhangsan
--------------
[root@localhost ~]# echo ${name[*]}
zhangsan lisi wangwu
[root@localhost ~]# echo ${name[@]}
zhangsan lisi wangwu
--------------
[root@localhost ~]# echo ${#name[@]}    #取 值的个数,即数组的长度
3
[root@localhost ~]# echo ${#name[0]}    #取的是一个值的字符串长度
8
[root@localhost ~]# 
---------------
改:
[root@localhost ~]# name[1]=lisiis
[root@localhost ~]# echo ${name[@]}
zhangsan lisiis wangwu
增:
[root@localhost ~]# name[3]=laoliu
[root@localhost ~]# echo ${name[@]}
zhangsan lisiis wangwu laoliu
删:
[root@localhost ~]# unset name[3]
[root@localhost ~]# echo ${name[@]}
zhangsan lisiis wangwu
[root@localhost ~]# unset name
[root@localhost ~]# echo ${name[@]}

[root@localhost ~]# 

五、知识点补充

字符串判断

|--------------|--------------------|
| 测试选项 | 作用 |
| -z 字符串 | 判断字符串是否为空(为空返回真) |
| -n 字符串 | 判断字符串是否为非空(非空返回真) |
| 字符串1 == 字符串2 | 判断字符串是否相等(相等返回真) |
| 字符串1 != 字符串2 | 判断字符串是否不相等(不相等返回真) |

练习1:写一个脚本,计算1到100的值

复制代码
[root@localhost ~]# cat he.sh 
#!/bin/bash
n=0
for i in {1..100}
do
	n=`expr $n + $i`
done
echo $n

n1=0
for i in {1..100}
do
	let n1+=$i
done
echo $n1

n2=0
for i in {1..100}
do
	n2=$((n2+=$i))
done
echo $n2
[root@localhost ~]# bash he.sh 
5050
5050
5050
[root@localhost ~]# 

练习2:写一个脚本,给脚本传输一个值,计算从1到这个值的和

复制代码
[root@localhost ~]# cat demo1.sh 
#!/bin/bash

echo -n "input start number:" $1
echo -n "input end number:" $2
let n=$2-$1+1
echo "count:"$(($n*($1+$2)/2))
[root@localhost ~]# bash demo1.sh 1 5
input start number: 1input end number: 5count:15
[root@localhost ~]# 
相关推荐
Wy_编程17 分钟前
VS中创建Linux项目
linux
luck_lin27 分钟前
linux添加新硬盘挂载分区和数据迁移
linux·运维·分区扩容
四时久成1 小时前
服务器认证系统
运维·服务器
iFulling1 小时前
【云原生】CentOS安装Kubernetes+Jenkins
linux·云原生·kubernetes·centos·jenkins
徐子元竟然被占了!!1 小时前
Windows Server 2019 DateCenter搭建 FTP 服务器
运维·服务器·windows
-L71 小时前
进入docker中mysql容器的方法
运维·mysql·docker·容器
HAORChain1 小时前
Hyperledger Fabric官方中文教程-改进笔记(十七)-编写第一个链码
笔记·区块链·fabric
wayuncn2 小时前
影响服务器托管费用的因素
运维·服务器·数据中心·服务器托管·物理服务器租用·服务器机柜·idc机房托管
神齐的小马3 小时前
计算机网络学习笔记
笔记·学习·计算机网络