当前位置:首页 > linux基础 > 正文内容

Shell介绍(一)变量、传参、数值运算

5年前 (2019-09-08)linux基础554

Shell编程


1.什么情况下使用Shell

1:安装CentOS系统 自动化安装操作系统(kickstart cobbler) 底层shell

2:网络IP地址

3:初始化操作系统(ntp时间同步,更改默认YUM源,SSH端口,SSH远程连接禁止DNS解析,禁止root登录,关闭seilnux,防火墙优化(c6 iptables c7 firewald) 80 443 22 8080 10050 ,安装常用的软件命令 lrzsz wget net-tools... 加大文件描述符 中文字符集 内核参数优化  别名 重要的文件加上i a....等)


2.学习shell脚本需要用到的知识

1:远程连接工具 Xshll CRT(作业)

2:lINUX的常用命令 熟练掌握

3:三剑客命令熟练

4:vim编辑器熟练


3.shell入门

1:什么是shell  壳

命令解释器  用户输入命令 解释器负责解释给内核 处理后的结果 反馈用户 称为解释

 交互式shell 用户输入命令 解释器解释把处理后的结果反馈给用户的过程称为 交互式

非交互shell shell执行文本中的命令 当执行到文件的末尾 bash退出

父shell 不能继承子shell变量  子shell可继承父shell变量

2:什么是shell脚本

把可执行命令堆积到一个文本中则称为shell脚本(条件表达式 for循环 if判断等等语句)


4.shell脚本的书写规范

1: 目录统一

2: shell脚本的结尾要以.sh结尾

3: 脚本的开头需要有解释器 /bin/bash /bin/sh

4: 脚本中需要有作者信息 #Author lzy date version 做什么的

5: 脚本每行 或者 一个语句 给一个注释

6: shell中的文字尽量使用英文 py都是中文

7: 成对的符号一次性书写完毕 语句

5.第一个shell脚本

hello world!

执行脚本的三种方式

hello world!


1:bash test.sh

[root@web01 scripts]# bash test.sh
Hello World!


2:全路径执行

[root@web01 scripts]# chmod +x test.sh 
[root@web01 scripts]# /server/scripts/test.sh
Hello World!


3:或者source执行

[root@web01 scripts]# . test.sh
Hello World!
[root@web01 scripts]# source test.sh
Hello World!


什么区别?

1 2 在子shell中执行

. source 父进程下执行



7. 环境变量


1:什么是环境变量?

右边一堆内容,用一个名字来代替称为环境变量

name="I am qmf"


如何查看环境变量? 名称的前面加上$

echo $name


如何查看系统定义好的环境变量

env set


如何取消环境变量?

unset name


环境变量(全局变量)  普通变量(局部变量)


按照生存周期划分

永久性    修改配置文件 /etc/profile 

临时性    使用export 变量名称 声明即可


不加export 只对当前的shell生效

加export 对当前登录窗口所有的shell生效


环境的相关文件

1. /etc/profile 开机或者新连接的窗口执行一次

2. .bashrc

3. .bash_profile

4. /etc/bashrc



2:如何定义环境变量

变量名=变量值

环境变量名称的定义      字符 下划线 数字的组合 尽量以字母开头(禁止使用数字开头) 等号两端不允许有空格  见名知其意

书写方式

1. qmf_AGE=18     系统中变量的定义格式

2. qmf_age=18

3. qmf_Age=18   小驼峰语法

4. qmf_Age=18   大驼峰语法


变量值的定义方式

数字的定义

 qmf_age=18   连续的数字


字符串的定义

name="qmf"    使用双引号 不知道加什么符号 就加双引号  解析变量

name='qmf'    所见即所得  吃什么吐什么


命令的定义

time=`date`   #反引号  里面必须跟可执行命令
time=$(date)   $()
[root@web01 scripts]# name=qmf
[root@web01 scripts]# echo "$qmfisok"
[root@web01 scripts]# echo "${qmf}isok"
isok
[root@web01 scripts]# echo "${name}isok"
qmfisok
[root@web01 scripts]# echo '${name}isok'
${name}isok


8. 重要的特殊位置变量

$0脚本的名称,如果全路径执行脚本,则脚本名称也带全路径 basename 获取脚本的名称 重要

        案例: 给用户提示如何使用此脚本

