shell编程变量

SHELL 前言
什么是shell

shell语言的特点
	SHELL语言是指UNIX操作系统的命令语言,同时又是该命令语言的解释程序的简称。
	Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的。
	Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;
	作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。
	它虽然不是Unix/Linux系统内核的一部分,但它调用了系统核心的大部分功能来执行程序、
	建立文件并以并行的方式协调各个程序的运行。
	因此,对于用户来说,shell是最重要的实用程序,
	深入了解和熟练掌握shell的特性极其使用方法,是用好Unix/Linux系统的关键。

Shell 能做什么?

  1. 自动化批量系统初始化程序 (update,软件安装,时区设置,安全策略…)
  2. 自动化批量软件部署程序 (LAMP,LNMP,Tomcat,LVS,Nginx)
  3. 应用管理程序 (KVM,集群管理扩容,MySQL,DELLR720批量RAID)
  4. 日志分析处理程序(PV, UV, 200代码, !200代码, top 100, grep/awk)
  5. 自动化备份恢复程序(MySQL完全备份/增量 + Crond)
  6. 自动化管理程序(批量远程修改密码,软件升级,配置更新)
  7. 自动化信息采集及监控程序(收集系统/应用状态信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL)
  8. 配合Zabbix信息采集(收集系统/应用状态信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL)
  9. 自动化扩容(增加云主机——>业务上线)
    zabbix监控CPU 80%+|-50% Python API AWS/EC2(增加/删除云主机) + Shell Script(业务上线)
  10. 俄罗斯方块,打印三角形,打印圣诞树,打印五角星,运行小火车,坦克大战,排序算法实现
  11. Shell可以做任何事(一切取决于业务需求)
    SHELL执行方式:
    shell多种执行方式
    准备测试脚本
    [root@localhost tmp]#vim file1
    echo “hello 2020”
    read -p “请输入您的姓名:” name
    echo “哈哈 $name 是大笨蛋”
    执行1:bash ping01.sh
    执行2:sh ping01.sh
    which bash
    which sh
    发现是同一个文件
    执行3:. bash.sh
    执行4: source bash.sh
    同理执行3
    多种执行方式的区别
    1和2的方式,是子shell
    3和4的方式,是本shell
    1.准备环境

vim bash.sh
#!/usr/bin/bash
cd /home/
ls

  1. 一种执行方式测试
    . bash.sh

3.观察目录改变了。说明影响的是当前。并使用子shell执行方式执行。
该种执行方式,是不同于前者SUB shell执行。
而是在当前shell执行,用于影响当前shell环境。

二.变量
1.简介
shell 变量, 用一个固定的字符串去表示不固定的内容,便于修改。
2.变量的类型
1. 自定义变量
特性
1. 自定义变量(示例:ping01.sh引入变量)
定义变量: 变量名=变量值 变量名必须以字母或下划线开头,区分大小写 ip1=192.168.2.115
引用变量: $变量名 或 ${变量名}
查看变量: echo $变量名; "set"可以查看所有变量(包括自定义变量和环境变量)
取消变量: unset 变量名
作用范围: 仅在当前shell中有效
示例:
使用变量前。麻烦
ping -c1 192.168.100.10 &>/dev/null && echo 192.168.100.10up || echo 192.168.100.10down
使用变量后,简洁

#!/bin/bash
ip=192.168.100.10
ping -c1 $ip &>/dev/null && echo i p u p ∣ ∣ e c h o " ip up || echo " ipupecho"ip down"
变量赋值(定义变量):
1. 显式赋值
1. 显式赋值
变量名=变量值
示例:
ip1=192.168.1.251
school=“BeiJing 1000phone”
today1=date +%F
today2=$(date +%F)

		2. read 从键盘读入变量值
			2. read 从键盘读入变量值

read 变量名
read -p "提示信息: " 变量名
read -t 5 -p "提示信息: " 变量名 //-t 等待5秒,后超时
read -n 2 变量名 //-n 只记录几个字符

			read -p "请输入您测试的IP地址:" ip

ping -c1 $ip &>/dev/null && echo " i p u p " ∣ ∣ e c h o " ip up" || echo " ipup"echo"ip
down"
~
注意事项:3种引号
定义或引用变量时注意事项:
1
" " 弱引用
’ ’ 强引用
[root@tianyun ~]# school=1000phone
[root@tianyun ~]# echo "KaTeX parse error: Expected 'EOF', got '#' at position 61: …root@tianyun ~]#̲ echo '{school} is good’ //脱去所有字符
${school} is good

			2
				` ` 
					` ` 命令替换 等价于 $() 反引号中的shell命令会被先执行

