shell编程 第一章 变量

tech2022-07-08  169

一 SHELL前言

1.什么是shell; 2.shell语言的特点:

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

3.shell能做什么:

自动化批量系统初始化程序 (update,软件安装,时区设置,安全策略…)自动化批量软件部署程序 (LAMP,LNMP,Tomcat,LVS,Nginx)应用管理程序 (KVM,集群管理扩容,MySQL,DELLR720批量RAID)日志分析处理程序(PV, UV, 200代码, !200代码, top 100, grep/awk)自动化备份恢复程序(MySQL完全备份/增量 + Crond)自动化管理程序(批量远程修改密码,软件升级,配置更新)自动化信息采集及监控程序(收集系统/应用状态信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL)配合Zabbix信息采集(收集系统/应用状态信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL)自动化扩容(增加云主机——>业务上线) zabbix监控CPU 80%+|-50% Python API AWS/EC2(增加/删除云主机) + Shell Script(业务上线)俄罗斯方块,打印三角形,打印圣诞树,打印五角星,运行小火车,坦克大战,排序算法实现Shell可以做任何事(一切取决于业务需求)

4.shell多种执行方式;

1.准备测试脚本:

[root@localhost tmp]#vim file1 echo “hello 2020” read -p "请输入您的姓名:“ name echo “哈哈 $name是大笨蛋”

2.执行1;bash ping01.sh

3.执行2:sh ping01.sh which bash which sh 发现是同一个文件

4.执行3: . bash. sh

5.执行4: source bash.sh 同理执行3

6.多种执行方式的区别:

1和2的方式,是子shell 3和4的方式,是本shell 1.准备环境

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

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

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

二 BASH SHELL

1.第二阶段shell课程概览:

shell特性 易学,高效shell变量shell条件测试,判断shell数值运算流控、循环 命令汇总 if case for while until break 跳过 continue 终止 exit 退出 shift 退出 array 数组统计 function 函数企业项目

2.shell命令解释器有哪些: shell 命令就是前一阶段所学习的大部分命令。 cp ls date组合到一起。

Linux支持的shell有哪些呢? cat /etc/shells 或 chsh -l

三 变量

1.简介: shell 变量? 用一个固定的字符串去表示不固定的内容,便于修改。

2.变量的类型: 1.自定义变量; 特性:

自定义变量(示例:ping01.sh引入变量) 定义变量: 变量名=变量值 变量名必须以字母或下划线开头,区分大小写 ip1=192.168.2.115 引用变量: $变量名 或 ${变量名} 查看变量: echo $变量名; "set"可以查看所有变量(包括自定义变量和环境变量) 取消变量: unset 变量名 作用范围: 仅在当前shell中有效

示例0: 使用变量前。麻烦 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.显式赋值;

显式赋值 变量名=变量值 示例: 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.注意事项,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

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

四 变量的运算

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.小数运算(了解):

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做了解

最新回复(0)