Linux培训
达内IT学院
400-996-5531
今天小编要跟大家分享的文章是关于Linux基础运维知识之shell脚本基础。想要学习Linux运维基础知识和正在从事Linux运维工作的小伙伴们来和小编一起看一看,希望能够对大家有所帮助。
1、创建shell脚本
· 使用文本编辑器vim来创建文本文件
· 第一行必须包括shell声明序列:#!(幻数)
· #!/bin/bash
· 添加注释,注释以#开头 (尽量不要用中文)
2、 脚本的执行方式
· bash script-name.sh
· /path/to/script-name.sh或者 ./script-name.sh 脚本需要有执行权限才行
给脚本增加执行权限:
chmod +x script-name.sh
· source或. script-name
§ 注意:会将脚本中的变量值或函数返回值传递到父shell中,会在当前shell中执行加载脚本中的变量命令,而不是产生子shell去执行脚本。a,b都是产生子shell执行的脚步。
[root@CentOS7 data]# cat source.sh
#!/bin/bash
#
name=10000
[root@CentOS7 data]# name=0
[root@CentOS7 data]# echo $name
0
[root@CentOS7 data]# sh source.sh
[root@CentOS7 data]# echo $name
0
[root@CentOS7 data]# . source.sh
[root@CentOS7 data]# echo $name
10000
[root@CentOS7 data]# cat source2.sh
echo $name
[root@CentOS7 data]# . source2.sh
10000 ##一个脚本调用另一个脚本的参数
3、脚本规范
脚本代码开头约定
1、第一行一般为调用使用的语言
2、程序名,避免更改文件名为无法找到正确的文件
3、版本号
4、更改后的时间
5、作者相关信息
6、该程序的作用,及注意事项
7、最后是各版本的更新简要说明
#!/bin/bash
# ------------------------------------------
# Filename: hello.sh
# Revision: 1.1
# Date: 2018/08/01
# Author: zhuyousheng
# Email: xxx@qq.com
# Website: #
# Description: This is the first script
# ------------------------------------------
# Copyright: 2018 zhu
# License: GPL
echo “hello world
4、脚本调试
检测脚本中的语法错误bash -n /path/to/some_script
调试分步执行bash -x /path/to/some_scrip
5、养成脚本编写的好习惯
· 成对符号一次性打出来,然后退格在符号里添加内容,防止遗漏
· []中括号,[[]]两端必须都有两个空格
· 流程控制语句,一次性将格式写完,在添加内容
· 通过缩进让代码易读
· 常规变量的字符串定义变量值应该加号,并且等号前后不能有空格,需要强引用的,用'',如果是命令的引用,则用双引号""
· linux中的符号都是英文状态下的符号
6、编写第一个脚本hello world
[root@CentOS7 ~]# vim test1.sh
[root@CentOS7 ~]# cat test1.sh
#!/bin/bash
# ------------------------------------------
# Filename: test1.sh
# Revision: 1.1
# Date: 2018/08/01
# Author: zhu
# Email: 154760531@qq.com
# Website: #
# Description: This is the first script
# ------------------------------------------
# Copyright: 2018 zhu
# License: GPL
echo "hello world"
7、写一个脚本脚本/root/bin/systeminfo.sh,显示当前主机系统信息
包括主机名, IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小
[root@CentOS7 ~]# cat /root/bin/systeminfo.sh
#!/bin/bash
echo "OS_version is `cat /etc/centos-release| grep -o "[0-9]\+"|head -n1`"
echo "Kernel_version is `uname -r`"
echo "IPv4 is `ifconfig ens33|grep "cast"|tr -s ' ' |cut -d" " -f3`"
echo "CPU_type is `lscpu |grep "Model name"|tr -s " " |cut -d: -f2`"
echo "Memory Size is `cat /proc/meminfo |head -n1 |tr -d " "|cut -d: -f2`"
lsblk|grep "^sd"|tr -s " "|cut -d " " -f1,4`"
echo "Hostname is $HOSTNAME"
echo "My name is "$USER""
8、变量
· 变量:命名的内存空间
· 数据存储方式:ASCII
§ 字符:110
§ 数值:110
· 变量作用:
§ 1、数据存储格式
§ 2、参与的运算
§ 3、表示的数据范围
· 变量类型:
§ 字符
§ 数值:整型、浮点型
· 强类型:变量在使用前,必须事先声明,甚至还需要初始化
· 弱类型:变量在使用前,不需要事先声明,参与运算会自动进行隐式类型转换。默认为字符形式,bash不支持浮点型。
· 变量命名法则:
§ 1、不能使程序中的保留字:例如if, for
§ 2、只能使用数字、字母及下划线,且不能以数字开头
§ 3、见名知义
§ 4、统一命名规则:驼峰命名法
· 根据变量的生效范围等标准划分下面变量类型:
· 局部变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效
· 环境(全局)变量:生效范围为当前shell进程及其子进程
· 本地变量:生效范围为当前shell进程中某代码片断,通常指函数
· 位置变量:$1, $2, ...来表示,用于让脚本在脚本代码中调用通过命令行传递给它 的参数
· 特殊变量:$?, $0, $*, $@, $#,$$,$_ ,$!
· $$:当前进程的PID
· $!:执行上一个指令的PID
· $_:获取在此之前执行的命令或脚本的最后一个参数
(1)局部变量
· 变量赋值:name=‘value’
· 可以使用引用value:
§ (1) 可以是直接字串; name=“root"
§ (2) 变量引用:name="$USER"
§ (3)命令引用:name=`COMMAND` name=$(COMMAND)
· 变量引用:${name} $name
§ "":弱引用,其中的变量引用会被替换为变量值
§ '':强引用,其中的变量引用不会被替换为变量值,而保持原字符串
· 显示已定义的所有变量:set
· 删除变量:unset name
(2)环境变量
· 变量声明、赋值:
§ export name=VALUE
§ declare -x name=VALUE
· 变量引用:$name, ${name}
· 显示所有环境变量:
§ env
§ printenv
§ export
§ declare -x
· 删除变量:unset name
(3) 只读变量
· 只读变量:只能声明,但不能修改和删除
· 声明只读变量:
§ readonly name
§ declare -r name
· 查看只读变量:readonly –p
(4)位置变量
· 位置变量:在脚本代码中调用通过命令行传递给脚本的参数
· $1, $2, ...:对应第1、第2等参数,
· shift [n]换位置
· $0: 命令本身
· "$*":传递给脚本的所有参数,全部参数合为一个字符串,相当于"$1 $2 $3"
· "$@": 传递给脚本的所有参数,会保留所有的内嵌在每个参数中的任何空白,将所有参数视为不同的独立字符串,相当于"$1" "$2" "$3"
· $#: 传递给脚本的参数的个数
· $@: 传递给脚本的所有参数
· $*: 引用传递给脚本的所有参数,只在被双引号包起来的时候$*和$#才会有差异。
· set -- 清空所有位置变量
· $! : Shell最后运行的后台Process的PID(后台运行的最后一个进程的PID号)
[root@CentOS7 ~]# name=parent;{ echo "1:$name";name=son;echo "2:$name"; };echo "3:$name"
1:parent ## 花扩号在当前shell中执行,前后有空格,不开启子shell
2:son
3:son
[root@CentOS7 ~]# name=parent;(echo "1:$name";name=son;echo "2:$name");echo "3:$name"
1:parent ## 小括号在执行时,会开启子进程,子进程能拿到父进程的变量,子进程内变量赋值、内部命令将会影响子进程的环境,()执行完成后,子进程结束,不保留变量赋值。
2:son
3:parent
9、 $?命令执行状态返回值(退出状态)
进程使用退出状态来报告成功或失败
· 0 代表成功 1-255代表失败
· $? 变量保存上一条命令执行状态返回值
· 例如:ping -c1 -W1 hostdown &> /dev/null echo $?
10、退出状态码
· bash自定义退出状态码
· exit [n]:自定义退出状态码
· 注意:脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态取决于exit命 令后面的数字 注意:如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码
11、算术运算
· bash中的算术运算:bash会对数字执行隐式的类型转换
· 运算操作符:+, -, *, /, %取模(取余), **(乘方)
· 实现算术运算:
· (1) let var=算术表达式
· (2) var=$[算术表达式]
· (3) var=$((算术表达式))
· (4) var=$(expr arg1 arg2 arg3 ...)
· (5) declare –i var = 数值
· (6) echo "算术表达式" | bc
· 乘法符号有些场景中需要转义,如*
· bash有内建的随机数生成器:$RANDOM(0-32767) echo $[$RANDOM%50] :0-49之间随机数
· 增强型赋值: +=, -=, *=, /=, %=
· let varOPERvalue
· 例如:let count+=3 即count=count+3 自加3后自赋值
· 自增,自减:
· let var+=1
· let var++
· let var-=1
· let var--
12、逻辑运算
· true, false
· 1, 0
· 与:
§ 1 与 1 = 1
§ 1 与 0 = 0
§ 0 与 1 = 0
§ 0 与 0 = 0
· 或:
§ 1 或 1 = 1
§ 1 或 0 = 1
§ 0 或 1 = 1
§ 0 或 0 = 0
· 非:
§ ! 1 = 0
§ ! 0 = 1
· 短路运算
· 短路与
§ 第一个为0,结果必定为0
§ 第一个为1,第二个必须要参与运算
· 短路或
§ 第一个为1,结果必定为1
§ 第一个为0,第二个必须要参与运算
· 异或:^
§ 异或的两个值,相同为假0,不同为真1
13、条件测试
· 判断某需求是否满足,需要由测试机制来实现
· Note:专用的测试表达式需要由测试命令辅助完成测试过程
· 评估布尔声明,以便用在条件性执行中
§ 若真,则返回0
§ 若假,则返回1
14、测试命令
· test EXPRESSION
· [ EXPRESSION ]
· [[ EXPRESSION ]]
· 注意:EXPRESSION前后必须有空白字符
15、 bash的数值测试
· 数值测试:
§ -gt 是否大于
§ -ge 是否大于等于
§ -eq 是否等于
§ -ne 是否不等于
§ -lt 是否小于
§ -le 是否小于等于
16、 bash的字符串测试
· 字符串测试:
§ = 是否等于
§ > ascii码是否大于ascii码
§ < 是否小于
§ != 是否不等于
§ =~ 左侧字符串是否能够被右侧的PATTERN所匹配
§ 注意: 此表达式一般用于[[]]中;扩展的正则表达式,右侧的PATTERN不加引号
§ -z "STRING" 字符串是否为空,空为真,不空为假
§ -n "STRING" 字符串是否不空,不空为真,空为假
§ 注意:用于字符串比较时的用到的操作数都应该使用引号
[root@CentOS7 ~]# var=abcdef;[[ "$var" = abc* ]] && echo 1 || echo 0
1 ## [[ = ]] 支持通配符
[root@CentOS7 ~]# var=abcdef;[[ "$var" = "abc*" ]] && echo 1 || echo 0
0 ## 引号引起来的都视为是字符串
[root@CentOS7 ~]# filename=a.conf;[[ "$filename" =~ \.conf ]] && echo 1 || echo 0
1 ## 正则表达式不加引号
17、 Bash的文件测试
(1)文件存在性测试
· -a FILE:同-e
· -e FILE: 文件存在性测试,存在为真,否则为假
(2)文件类别测试
· -b FILE:是否存在且为块设备文件
· -c FILE:是否存在且为字符设备文件
· -d FILE:是否存在且为目录文件
· -f FILE:是否存在且为普通文件
· -h FILE 或 -L FILE:存在且为符号链接文件
· -p FILE:是否存在且为命名管道文件
· -S FILE:是否存在且为套接字文件
(3) Bash的文件权限测试
· -r FILE:是否存在且可读
· -w FILE: 是否存在且可写
· -x FILE: 是否存在且可执行
(4) 文件特殊权限测试:
· -u FILE:是否存在且拥有suid权限
· -g FILE:是否存在且拥有sgid权限
· -k FILE:是否存在且拥有sticky权限
(5)Bash的文件属性测试
· 文件大小测试:
· -s FILE: 是否存在且非空
(6)文件是否打开:
· -t fd: fd 文件描述符是否在某终端已经打开
· -N FILE:文件自从上一次被读取之后是否被修改过
· -O FILE:当前有效用户是否为文件属主
· -G FILE:当前有效用户是否为文件属组
(7) Bash的文件属性测试
· 双目测试:
§ FILE1 -ef FILE2: FILE1是否是FILE2的硬链接
§ FILE1 -nt FILE2: FILE1是否新于FILE2(mtime) - FILE1 -ot FILE2: FILE1是否旧于FILE2
(8)Bash的组合测试条件
· 第一种方式:
§ COMMAND1 && COMMAND2 并且
§ COMMAND1 || COMMAND2 或者
§ ! COMMAND 非
§ 如:[[ -r FILE ]] && [[ -w FILE ]]
· 第二种方式:
§ EXPRESSION1 -a EXPRESSION2 并且
§ EXPRESSION1 -o EXPRESSION2 或者
§ ! EXPRESSION 非
§ 必须使用测试命令进行
§ 示例:
[root@CentOS7 ~]# [ -z "$HOSTNAME" -o $HOSTNAME == "#" ] && echo 1 || echo 0
1
[root@CentOS7 ~]#[ -f /bin/cat -a -x /bin/cat ] && cat /etc/fstab
[root@CentOS7 ~]#[ -f /bin/cat -a -x /bin/cat ] && cat /etc/fstab
# /etc/fstab
# Created by anaconda on Wed Jul 18 17:26:27 2018
18、使用read命令来接受输入
· 使用read来把输入值分配给一个或多个shell变量
§ -p 指定要显示的提示
§ -s 静默输入,一般用于密码
§ -n N 指定输入的字符长度N
§ -d '字符' 输入结束符
§ -t N TIMEOUT为N秒
· read 从标准输入中读取值,给每个单词分配一个变量 所有剩余单词都被分配给最后一个变量
· read -p "Enter a filename:" FILE
19、 bash的配置文件
· 按生效范围划分,存在两类:
· 全局配置: /etc/profile /etc/profile.d/*.sh /etc/bashrc
· 个人配置: ~/.bash_profile ~/.bashrc
20、 shell登录两种方式
· 交互式登录:
· (1)直接通过终端输入账号密码登录
· (2)使用“su - UserName” 切换的用户
· 执行顺序:/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
· 非交互式登录:
· (1)su UserName
· (2)图形界面下打开的终端
· (3)执行脚本
· (4)任何其它的bash实例
· 执行顺序:~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh
(1) Profile类
· profile类:为交互式登录的shell提供配置
§ 全局:/etc/profile, /etc/profile.d/*.sh
§ 个人:~/.bash_profile
§ 功用:
§ (1)用于定义环境变量
§ (2) 运行命令或脚本
(2) Bashrc类
· bashrc类:为非交互式和交互式登录的shell提供配置
§ 全局:/etc/bashrc
§ 个人:~/.bashrc
§ 功用:
§ (1) 定义命令别名和函数
§ (2) 定义本地变量
编辑配置文件生效
· 修改profile和bashrc文件后需生效
· 两种方法:
§ 1. 重新启动shell进程
§ 2. 或source 例: . ~/.bashrc
· 让任意一个目录下的具有执行权限的脚本不用输入路径就可以执行。
[root@CentOS7 scripts]# cat /etc/profile.d/zhu.sh
PATH=.:$PATH
[root@CentOS7 scripts]# . /etc/profile.d/zhu.sh
[root@CentOS7 scripts]# yesorno.sh
please input yes or no:y
Your answer is YES.
[root@CentOS7 scripts]# echo $PATH
.:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
tips:为了安全考虑,在生产中不建议这么做
21、 Bash 退出任务
· 保存在~/.bash_logout文件中(用户)
· 在退出登录shell时运行
· 用于创建自动备份
· 清除临时文件
22、 $-变量
· h:hashall,打开这个选项后,Shell 会将命令所在的路径hash下来,避免每次都要查询。通过set +h将h选项关闭
· i:interactive-comments,包含这个选项说明当前的 shell 是一个交互式的 shell。所谓的交互式shell,在脚本中,i选项是关闭的(cat /etc/profile.d/vte.sh)
· m:monitor,打开监控模式,就可以通过Job control来控制进程的停止、继 续,后台或者前台执行等。
· B:braceexpand,大括号扩展
· H:history,H选项打开,可以展开历史列表中的命令,可以通过!感叹号来完 成,例如“!!”返回上最近的一个历史命令,“!n”返回第 n 个历史命令。
以上就是小编今天为大家分享的关于Linux基础运维知识之shell脚本基础的文章,希望本篇文章能够对正在从事Linux运维工作和学习的小伙伴们有所帮助,想要了解更多Linux相关知识记得关注达内Linux培训官网。最后祝愿小伙伴们工作顺利,成为一名优秀的Linux运维工程师。
【免责声明:本文图片及文字信息均由小编转载自网络,旨在分享提供阅读,版权归原作者所有,如有侵权请联系我们进行删除。】
填写下面表单即可预约申请免费试听! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!
Copyright © 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有
Tedu.cn All Rights Reserved