shell编程(一)
一、概述
shell命令解释器:bash编程
命令解释器 | |
---|---|
bash | 目前应用最广泛一款命令解释器,红帽系列(默认),Debian,Ubuntu, BASH全称: Bourne-Again SHell |
dash | 一般debian/ubuntu系统默认的, 运行脚本推荐使用 |
csh,tcsh | 一些unix系统使用 |
zsh | 功能更多,支持更多的插件,可以更好看。 |
温馨提示
shell脚本(.bash,.sh),运行在ubuntu中的时候,不推荐使用sh运行,推荐使用bash运行
二、编程语言分类(按照执行方式)
编程语言分类 | 说明 |
---|---|
解析型:直接解析类 | shell,python,php, 书写成文件后,可以通过对应的解释器直接运行。 |
编译型:需要编译后运行 | C,C ,Java(maven),Golang. 下载好源代码,必须要进行编译生成可以运行的命令。 |
三、编程环境准备
修改vimrc文件,达到控制vim创建,编辑文件的动作
- 当前用户家目录下 ~/.vimrc
- 放在/etc/vimrc里面
[root@m01 ~]# cat /etc/vimrc
#最后添加这一块
#搜索的时候忽略大小写
set ignorecase
#设置条件创建.py .sh 文件的时候 使用SetTitle函数
autocmd BufNewFile *.py,*.cc,*.sh,*.java exec ":call SetTitle()"
func SetTitle()
if expand("%:e") == 'sh'
call setline(1, "#!/bin/bash")
call setline(2,"##############################################################")
call setline(3, "# File Name:".expand("%"))
call setline(4, "# Version:V1.0")
call setline(5, "# Author:wh")
call setline(6, "# Desc:")
call setline(7,"##############################################################")
endif
endfunc
#新增sh的时候,就会有默认的备注
[root@m01 /server/scripts/devops-shell]# cat 1.sh
#!/bin/bash
##############################################################
# File Name:1.sh
# Version:V1.0
# Author:wh
# Desc:
##############################################################
四、shell脚本执行方式
1.概述
应用 | 说明 |
---|---|
通过sh或bash | 书写脚本后,最常用的方式 在其他非红帽系统中,建议使用bash运行脚本 |
通过. (点)或source | 加载/生效配置文件(环境变量,别名) 常用:可以用来实现include功能,把其他脚本引入到剧本中 |
通过相对或绝对路径 | 我们一般不推荐使用这种,一般都是系统脚本/服调用的脚本,脚本需要加上执行权限才能用 |
输入重定向符号 | 不推荐使用. |
2.详解
2.1 sh或bash
[root@m01 /server/scripts/devops-shell]# cat show_hostname.sh
#!/bin/bash
##############################################################
# File Name:show_hostname.sh
# Version:V1.0
# Author:wh
# Desc:
##############################################################
hostname
[root@m01 /server/scripts/devops-shell]# sh show_hostname.sh
m01
2.2 .或source
[root@m01 /server/scripts/devops-shell]# . show_hostname.sh
m01
2.3 相对或绝对路径
给脚本加上执行权限
系统/服务调用某个脚本的时候这样用
[root@m01 /server/scripts/devops-shell]# chmod +x show_hostname.sh
[root@m01 /server/scripts/devops-shell]# ./show_hostname.sh
m01
2.4 使用重定向符号执行脚本
[root@m01 /server/scripts/devops-shell]# sh < show_hostname.sh
m01
3. #! 符号定义
并非注释的意思,写在脚本开头
用于指定脚本默认的命令解释器
命令解释器 | 写法 |
---|---|
bash | #!/bin/bash |
python | #!/usr/bin/python2 或 /usr/bin/env python2 |
五、变量
1.概述
变量variable变化
查看变量内容 $变量名字
#变量定义
[root@m01 ~]# var=test
#变量取值
[root@m01 ~]# echo $var
test
关于变量的本质:
变量内存中的一块空间,变量名字--->内存空间地址
2.变量命名
变量命名要求:
1.不能以数字开头
2.不能以特殊符号开头,可以以"_"开头
3.推荐字母开头
变量的命名方式;
- 驼峰方式
- 现代式:单词(小写)+ "_下划线"连接
推荐
3. 变量分类
分类 | 说明 |
---|---|
普通变量(局部变量) | 我们在脚本中通过var=形式创建就是普通变量 |
环境变量(全部变量) | 一般都是系统创建的,PATH |
特殊变量 | shell脚本,命令 |
3.1 普通变量
[root@m01 ~]# var=test
[root@m01 ~]# echo $var
test
温馨提示:
$与${} 一致,可以用于取值
$变量
${变量} 指定变量名字
3.2 环境变量
全局变量,1处定义,处处使用
大部分都是系统定义
env #可以查看系统的变量
export
declare
环境变量名字 | 含义 | 应用场景 |
---|---|---|
PATH | 记录命令位置的环境变量,运行命令的时候bash会在PATH的 路径中查找 | 通过二进制包或编译安装软件, 增加新的命令路径 |
LANG | 系统语言与字符集 Language 中文 LANG=zh_CN.UTF8 LANG=en_US.UTF8 | 修改语言字符集 |
PS1 | 命令行格式 | 修改命令行格式,生产环境不推 荐修改. |
UID或EUID | 用户的uid,用于判断当前用户是否为root | 用于脚本判断用户是否root. |
HOSTNAME | 主机名 | |
history命令 历史命令相关 | ||
HISTSIZE | history 命令记录最多多条指令, 生产环境尽量少 | |
HISTFILESIZE | history 历史记录文件的大小 ~/.bash_history 生 产环境尽量少 | |
HISTCONTROL | 控制历史命令记录或不记录哪些内容 生产环境 ignorespace 以空格开头的命令 不记录 | |
HISTFILE | 指定历史命令的记录文件的名字和位置.默认当前用户家目 录 .bash_history | 未来安全优化配置 或 手写跳 板机/行为审计 |
IFS | 类似于awk -F 指定分隔符(指定每一列的分隔符) | 一般与循环配合读取文件内容 |
TMOUT | 超时自动退出时间 |
3.2.1环境变量相关文件及目录
文件或目录 | 说明 |
---|---|
/etc/profile | 全局生效,存放函数,环境变量。存放别名 |
/etc/bashrc | 全局生效,存放别名。 |
~/.bashrc | 局部生效 |
~/.bash_profile | 局部生效 |
/etc/profile.d/ | 目录,每个用户登录的时候(远程连接与su切换),加载目录下面.sh结尾 的文件. 设置一些登录登录后提示,变 化. |
3.2.2 书写脚本每次用户登录后显示系统的基本信息
分析:
找出每个步骤对应的命令
创建变量,存放命令结果
把变量的结果输出
测试后放在/etc/profile.d/目录下.sh结尾
[root@m01 /server/scripts/devops-shell]# cat login.sh
#!/bin/bash
##############################################################
# File Name:login.sh
# Version:V1.0
# Author:wh
# Desc:
##############################################################
#1.vars
hostname=`hostname`
ips=`hostname -I`
mem_total=`free -m |awk 'NR==2{print $2}'`
mem_ava=`free -m |awk 'NR==2{print $NF}'`
sys_load=`top -bn1 |awk -F"[ ,]+" 'NR==1{print $(NF-2),$(NF-1),$NF}'`
#2.print
cat <<EOF
主机名: $hostname
ip地址: $ips
总计内存: $mem_total
可用内存: $mem_ava
系统负载: $sys_load
EOF
#拷贝脚本到/etc/profile或者做软链接过去
[root@m01 ~]# ll /etc/profile.d/login.sh
-rw-r--r-- 1 root root 531 Feb 23 11:24 /etc/profile.d/login.sh
[root@m01 /server/scripts/devops-shell]# su - root
Last login: Thu Feb 23 11:24:15 CST 2023 from 10.0.0.1 on pts/1
主机名: m01
ip地址: 10.0.0.61 172.16.1.61
总计内存: 972
可用内存: 619
系统负载: 0.00 0.01 0.05
补充:
这个脚本有点小问题,希望只有登录后提示,切换用户的时候不要提示。
判断两个变量是否存在即可,存在表示远程登录.不存在就切换用户. SSH_CLIENT=10.0.0.1 3399 22 SSH_TTY=/dev/pts/ [root@m01 /server/scripts/devops-shell]# env|grep SSH_CLIENT SSH_CLIENT=10.0.0.1 54969 22
3.3特殊变量
特殊变量分类 |
---|
位置相关的特殊变量 |
状态相关的特殊变量 |
变量子串 |
变量扩展 |
3.3.1位置变量
位置的特殊变量 | 含义 | 应用场景 |
---|---|---|
$n(数字) | 脚本的第n个参数 | 取出脚本所有参数 |
$0 | 脚本的名字 | 用于输出脚本的格式或帮助的时候。用于错误提示输出帮 助。 |
$# | 脚本参数的个数 | 一般与判断结合,检查脚本参数个数。 |
$@ | 取出脚本所有参数 | 数组中或循环中。 |
$* | 取出脚本所有参数 | 数组中或循环中。 |
3.3.1.1 $n
[root@m01 /server/scripts/devops-shell]# cat vars.sh
#!/bin/bash
##############################################################
# File Name:vars.sh
# Version:V1.0
# Author:wh
# Desc:
##############################################################
echo "脚本第1个参数:$1"
echo "脚本第2个参数:$2"
echo "脚本参数个数:$#"
[root@m01 /server/scripts/devops-shell]# sh vars.sh 1 2
脚本第1个参数:1
脚本第2个参数:2
脚本参数个数:2
#案例:执行脚本的时候输入用户名,判断用户名是否存在
[root@m01 /server/scripts/devops-shell]# cat check_user.sh
#!/bin/bash
##############################################################
# File Name:check_user.sh
# Version:V1.0
# Author:wh
# Desc: 判断用户存不存在
##############################################################
user=$1
#判断是否存在
id $user
#
echo "提示:出现uid,gid表示存在,出现no such表示不存在"
[root@m01 /server/scripts/devops-shell]# sh check_user.sh test
id: test: no such user
提示:出现uid,gid表示存在,出现no such表示不存在
[root@m01 /server/scripts/devops-shell]# sh check_user.sh root
uid=0(root) gid=0(root) groups=0(root)
提示:出现uid,gid表示存在,出现no such表示不存在
3.3.1.2 $n n大于9 会有什么问题 面试题
$10
大于9后,会表示$1+0
需要使用${}
[root@m01 /server/scripts/devops-shell]# cat 10.sh
#!/bin/bash
##############################################################
# File Name:10.sh
# Version:V1.0
# Author:wh
# Desc:
##############################################################
echo $1 $2 $3 $4 $5 $10 $11
echo $1 $2 $3 $4 $5 ${10} ${11}
[root@m01 /server/scripts/devops-shell]# sh 10.sh {a..z}
a b c d e a0 a1
a b c d e j k
3.3.1.3 $0
#案例:如果脚本执行出错了,需要我们输出脚本的使用帮助
[root@m01 /server/scripts/devops-shell]# cat scripts_name.sh
#!/bin/bash
##############################################################
# File Name:scripts_name.sh
# Version:V1.0
# Author:wh
# Desc:
##############################################################
echo "help: $0 {start|stop}"
[root@m01 /server/scripts/devops-shell]# sh scripts_name.sh
help: scripts_name.sh {start|stop}
#案例:判断脚本参数的格式,如果不等于1,则输出使用提示
[root@m01 /server/scripts/devops-shell]# cat check_param.sh
#!/bin/bash
##############################################################
# File Name:check-param.sh
# Version:V1.0
# Author:wh
# Desc: 判断参数是否为1个
##############################################################
if [ $# -ne 1 ];then
echo "help: $0 {该脚本只需要一个参数}"
exit 6
fi
echo "脚本正常运行。。。。"
[root@m01 /server/scripts/devops-shell]# sh check_param.sh 1
脚本正常运行。。。。
[root@m01 /server/scripts/devops-shell]# sh check_param.sh 1 2
help: check_param.sh {该脚本只需要一个参数}
3.3.1.4 $# $@ $*
#案例:输出脚本所有参数,输出脚本参数个数
[root@m01 /server/scripts/devops-shell]# sh print_all_args.sh {a..z}
脚本参数个数: 26
脚本所有参数: 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
补充:
$@与$*的区别:仅仅在加上双引号后才有区别
符号 共同点 区别 $@ 取出脚本所有的参数 加上双引号 会识别 合并在一起的参数,独立参数,正常的理解 $@ 取出脚本所有的参数 加上双引号 所有参数合并为1个参数 [root@m01 /server/scripts/devops-shell]# set "this is test" test1 test2 [root@m01 /server/scripts/devops-shell]# for i in "$*" > do > echo $i > done this is test test1 test2 [root@m01 /server/scripts/devops-shell]# for j in "$@" > do > echo $j > done this is test test1 test2
3.3.2 状态变量
特殊符号 | ||
---|---|---|
$? | 上一个命令、脚本的返回值,0表示正确,非0即错误. | 一般与判断检查命令 结果。 |
$$ | 当前脚本的pid | 一般写在脚本中获取 脚本pid. |
$! | 上一个脚本/命令(持续运行)的pid | |
$_ | 上一个命令的最后一参数,其实下划线是个环境变量,记录了上一个命令、脚本的 最后一个参数. 使用esc+ .(点) |
3.3.2.1 案例:输入任何一个命令并执行,检查这个命令的执行结 果是否正确。
[root@m01 /server/scripts/devops-shell]# cat check_cmd.sh
#!/bin/bash
##############################################################
# File Name:check_cmd.sh
# Version:V1.0
# Author:wh
# Desc: 检查输入的命令是否执行成功
##############################################################
cmd="$*"
if [ $# -ne 1 ];then
echo "help: $0 {该脚本只需要一个参数}"
exit 6
fi
#执行命令
$cmd &>/dev/null
#判断
if [ $? -eq 0 ];then
echo "$cmd 运行成功"
else
echo "$cmd 运行失败"
fi
[root@m01 /server/scripts/devops-shell]# sh check_cmd.sh ls
ls 运行成功
[root@m01 /server/scripts/devops-shell]# sh check_cmd.sh aaa
aaa 运行失败
3.3.3 变量子串
变量子串 parameter expension变量扩展 格式
${变量},写为$变量形式无法识别
作用:用于对变量处理。(统计变量中字符串数量,对变量内容进行替换,删除。。。)
应用:可以不用,如果使用效率高,格局打开.
变量子串 parameter表示变量名字 | 含义 |
---|---|
基础 | |
${paramter} $para | 变量取值 |
\${#paramter} |
统计字符长度(变量中有多少个字符) |
删除(开头,结尾) | word表示要删除的内容 |
$ | 从变量左边开始删除,按照最短匹配删除 |
$ | 从变量左边开始删除,按照最长匹配删除 |
$ | 从变量右边开始删除,按照最短匹配删除 |
$ | 从变量右边开始删除,按照最长匹配删除 |
截取(切片) 类似于 cut -c | |
$ | 从下标是5字符开始向后截取 |
$ | 从下标是5字符开始向后截取2个字符 |
替换 阉割版的sed | |
$ | 把word替换为replace 仅替换第1个 |
$ | word替换为replace 替换全部 |
3.3.3.1 统计字符串长度
[root@m01 /server/scripts/devops-shell]# var=test
[root@m01 /server/scripts/devops-shell]# echo ${#var}
4
3.3.3.2 删除变量中的内容
[root@m01 /server/scripts/devops-shell]# var=testtest123123
[root@m01 /server/scripts/devops-shell]# echo ${var#test}
test123123
[root@m01 /server/scripts/devops-shell]# echo ${var##test}
test123123
[root@m01 /server/scripts/devops-shell]# echo ${var#*t}
esttest123123
[root@m01 /server/scripts/devops-shell]# echo ${var##*t}
123123
3.3.3.3 截取
[root@m01 /server/scripts/devops-shell]# var=testtest123123
[root@m01 /server/scripts/devops-shell]# echo ${var:4}
test123123
[root@m01 /server/scripts/devops-shell]# echo ${var:4:4}
test
[root@m01 /server/scripts/devops-shell]# echo ${var:4:5}
test1
3.3.3.4 替换
[root@m01 /server/scripts/devops-shell]# var=testtest123123
[root@m01 /server/scripts/devops-shell]# echo ${var/t/-}
-esttest123123
[root@m01 /server/scripts/devops-shell]# echo ${var//t/-}
-es--es-123123
3.3.3.5 面试题:要求:bash for循环打印下面这句话中字母数不大于6的单词
[root@m01 /server/scripts/devops-shell]# cat for.sh
#!/bin/bash
##############################################################
# File Name:for.sh
# Version:V1.0
# Author:wh
# Desc:
##############################################################
str="I am wh welcome to Study Linux"
for word in $str
do
if [ ${#word} -le 6 ];then
echo ${word}
fi
done
[root@m01 /server/scripts/devops-shell]# sh for.sh
I
am
wh
to
Study
Linux
#awk书写
[root@m01 /server/scripts/devops-shell]# echo "I am wh welcome to Study Linux"|xargs -n1|awk 'length($1)<=6'
I
am
wh
to
Study
Linux
#length() awk函数用于统计某一列或整行的字符数量
[root@m01 /server/scripts/devops-shell]# echo "I am wh welcome to Study Linux"|awk -vRS="[ .]" 'length($1)<=6'
I
am
wh
to
Study
Linux
补充:
# eq # ne # lt less than < # le less equal <= # gt great than > # ge great equal >=
3.4 变量扩展
格式 | 含义 |
---|---|
$ | 变量parameter没定义或为空,把word作为默认值,不修改变量内容(输出) |
$ | 变量parameter没定义或为空,把word作为默认值,修改变量内容 |
$ | 变量parameter没定义或为空,显示word,错误输出 |
$ | 变量parameter没定义或为空,则啥也不做,否则把word替换变量内容 |
4. 变量赋值
4.1 变量赋值语句
赋值方法 | 格式 | 应用场景 |
---|---|---|
直接赋值 | var=test | 大部分时候使用 |
命令结果赋值 | hostname=hostname |
获取命令的结果`` 或$() |
脚本传参(通过脚本命令行传参进行赋 值) | user_name=$1 脚本的第1个参 数 | 一般用于命令行内容传入脚本中. 不想设置太多交 互. |
read交互式赋值 | 通过read命令实现 | 与用户有个交互过程. |
读取文件内容赋值给变量 | 脚本读取文件的时候使用. |
4.1.1 read
read通过交互式的方式进行赋值 | |
---|---|
-p | 交互的时候提示信息。 |
-t | 超过这个时间没有操作,则自动退出. |
-s | 不显示用户的输入.记录密码才用. |
[root@m01 /server/scripts/devops-shell]# cat read.sh
#!/bin/bash
##############################################################
# File Name:read.sh
# Version:V1.0
# Author:wh
# Desc:
##############################################################
read -p "请输入手机号:" phone
echo "您输入的手机号是:"$phone
[root@m01 /server/scripts/devops-shell]# sh read.sh
请输入手机号:123456
您输入的手机号是:123456
标签:shell,Linux,编程,devops,sh,scripts,m01,root
From: https://www.cnblogs.com/world-of-yuan/p/17169451.html