SHELL语法
变量
创建变量
u_text="文本输出"使用变量
${u_text}赋值变量并使用
u_text="文本输出"
echo ${u_text}
#使用echo命令输出变量的值判断
数值判断
-eq 是否等于
-ne 是否不等于
-gt 是否大于
-ge 是否大于等于
-lt 是否小于
-le 是否小于等于字符串判断
-z 变量 字符串是否为空或变量未定义,若未空则True,若不是空的为False。
-n 变量 字符串是否有内容,有内容则True,没有内容或变量未定义则为False。
变量 = 变量 是否内容相同,相同则True,不同则False
变量 != 变量 是否内容不同,不同则True,相同则False文件判断
-r FILE 是否存在且可读
-w FILE 是否存在且可写
-x FILE 是否存在且可执行
-u FILE 是否存在且拥有suid权限
-g FILE 是否存在且拥有sgid权限
-k FILE 是否存在且拥有sticky权限交互
获取键盘输入
read 参数 变量
参数-p
read -p "Please input your name:" NAME
键盘输入值将赋值给"NAME"变量流程控制
if语句
if 判断条件 ; then
分支代码
elif
分支代码
else
分支代码
ficase语句
case 变量引用 in
1)
分支代码
;;
2)
分支代码
;;
*)
默认分支
;;
esac
case从通配符
* 任意长度任意字符
? 任意长度单个字符
[] 指定范围内的单个字符
| 或者,例如a|b循环
for循环
for 变量名 in 列表 ; do
循环体
donewhile循环
while循环当条件满足时执行,条件不满足时则结束。
while 条件 ; do
循环体
donewhile单行写法
while true;do echo "hi!";sleep 1;donewhile特殊用法
while read 变量 ; do
循环体
done < /PATH/FILE
依次读取文件中的每一行,并将行赋值给变量until循环
until循环当条件不满足时执行,条件满足后停止
until 条件 ; do
循环体
doneselect语句 创建菜单
select 变量 in 项目1 项目2 ;do
case $REPLY in
1)
分支代码
;;
2)
分支代码
;;
*)
默认代码
;;
esac
done项目之间空格隔开
用于创建菜单,等待用户输入。
按输入的数字,执行对应的命令。
select是一个无线循环,要用break推出循环,或输入exit命令退出。
select语句外定义PS3="请输入序号执行操作:" 可修改提示符的文字。
用变量保存菜单
u_menu='
菜单1
菜单2
菜单3
菜单4
菜单5
'
select m in ${u_menu} ;do
...省略
循环控制语句
continue
结束当此循环,直接进行下一次。break
执行到这里直接提前退出循环,不再执行。shift
用于将参数列表左移指定的次数,不指定次数则左移1次。批量创建用户脚本
#!/bin/bash
while [ "$1" ] ;do
useradd $1 && echo $1 is created
shift
done使用带shift的脚本
newuser.sh 用户1 用户2 用户3 用户4
给脚本传入4个参数,一次执行。
每执行一次,便shift一次参数,直到参数为空。函数
创建函数
func_name () {
函数内容
}调用函数
直接执行函数名
func_name
func_name 参数1 参数2函数体内部变量local
local 变量名="xxxx"增加local关键字,变量只在函数体内部有效。
系统初始化配置脚本
disable_selinux () {
sed -i "/^SELINUX=/c SELINUX=disabled" /etc/selinux/config
}
disable_firewall () {
systemctl disable --now firewalld
}
yum_config () {
mkdir /etc/yum.repos.d/backup
mv /etc/yum.repos.d/.* /etc/yum.repos.d/backup
curl http://mirrors.aliyun.com/repo/Centos-8.repo > /etc/yum.repos.d/CentOS-Linux-BaseOS.repo
}
config_network () {
sed -ri '/GRUB_CMDLINE_LINUX=/s#(.*)"$#\1 net.ifnames=0"#' /etc/default/grub
grub2-mkconfig -o /boot/grub2/grub.cfg
}
install_package () {
yum install -y autofs vim tcpdump lrzsz tree wget bzip2 zip unzip lsof rsync mlocate
}
history_with_time () {
cat > /etc/profile.d/env.sh << EOF
export HISTTIMEFORMAT="%F %T "
EOF
}字符串处理
获取字符串长度
截取字符串
char=12345abcde
echo ${char:2:7}
取字符串中第2-7字符。
echo ${char: -3}
注意空格
取倒数3个字符
echo ${char:2:-2}
掐头去尾
echo ${char:2:7}基于模式取字符串
url=http://www.baidu.com/index.html
echo ${url#*www}
.baidu.com/index.html
懒惰模式#*
echo ${url##*/}
index.html
贪婪模式##*
从右向左查找
url=http://www.baidu.com/index.html
echo ${url%/*}
http://www.baidu.com
懒惰模式
剩下网站名称
echo ${url%%:*}
http
贪婪模式
剩下协议名称替换字符
url=http://www.baidu.com:8080/index.html
echo ${url/80/90}
将第一个80换成90,懒惰模式。
结果:
http://www.baidu.com:9080/index.html
echo ${url//80/90}
将2个80都换成90,贪婪模式。
结果:
http://www.baidu.com:9090/index.html删除字符
url=http://www.baidu.com:8080/index.html
echo ${url/80}
删除第一个80,懒惰
echo ${url//80}
删除全部90,贪婪应用示例
nginx_url="http://nginx.org/download/nginx-1.20.2.tar.gz"
wget ${nginx_url}
tar ${nginx_url##*/}
一直匹配到最后一个/(贪婪模式)。并全部删除,即可保留文件名。