【shell脚本】--变量知识点总结

目录

什么是变量:

1.变量常见类型

1.自定义变量

2.系统环境变量

3.位置参数变量

4.预先定义变量

 2.变量赋值方式

1.显式赋值(变量名=变量值)

2.read从键盘读入变量值

3.注意事项: 定义或引⽤变量时注意事项: " " 弱引⽤ ' ' 强引⽤

 4.``命令替换等价于 $() 反引号中的 shell 命令会被先执⾏(在上个示例中我们已经使用``)

3.变量数值运算

1.整数运算expr + - \* / %

2.整数运算$(()) + - * / %

3.整数运算$[] + - * / %

4.整数运算 let + - * / %

5.小数运算bc  +  -  * /  %

4.变量删除替换

1.从前往后删除变量内容

2.从后面往前删除变量内容

3.切片及索引

4.变量内容替换

5.变量替代

6.变量的替代


什么是变量:

简单理解:变量就是一个固定的值来表示一个不固定的存在变化的值的简称。

[root@VM-1-12-centos ~]# a=1111
[root@VM-1-12-centos ~]# b=2222
[root@VM-1-12-centos ~]# echo $a
1111
[root@VM-1-12-centos ~]# echo $b
2222

1.变量常见类型

shell变量如下几类分为:

自定义变量

系统环境变量

位置参数变量

预先定义变量

1.自定义变量

  1. 定义变量 变量名=变量值 ,不允许数字命名, 不能使⽤-命名
  2. 引⽤变量 $变量名 或 ${变量名}
  3. 查看变量 echo $变量名 set显示所有变量,包括⾃定义变量和环境变量
  4. 取消变量 unset 变量名 作⽤范围:仅在当前 shell 中有效

2.系统环境变量

1.定义环境变量 export export 变量 ,将⾃定义变量转换成环境变量

2.引⽤环境变量 $变量名 或 ${变量名}

3.查看环境变量 echo $变量名 env |grep Name

4.取消环境变量 unset 变量名

5.变量作⽤范围 在当前shell和⼦shell有效

3.位置参数变量

脚本参数传参: $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10}

4.预先定义变量

$0 脚本⽂件名

$* 所有的参数

$@ 所有的参数

$# 参数的个数

$$ 当前进程的 PID

$! 上⼀个后台进程的 PID

$? 上⼀个命令的返回值 0 表示成功

//例,	演示每个参数的作⽤
echo "  第      7       个位置参数是$7"
echo "  第      6       个位置参数是$6"
echo "  第      5       个位置参数是$5"
echo "  第      4       个位置参数是$4"
echo "  第      3       个位置参数是$3"
echo "  第      2       个位置参数是$2"
echo "  第      1       个位置参数是$1"
echo "  所有参数是:     $*"
echo "  所有参数是:     $@"
echo "  参数的个数是:   $#"
echo "  当前进程的      PID     是:     $$"
echo '$4='$4
echo '$5='$5
echo '$6='$6
echo '$*='$*    
echo '$@='$@
echo '$#='$#
echo '$$='$$

执行后的结果:

[root@VM-1-12-centos ~]# bash yudingyi.sh {a..z}
	第	7	个位置参数是g
	第	6	个位置参数是f
	第	5	个位置参数是e
	第	4	个位置参数是d
	第	3	个位置参数是c
	第	2	个位置参数是b
	第	1	个位置参数是a
	所有参数是:	a b c d e f g h i j k l m n o p q r s t u v w x y z
	所有参数是:	a b c d e f g h i j k l m n o p q r s t u v w x y z
	参数的个数是:	26
	当前进程的	PID	是:	25394
$4=d
$5=e
$6=f
$*=a b c d e f g h i j k l m n o p q r s t u v w x y z
$@=a b c d e f g h i j k l m n o p q r s t u v w x y z
$#=26
$$=25394

 2.变量赋值方式

1.显式赋值(变量名=变量值)

#!/bin/bash
ip1=192.168.0.10
school="Xiaoming Xiaohong"
today1=`date +%F`
today2=$(date +%F)

echo $ip1
echo $school
echo $today1
echo $today2

 运行结果:

[root@VM-1-12-centos data]# bash xianshi.sh
192.168.0.10
Xiaoming Xiaohong
2023-07-03
2023-07-03

2.read从键盘读入变量值

read 变量名

read -p "提示信息: " 变量名

read -t 5 -p "提示信息: " 变量名

read -n 2 变量名

//示例:
vim read1.sh

#!/bin/bash
back_dir1=/var/backup
read -p "请输入你的备份目录: " back_dir2
echo "系统默认的备份路径: " $back_dir1
echo "自定义的备份路径:" $back_dir2
vim ping2.sh

#!/bin/bash
read -p "Input IP: " ip
ping -c2 $ip &>/dev/null
if [ $? -eq 0 ];then
   echo "host $ip is ok"
else
   echo "host $ip is fail"
fi

 结果:

[root@VM-1-12-centos data]# bash read1.sh
请输入你的备份目录: /date
系统默认的备份路径:  /var/backup
自定义的备份路径: /date
[root@VM-1-12-centos data]# bash ping2.sh
Input IP: 10.10.1.12
host 10.10.1.12 is ok

3.注意事项: 定义或引⽤变量时注意事项: " " 弱引⽤ ' ' 强引⽤

[root@VM-1-12-centos ~]# name=`hostname`
[root@VM-1-12-centos ~]# echo "${name} is good"
VM-1-12-centos is good
[root@VM-1-12-centos ~]# echo '${name} is good'
${name} is good

 4.``命令替换等价于 $() 反引号中的 shell 命令会被先执⾏(在上个示例中我们已经使用``)

