1.shell基本介绍
- shell是一个命令解释器,主要用来接受用户的指令,进入驱动操作系统或硬件。
- shell存在交互和非交互。
- shell脚本:
- 将系统命令堆积在一起,顺序执行(简称:系统命令堆积)
- 特定的格式+特定的语法+系统的命令=文件(shell脚本文件)
2.shell的书写方式
- shell脚本名称以.sh结尾
- shell脚本的格式(建议首行为 #!/bin/bash、#!/usr/bin/bash)
- shell脚本添加一些注释
[root@manager ~]# cat .vimrc #添加该文件自动生成申明
set nocompatible
set history=100
filetype on
filetype plugin on
filetype indent on
set autoread
set mouse=c
syntax enable
set cursorline
hi cursorline guibg=#00ff00
hi CursorColumn guibg=#00ff00
set foldenable
set foldmethod=manual
set foldcolumn=0
setlocal foldlevel=3
set foldclose=all
nnoremap <space> @=((foldclosed(line('.')) < 0) ? 'zc' : 'zo')<CR>
set expandtab
set tabstop=4
set shiftwidth=4
set softtabstop=4
set smarttab
set ai
set si
set wrap
set sw=4
set wildmenu
set ruler
set cmdheight=1
set lz
set backspace=eol,start,indent
set whichwrap+=<,>,h,l
set magic
set noerrorbells
set novisualbell
set showmatch
set mat=4
set hlsearch
set ignorecase
set encoding=utf-8
set fileencodings=utf-8
set termencoding=utf-8
set smartindent
set cin
set showmatch
set guioptions-=T
set guioptions-=m
set vb t_vb=
set laststatus=4
set pastetoggle=<F9>
set background=dark
highlight Search ctermbg=black ctermfg=white guifg=white guibg=black
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: lemontree")
call setline(6, "# Organization: 1829836123@163.com")
call setline(7, "##############################################################")
endif
endfunc
3.shell执行方式
首行添加 #!/usr/bin/bash 的作用
- 不添加:
- 默认 ./ 运行时,系统调用 bash 运行
- 缺点:如果为其他语言脚本,则会报错
- 添加:
- ./ 运行时根据首行调用解释器
- 直接调用解释器运行
- python check_shell.sh
- bash check_shell.sh
4.shell变量
- 变量:以一个固定的字符串表示一个不固定的值
- 变量的命题规范
- 命题规范:以字母开头,由字母数字下划线组成。
- 定义:变量名=变量值。a=123
- 变量的几种定义方式
- 用户自定义变量,自己使用
[root@manager ~]# var="hello world“ #定义变量
[root@manager ~]# echo $var #调用变量
#使用{}的区别
[root@manager ~]# echo $var_log
[root@manager ~]# echo ${var}_log
hello world_log
#单引号与双引号的区别
[root@manager ~]# echo "$var is good" #双引号解析$
hello world is good
[root@manager ~]# echo '$var is good' #不会解析
$var is good
- 系统环境变量,所有用户都可以使用
[root@manager ~]# cat check_env.sh
#!/bin/bash
##############################################################
# File Name: chech_env.sh
# Author: lemontree
# Organization: 1829836123@qq.com ##############################################################
echo "用户家目录: $HOME"
echo "当前主机名: $HOSTNAME"
echo "当前所在目录: $PWD"
echo "当前SSH连接: $SSH_CONNECTION"
echo "当前用户: $USER"
echo "当前用户UID: $UID"
- 位置参数变量
[root@manager ~]# cat var_param.sh
#!/bin/bash
echo "#当前shell的脚本文件名: $0"
echo "#第1个shell脚本位置参数: $1"
echo "#第2个shell脚本位置参数: $2"
echo "#第3个shell脚本位置参数: $3"
echo "#所有传递的参数为一个整体: $*"
echo "#所有传递的参数分别为: $@"
echo "#传递的参数个数为: $#"
echo "#当前程序运行的PID为: $$"
echo "#上一个命令执行的返回结果: $?"
[root@manager ~]# sh var_param.sh 11 22 33 44
[root@manager ~]# vim creat_usr.sh
#!/bin/bash
##############################################################
# File Name: chech_env.sh
# Author: lemontree
# Organization: 1829836123@qq.com ##############################################################
#判断是否为root用户
if [ $UID -ne 0 ];then
echo "$USER 没有权限"
exit
fi
#判断传递参数是否满足
if [ $# -ne 2 ];then
echo "请输入 username passwd"
exit
fi
#添加用户
useradd $1
echo "$2" | passwd --stdin $1
- 变量赋值方式
[root@manager ~]# vim read_1.sh
#!/bin/bash
##############################################################
# File Name: chech_env.sh
# Author: lemontree
# Organization: 1829836123@qq.com ##############################################################
read -p "Login:" acc
read -s -t10 -n6 "passwd:" pw
#-s 不显示输入,-n指定字符个数,-t超时时间秒
echo "Login: $acc passwd: $pw"
[root@manager ~]# sh read_1.sh
#模拟登陆界面
[root@manager ~]# vim read_2.sh
#!/bin/bash
##############################################################
# File Name: chech_env.sh
# Author: lemontree
# Organization: 1829836123@qq.com ##############################################################
hostnamectl | awk -F ':' '/Sytem/ {print $2}'
echo "Kernel $(uname -r) an $(uname -m)"
echo ""
read -p "$(hostname) lgoin:" acc
read -s -p "Passwd:" pw
echo ""
echo "Login: $acc Passwd: $pw"
#备份脚本,传递两个参数,源和目标
[root@manager ~]# vim read-3.sh
##############################################################
# File Name: chech_env.sh
# Author: lemontree
# Organization: 1829836123@qq.com ##############################################################
read -p "要备份的文件或目录路径是:" src
read -p "要备份到的目录是:" dest
read -p "你确定将 $src 备份到 $dest 吗? [y | n]" action
if [$action == "y"];then
cp -rp $src $dest
echo "备份成功"
else
echo "备份退出"
exit
fi
#探测主机IP地址是否存活
[root@manager ~]# vim read-4.sh
##############################################################
# File Name: chech_env.sh
# Author: lemontree
# Organization: 1829836123@qq.com ##############################################################
read -p "请输入IP地址:" Ip
ping -c2 $Ip &>/dec/null
if [ $? -eq 0 ];then
echo "$Ip存活"
else
echo "$Ip 不存活
fi
#修改主机名的脚本
[root@manager ~]# vim read-5.sh
##############################################################
# File Name: chech_env.sh
# Author: lemontree
# Organization: 1829836123@qq.com ##############################################################
Host_Name=$(hsotname)
echo "当前系统名是:$Host_Name"
read -p "请输入系统名修改为:" New_Name
read -p "确定将 $Host_Name 修改为 $New_Name 吗?[y|n]" action
if [ $action == "y" ];then
hostnamctl set-hostname ${New_Name}
echo "已修改"
else
echo "未修改"
- 变量的替换
| 变量 | 说明 |
|–|--|
| ${变量#匹配规则} | 从头开始匹配,最短删除 |
| ${变量##匹配规则} | 从头开始匹配,最长删除 |
| ${变量%匹配规则} | 从尾开始匹配,最短删除 |
| ${变量%%匹配规则} | 从尾开始匹配,最长删除 |
| ${变量/旧字符串/新字符串} | 只替换第一个旧字符串为新字符串 |
| ${变量//旧字符串/新字符串} | 全部替换变量中旧字符串为新字符串 |
#与##
[root@web01 ~]# url=www.sina.com.cn
[root@web01 ~]# echo ${url}
www.sina.com.cn
[root@web01 ~]# echo ${url#*.}
sina.com.cn
[root@web01 ~]# echo ${url#*.*.}
com.cn
[root@web01 ~]# echo ${url##*.}
cn
[root@web01 ~]# echo ${url%.*}
www.sina.com
[root@web01 ~]# echo ${url%.*.*}
www.sina
[root@web01 ~]# echo ${url%%.*}
www
# /与 //
[root@web01 ~]# echo ${url}
www.sina.com.cn
[root@web01 ~]# echo ${url/sina/SINA}
www.SINA.com.cn
[root@web01 ~]# echo ${url//c/C}
www.sina.Com.Cn
- 变量的运算
|操作符 | 含义 |
|–|--|
| + | 加 |
| - | 减 |
| * | 乘 |
| / | 除 |
| % | 取余 |
[root@web01 ~]# num1=10
[root@web01 ~]# num2=20
[root@web01 ~]# expr $num1 + $num2
30
[root@web01 ~]# echo $(( $num1 + $num2 ))
30
[root@web01 ~]# echo $[ $num1 + $num2 ]
30
[root@web01 ~]# echo $[ $num1 - $num2 ]
-10
[root@web01 ~]# echo $[ $num1 * $num2 ]
200
[root@web01 ~]# echo $[ $num1 / $num2 ]
0
[root@web01 ~]# echo "This is $(date +%Y) year"
This is 2020 year
[root@web01 ~]# echo "This is $(( $(date +%Y) +1 )) year"
This is 2021 year
[root@web01 ~]# cat vars-2.sh #!/bin/bash
##############################################################
# File Name: chech_env.sh
# Author: lemontree
# Organization: 1829836123@qq.com ##############################################################
echo "今年已经过了 $(date +%j) days"
echo "今年已经过了 $(( $(date +%j) /7 )) weeks"
echo "今年新年还剩多少周 $(( ( 365 - $(date +%j) ) /7 )) weeks"
[root@web01 ~]# cat vars-3.sh
##############################################################
# File Name: chech_env.sh
# Author: lemontree
# Organization: 1829836123@qq.com ##############################################################
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 ))