[root@tianyun ~]# touch date +%F_file1.txt
[root@tianyun ~]# touch $(date +%F)_file2.txt

错误
[root@tianyun ~]# disk_free3="df -Ph |grep ‘/$’ |awk '{print KaTeX parse error: Expected 'EOF', got '}' at position 2: 4}̲'" 正确 [root@ti…(df -Ph |grep ‘/$’ |awk '{print KaTeX parse error: Expected 'EOF', got '}' at position 2: 4}̲') [root@tianyu…’ |awk ‘{print $4}’`

2. 环境变量(了解)
	2. 环境变量

定义环境变量: 方法一 export back_dir2=/home/backup
方法二 export back_dir1 将自定义变量转换成环境变量
引用环境变量: $变量名 或 ${变量名}
查看环境变量: echo $变量名 env 例如env |grep back_dir2
取消环境变量: unset 变量名
变量作用范围: 在当前shell和子shell有效 !!!
使变量开机、登陆生效,将变量放到~/.bash_profile
3. 位置变量和预定义变量(了解)
语法
命令 参数1 参数2 参数3 …9以后特殊定义
$1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} …
预先定义过的变量
$0 脚本名
$* 所有的参数
$@ 所有的参数
$# 参数的个数
$$ 当前进程的PID
$! 上一个后台进程的PID
$? 上一个命令的返回值 0表示成功
示例1
示例1:

vim test.sh

#!/usr/bin/bash
echo “第2个位置参数是$2”
echo “第1个位置参数是$1”
echo “第4个位置参数是$4”

echo “所有参数是: $*”
echo “所有参数是: $@”
echo “参数的个数是: $#”
echo “当前进程的PID是: $$”

echo ‘$1=’$1
echo ‘$2=’$2
echo ‘$3=’ 3 e c h o ′ 3 echo ' 3echo*=’ ∗ e c h o ′ * echo ' echo@=’ @ e c h o ′ @ echo ' @echo#=’KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲ echo ' = ′ =' =$

		演示
			[root@localhost ~]# chmod +x 1.sh 

[root@localhost ~]# ./1.sh 1 2 3 4 5 6 7 8 9
第2个位置参数是2
第1个位置参数是1
第4个位置参数是4
所有参数是: 1 2 3 4 5 6 7 8 9
所有参数是: 1 2 3 4 5 6 7 8 9
参数的个数是: 9
当前进程的PID是: 1946
$1=1
$2=2
$3=3
$*=1 2 3 4 5 6 7 8 9
$@=1 2 3 4 5 6 7 8 9
$#=9
$$=1946

	$*和$@区别(资料)
		shell中$*与$@的区别

关于$* 和 $@的 一点 认识 同是菜鸟一起学习

∗ 所 有 的 位 置 参 数 , 被 作 为 一 个 单 词 . 注 意 : " * 所有的位置参数,被作为一个单词. 注意:" ,.:"*“必须被”“引用.
@ 与 @ 与 @*同义,但是每个参数都是一个独立的”“引用字串,这就意味着参数被完整地传递,
并没有被解释和扩展.这也意味着,每个参数列表中的每个参数都被当成一个独立的
单词.
注意:”$@"必须被引用.

$@ $* 只在被双引号包起来的时候才会有差异
双引号括起来的情况:
$*将所有的参数认为是一个字段
$@以IFS(默认为空格)来划分字段,如果空格在“”里面,不划分。采用LS的脚本运行./test 1 “2 3” 4 来发现差异

没有括起来的情况是 @ 和 @和 @*一样的,见到IFS就划分字段。还是采用LS的脚本运行./test 1 “2 3” 4 来发现差异

一个小例子 ,仅供参考

[Copy to clipboard] [ - ]CODE:#!/bin/bash
echo

index=1

echo “Listing args with”$":"
for arg in "$
"

do
echo “Arg # i n d e x = index= index=arg”
let “index+=1”

done

echo “所有的参数被认为是一个单词”

echo

index=1

echo “Listing args with “$@”:”
for arg in “KaTeX parse error: Expected 'EOF', got '#' at position 17: …" do echo "Arg #̲index=$arg”
let “index+=1”
done

echo “所有的参数被认为是各个独立的单词”

echo