[root@VM-1-12-centos data]# touch `date +%F`_file1.txt
[root@VM-1-12-centos data]# touch $(date +%F)_file2.txt
[root@VM-1-12-centos data]# disk_free3="df -Ph |grep '/$' |awk '{print $4}'"
[root@VM-1-12-centos data]# disk_free4=$(df -Ph |grep '/$' |awk '{print $4}')
[root@VM-1-12-centos data]# disk_free5=`df -Ph |grep '/$' |awk '{print $4}'`

 测试后的结果如下:

[root@VM-1-12-centos data]# echo $disk_free3
df -Ph |grep '/$' |awk '{print }'
[root@VM-1-12-centos data]# echo $disk_free4
44G
[root@VM-1-12-centos data]# echo $disk_free5
44G

3.变量数值运算

1.整数运算expr + - \* / %

expr 5 + 4
expr $num1 + $num2

 2.整数运算$(()) + - * / %

echo $(($num1+$num2))
echo $((num1+num2))
echo $((4-5*4))
echo $(((6-5)*4))
echo $((2**5))
sum=$((1+4));echo $sum

3.整数运算$[] + - * / %

echo $[6+8]
echo $[5**2]

 4.整数运算 let + - * / %

let sum=5+6;
echo $sum

5.小数运算bc  +  -  * /  %

echo "3*4" | bc
echo "5*8" |bc
echo "scale=3;8/6" |bc
awk 'BEGIN{print 1/2}'
awk 'BEGIN{print 7/8}'
echo "print 8.0/2" |python

4.变量删除替换

1.从前往后删除变量内容

[root@VM-1-12-centos data]# url=www.baidu.com

//获取变量值的长度
[root@VM-1-12-centos data]# echo ${#url}
13

//输出变量的长度
[root@VM-1-12-centos data]# echo ${url}
www.baidu.com

//从前往后,最短匹配
[root@VM-1-12-centos data]# echo ${url#*.}
baidu.com

//从前往后,最长匹配(贪婪模式)
[root@VM-1-12-centos data]# echo ${url##*.}
com

2.从后面往前删除变量内容

[root@VM-1-12-centos ~]# url=www.yangfboolg.com
[root@VM-1-12-centos ~]# echo ${url}
www.yangfboolg.com

//从后往前,最短匹配
[root@VM-1-12-centos ~]# echo ${url%.*}
www.yangfboolg

//从后往前,最长匹配 贪婪匹配
[root@VM-1-12-centos ~]# echo ${url%%.*}
www



[root@VM-1-12-centos ~]# url=www.yangfboolg.com
[root@VM-1-12-centos ~]# echo ${url#a.}
www.yangfboolg.com
[root@VM-1-12-centos ~]# echo ${url#*yangfboolg.}
com



[root@www ~]# echo ${HOSTNAME##.*}
www.yangfblog.com
[root@www ~]# echo ${HOSTNAME%.*}
www.yangfblog
[root@www ~]# echo ${HOSTNAME%%.*}
www

3.切片及索引

[root@www ~]# url=www.yangfboolg.com
[root@www ~]# echo ${url:0:5}
www.y
[root@www ~]# echo ${url:5:5}
angfb
[root@www ~]# echo ${url:6:5}
ngfbo
[root@www ~]# echo ${url:5}
angfboolg.com

4.变量内容替换

[root@www ~]# url=www.yangfboolg.com.cn
[root@www ~]# echo ${url/n/N}
www.yaNgfboolg.com.cn

//贪婪匹配
[root@www ~]# echo ${url//n/N}
www.yaNgfboolg.com.cN

5.变量替代

${变量名-新的变量值}

变量没有被赋值:会使用“新的变量值”替代

变量有被赋值(包括空值):不会被替代

//例1
[root@www ~]# unset url
[root@www ~]# echo $url

[root@www ~]# url=www.yangfboolg.com
[root@www ~]# echo $url
www.yangfboolg.com
[root@www ~]# echo ${url-www.xxxx.com}
www.yangfboolg.com
[root@www ~]# unset url
[root@www ~]# echo ${url-www.xxx.com}
www.xxx.com


//例2

[root@www ~]# url2=
[root@www ~]# echo ${url2-www.baidu.com}

6.变量的替代

${变量名:-新的变量值}

变量没有被赋值(包括空值):都会使用“新的变量值”替代

变量没有赋值:不会被替代

//例1
[root@www ~]# unset url
[root@www ~]# echo $url

[root@www ~]# url=www.yangfboolg.com
[root@www ~]# echo $url
www.yangfboolg.com
[root@www ~]# echo ${url:-www.xxxx.com}
www.yangfboolg.com
[root@www ~]# unset url
[root@www ~]# echo ${url:-www.xxxx.com}
www.xxxx.com

//例2
[root@www ~]# url2=
[root@www ~]# echo $url2

[root@www ~]# echo ${url2:-www.xxxx.com}
www.xxxx.com

5.自增变量

[root@www ~]# unset i
[root@www ~]# unset j
[root@www ~]# i=1
[root@www ~]# j=1
[root@www ~]# let x=i++
[root@www ~]# let y=++j
[root@www ~]# echo $i
2
[root@www ~]# echo $j
2
[root@www ~]# echo $x
1
[root@www ~]# echo $y
2


[root@www ~]# i=1
[root@www ~]# let i++
[root@www ~]# echo $i 2
2 2

实际案例:

[root@www ~]# cat i++.sh 
#!/bin/bash

ip=223.6.6.6
i=1
while [ $i -le 5 ];do
      ping -c1 $ip &>/dev/null
      if [ $? -eq 0 ];then
          echo "$ip is up ..."
      fi
      let i++
done

*如果有遗漏的点,欢迎大家提出意见

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值