echo $"Usage: $0 {start|stop|status|restart|force-reload}"

$n  脚本的第n个参数 $0被脚本名称占用 从$1开始 $9以后 需要加{}

$#  代表了脚本的传参的总个数  重要

案例:

[ $# -ne 2 ] && echo "你请输入两个参数" && exit

$*  脚本的所有的传参的参数 如果不加双引号则和$@相同 加上双引号则把所有参数视为一个整体

$@ 脚本的所有的传参的参数 如果不加双引号则和$*相同加上双引号则把所有参数视为独立的参数

   $* 和$@ 正常情况下一样  循环体内不同

$?  获取上一条命令的结果 0为成功 非0 失败  重要   

$$  获取脚本的PID

$!  上一个在后台运行脚本的PID 调试使用

$_   获取脚本的最后一个参数 相当于ESC .

9. 传参的三种方式

1:直接传参

2:赋值传参

3:read传参

#第一种传参方式
echo $1 $2

#第二种传参方式
name=$1
age=$2
echo $name $age
read -p "请输入名字和年龄" name1 age1
echo $name1 $age1




案例:使用read 传参的方式 更改系统的主机名称和IP地址的最后一位 192.168.12.X

#!/bin/sh
sdir="/etc/sysconfig/network-scripts/ifcfg-eth0"
sip=`cat /etc/sysconfig/network-scripts/ifcfg-eth0|awk -F. '/IPADDR/{print $NF}'|cut -c1`
read -p "请输入主机名称: " name
hostnamectl set-hostname $name
read -p "请输入IP地址的最后一位: " ip
sed -i "s#$sip#$ip#g"  $sdir


案例:ping 网址知否通

sh ping.sh www.baidu.com
ping www.baidu.com is ok
sh ping.sh www.xxxxx.com is error

[root@web01 scripts]# cat ping.sh 
#!/bin/sh
read -p "请输入一个网址: " url
ping -c 1 -W 1 $url >/dev/null 2>&1
[ $? -eq 0 ] && echo "ping $url is ok" || echo "ping $url is error"



10. 变量的字串知识

统计变量的长度
[root@web01 scripts]# echo "I am lizhenya"|wc -L
13
[root@web01 scripts]# echo $name|wc -L
13


变量的切片

[root@web01 scripts]# name="I am qmf"
[root@web01 scripts]# echo ${name:0:1}#从开始查找第一个字符
I
[root@web01 scripts]# echo ${name:2:2}#从第二个字符为开始查两个字符
am
[root@web01 scripts]# echo ${name:1}#从一个字符未开始查以后所有字符
am qmf


面试题:取字符串长度小于3的

方法1
for循环方式
[root@web01 scripts]# cat for.sh 
#!/bin/sh
for i in I am lizhenya teacher I am 18
do
    [ ${#i} -lt 3 ] && echo $i
done
方法2
[root@web01 scripts]# echo I am lizhenya teacher I am 18|xargs -n1|awk '{if(length<3)print}'
I
am
I
am
18
方法3
[root@web01 scripts]# echo I am lizhenya teacher I am 18|awk '{for(i=1;i<=NF;i++)if(length($i)<3)print $i}'



变量的删除和替换


从前往后删除变量内容

[root@web01 scripts]# echo $url
www.sina.com.cn
[root@web01 scripts]# echo ${url#*.}#删除 ‘.’ 之前的字符
sina.com.cn
[root@web01 scripts]# echo ${url#*.*.}#删除 ‘.’ 之前的字符
com.cn
[root@web01 scripts]# echo ${url##*.}#删除 ‘.’ 之前所有字符 (贪婪匹配)
cn


从后往前删除变量内容

[root@web01 scripts]# echo $url
www.sina.com.cn
[root@web01 scripts]# echo ${url%.*}#删除 ‘.’ 之后的字符
www.sina.com
[root@web01 scripts]# echo ${url%%.*}#删除 ‘.’ 之后所有字符 (贪婪匹配)
www


变量的替换

[root@web01 scripts]# echo $url
www.sina.com.cn
[root@web01 scripts]# echo ${url/w/a}#把第一个w替换成a
aww.sina.com.cn
[root@web01 scripts]# echo ${url//w/a}#把所有的w替换成a
aaa.sina.com.cn
[root@web01 scripts]# echo ${url/sina/baidu}#把sina替换成百度
www.baidu.com.cn


11:数值的运算


1. expr  整数运算

[root@web01 scripts]# expr 1 + 1#加+ 减- 乘\* 除/
2


2. $(())  整数运算 运算效率最高

[root@web01 scripts]# echo $((10+10))#加
20
[root@web01 scripts]# echo $((10-10))#减
0
[root@web01 scripts]# echo $((10*10))#乘
100
[root@web01 scripts]# echo $((10/10))#除
1


3. $[ ]  整数运算

[root@web01 scripts]# echo $[10+10]
20
[root@web01 scripts]# echo $[10-10]
0
[root@web01 scripts]# echo $[10*10]
100
[root@web01 scripts]# echo $[10/10]
1


4. let  重点

[root@web01 scripts]# let sum=10+10#直接传参
[root@web01 scripts]# echo $sum
20
[root@web01 scripts]# num1=100#设置变量
[root@web01 scripts]# num2=50
[root@web01 scripts]# let sum=$num1+$num2
[root@web01 scripts]# echo $sum
150
[root@web01 scripts]# let sum=$num1-$num2
[root@web01 scripts]# let sum=$num1*$num2
[root@web01 scripts]# let sum=$num1/$num2


5.  bc

[root@web01 scripts]# echo 10+10|bc
[root@web01 scripts]# echo 10-10|bc
[root@web01 scripts]# echo 10*10|bc
[root@web01 scripts]# echo 10/10|bc
[root@web01 scripts]# echo 10+10.5|bc
20.5


6:awk

[root@web01 scripts]# awk 'BEGIN{print 10+10}'
[root@web01 scripts]# awk 'BEGIN{print 10-10}'
[root@web01 scripts]# awk 'BEGIN{print 10/10.5}'
[root@web01 scripts]# awk 'BEGIN{print 10*10.5}'
[root@web01 scripts]# awk 'BEGIN{print 10^10}'        #平方运算
[root@web01 scripts]# echo 100 200                    #变量运算
100 200
[root@web01 scripts]# echo 100 200|awk '{print $1+$2}'
300


案例:计算器

[root@web01 scripts]# cat count.sh
#!/bin/sh
read -p "请输入第一个数字: " num1
read -p "请输入第二个数字: " num2
echo "$num1+$num2=$[$num1+$num2]"
echo "$num1-$num2=$[$num1-$num2]"
echo "$num1*$num2=$[$num1*$num2]"
echo "$num1/$num2=$[$num1/$num2]"


“Shell介绍(一)变量、传参、数值运算” 的相关文章

NFS文件共享存储

NFS文件共享存储

NFS基本概述NFS是Network File System的缩写及网络文件系统。NFS主要功能是通过局域网络让不同的主机系统之间可以共享文件或目录。NFS系统和Windows网络共享、网络驱动器类似, 只不过windows用于局域网, NFS用于企业集群架构中, 如果是大型网站, 会用到更复杂的分...

Shell介绍(二)函数,数组

函数命令的集合 完成特定功能的代码块模块化 复用函数和变量类似 只有先定义才可以调用,如果只定义不调用 则不会执行函数的定义和调用三种方法:[root@web scripts]# cat fun.sh #!/bin/sh test1(){   ...

Shell介绍(三)if判断,case控制,for循环,while循环,流程控制语句

if判断单分支if [你有房] then     我就嫁给你 fi多分支if [ 你有房 ] then     我就嫁给你 else   &nbs...

自动化运维(一)Ansible安装及模块的使用

自动化运维(一)Ansible安装及模块的使用

1:Ansible安装1.什么是AnsibleAnsible是python 中的一套模块,系统中的一套自动化工具,只需要使用ssh协议连接及可用来系统管理、自动化执行命令等任务。2.Ansible优势1、ansible不需要单独安装客户端,也不需要启动任何服务2、ansible是python中的一套...

自动化运维(二)Ansible Playbook

自动化运维(二)Ansible Playbook

1.Playbook剧本1.playbook翻译过来就是“剧本”,那playbook组成如下play: 定义的是主机的角色task: 定义的是具体执行的任务playbook: 由一个或多个play组成,一个play可以包含多个task任务简单理解为: 使用不同的模块完成一件事情2.playbook的...