index=1
3.变量的运算
1. 整数运算
方法一:expr
语法
方法一:expr
expr 1 + 2
expr $num1 + KaTeX parse error: Undefined control sequence: \* at position 10: num2 + - \̲*̲ / % +加 -减 \*乘 …(())
语法
方法二:$(())
echo ( ( (( ((num1+$num2)) + - * / %
echo $((num1+num2))
echo $((5-3*2))
echo $(((5-3)*2))
echo ( ( 2 ∗ ∗ 3 ) ) / / ( 蜜 ) 2 的 3 次 方 s u m = ((2**3)) //(蜜)2的3次方 sum= ((23))//23sum=((1+2)); echo $sum

	方法三:$[]
		语法
			方法三:$[]

echo $[5+2] + - * / %
echo $[5**2]

	方法四:let
		示例
			方法四:let 表达式

let sum=2+3; echo $sum
let i++; echo $i

2. 小数运算(了解)
	2. 小数运算

echo “2*4” |bc
echo “2^4” |bc
echo “scale=2;6/4” |bc
awk ‘BEGIN{print 1/2}’
echo “print 5.0/2” |python
bc:交互运算器
scale=2 保留小数点后面两位
awk和python做了解
4. 扩展
查询变量时,进行的"内容/值"的删除或替换
="内容"的删除=(#%前后取值)
语法
示例1:从前往后删除:#

[root@tianyun ~]# url=www.sina.com.cn
[root@tianyun ~]# echo ${#url} 获取变量值的长度
15
[root@tianyun ~]# echo ${url} 标准查看
www.sina.com.cn
————————————————————————————
[root@tianyun ~]# echo ${url#www.} //删除显示
sina.com.cn
[root@tianyun ~]# echo ${url#.} 从前往后,最短匹配。删除到点。
sina.com.cn
[root@tianyun ~]# echo ${url##
.} 从前往后,最长匹配 贪婪匹配。删除到最后一个点
cn
—————————————————————————————
示例2:从后往前删除:%
[root@tianyun ~]# url=www.sina.com.cn
[root@tianyun ~]# echo ${url}
www.sina.com.cn
[root@tianyun ~]# echo ${url%.} 从后往前,最短匹配
www.sina.com
[root@tianyun ~]# echo ${url%%.
} 从后往前,最长匹配 贪婪匹配
www

		工作示例
			[root@tianyun ~]# url=www.sina.com.cn

截取二级域名
[root@tianyun ~]# echo ${url#*sina.}
com.cn

截取主机名
[root@tianyun ~]# echo ${url%%.*}
www

	===索引及切片===(::中间取值)
		[root@tianyun ~]# url=www.sina.com.cn

从第一个切片到第5个
[root@tianyun ~]# echo ${url:0:5}
www.s

从第5个切5个
[root@tianyun ~]# echo ${url:5:5}
ina.c

从第5个开始切
[root@tianyun ~]# echo ${url:5}
ina.com.cn
="内容"的替换=(//局部)
定义变量
[root@tianyun ~]# url=www.sina.com.cn

将变量中的字段替换成某些字段。
[root@tianyun ~]# echo ${url/sina/baidu}
www.baidu.com.cn

替换一个:/
[root@tianyun ~]# url=www.sina.com.cn
[root@tianyun ~]# echo ${url/n/N}
www.siNa.com.cn
替换多个://
[root@tianyun ~]# echo ${url//n/N} 贪婪匹配
www.siNa.com.cN

	===变量的整体替代===(-全部替换)
		1         -未定义可替代
			语法
				${变量名-新的变量值}-------------可以替换掉变量的值。(比如:赠送未付费用户礼包的活动)
			示例
				-无值可替代---------------------------------------------------------

[root@tianyun ~]# unset var1 //取消3个变量
[root@tianyun ~]# unset var2
[root@tianyun ~]# unset var3
[root@tianyun ~]# //1变量未定义
[root@tianyun ~]# var2=111 //2变量已定义
[root@tianyun ~]# var3= //3变量已定义
[root@tianyun ~]# echo ${var1-aaaaa}
aaaaa
[root@tianyun ~]# echo ${var2-bbbbb}
111
[root@tianyun ~]# echo ${var3-ccccc}

			结论
				未定义	  	    	:会替代
				已定义,空值      : 不会被替代
		2      :-未定义和空值可替代
			语法
				${变量名:-新的变量值}

未定义,空值 :会替代
有值 : 不会被替代

			示例
				:-未定义 和 空值 都会被替换。:-:-:-:-:-:-:-:-:-:-:-

[root@tianyun ~]# unset var1 //将三个变量未定义
[root@tianyun ~]# unset var2
[root@tianyun ~]# unset var3

[root@tianyun ~]# var2= //1变量未定义,2变量空值。
[root@tianyun ~]# var3=111 //3变量有值。
[root@tianyun ~]# echo ${var1:-aaaa}
aaaa
[root@tianyun ~]# echo ${var2:-aaaa}
aaaa

只有有值的时候,才不会被替换。
[root@tianyun ~]# echo ${var3:-aaaa}
111

		3:课后思考题。下列符号具备什么含义
			示例
				[root@tianyun ~]# echo ${var3+aaaa}    

[root@tianyun ~]# echo ${var3:+aaaa}

[root@tianyun ~]# echo ${var3=aaaa}
[root@tianyun ~]# echo ${var3:=aaaa}

[root@tianyun ~]# echo ${var3?aaaa}
[root@tianyun ~]# echo ${var3:?aaaa}

					 //空值不会替换,有值会替换

[root@localhost ~]# unset var1
[root@localhost ~]# unset var2
[root@localhost ~]# unset var3
[root@localhost ~]#
[root@localhost ~]# var2=
[root@localhost ~]# var3=111
[root@localhost ~]# echo ${var1+aaa}

[root@localhost ~]# echo ${var2+aaa}
aaa
[root@localhost ~]# echo ${var3+aaa}
aaa

					 //空值不会替换,有值会替换

[root@localhost ~]# unset var3
[root@localhost ~]# unset var2
[root@localhost ~]# unset var1
[root@localhost ~]# var2=111
[root@localhost ~]# var3=
[root@localhost ~]# echo ${var1:+aaa}

[root@localhost ~]# echo ${var3:+aaa}

[root@localhost ~]# echo ${var2:+aaa}
aaa

					//未定义可替换,空值,已定义不可替换

[root@localhost ~]# unset var1
[root@localhost ~]# unset var2
[root@localhost ~]# unset var3
[root@localhost ~]# var2=
[root@localhost ~]# var3=1111
[root@localhost ~]# echo ${var1=aaa}
aaa
[root@localhost ~]# echo ${var2=aaa}

[root@localhost ~]# echo ${var3=aaa}
1111

					//未定义,空值可替换,有值不可替换

[root@localhost ~]# unset var1
[root@localhost ~]# unset var2
[root@localhost ~]# unset var3
[root@localhost ~]# var2=
[root@localhost ~]# var3=111
[root@localhost ~]# echo ${var1:=aaa}
aaa
[root@localhost ~]# echo ${var2:=aaa}
aaa
[root@localhost ~]# echo ${var3:=aaa}
111

					//未定义替换并脚本退出,得出当前位置。已定义空和有值不替换。

[root@localhost ~]# unset var1
[root@localhost ~]# unset var2
[root@localhost ~]# unset var3
[root@localhost ~]# var2=
[root@localhost ~]# var3=111
[root@localhost ~]# echo ${var1?aaa}
-bash: var1: aaa
[root@localhost ~]# echo ${var2?aaa}

[root@localhost ~]# echo ${var3?aaa}
111

					//未定义,为空被替换,并退出。已定义不替换。

[root@localhost ~]# unset var1
[root@localhost ~]# unset var2
[root@localhost ~]# unset var3
[root@localhost ~]# var2=
[root@localhost ~]# var3=111
[root@localhost ~]# echo ${var1:?aaa}
-bash: var1: aaa
[root@localhost ~]# echo ${var2:?aaa}
-bash: var2: aaa
[root@localhost ~]# echo ${var3:?aaa}
111

	i++ 和 ++i 
		i++ 和 ++i (了解)

对变量的值的影响:没有影响。
[root@tianyun ~]# i=1
[root@tianyun ~]# let i++
[root@tianyun ~]# echo $i
2
[root@tianyun ~]# j=1
[root@tianyun ~]# let ++j
[root@tianyun ~]# echo $j
2

对表达式的值的影响:前者表达式是先赋值, 后者是先运算。所以一个是1,一个是2
[root@tianyun ~]# unset i
[root@tianyun ~]# unset j
[root@tianyun ~]#
[root@tianyun ~]# i=1
[root@tianyun ~]# j=1
[root@tianyun ~]#
[root@tianyun ~]# let x=i++ 先赋值,再运算
[root@tianyun ~]# let y=++j 先运算,再赋值
[root@tianyun ~]#
[root@tianyun ~]# echo $i
2
[root@tianyun ~]# echo $j
2
[root@tianyun ~]#
[root@tianyun ~]# echo $x
1
[root@tianyun ~]# echo $y
2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值