变量

创建变量
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
    分支代码
fi
case语句
case 变量引用 in
1)
    分支代码
    ;;
2)
    分支代码
    ;;
*)
    默认分支
    ;;
esac
 

case从通配符
  
* 任意长度任意字符
? 任意长度单个字符
[] 指定范围内的单个字符
|  或者,例如a|b

循环

for循环
for 变量名 in 列表 ; do
    循环体
done
while循环

while循环当条件满足时执行,条件不满足时则结束。

while 条件 ; do
    循环体
done
while单行写法
while true;do echo "hi!";sleep 1;done
while特殊用法
while read 变量 ; do
    循环体
done < /PATH/FILE
  
依次读取文件中的每一行,并将行赋值给变量
until循环

until循环当条件不满足时执行,条件满足后停止

until  条件 ; do
    循环体
done
select语句 创建菜单
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##*/}

一直匹配到最后一个/(贪婪模式)。并全部删除,即可保留文件名。

标签: SHELL

添加新评论