Skip to content

Shell 代码片段

read 读取用户输入

bash
read -p "是否重启 celery 服务?[yes/no]:" celery_yes
if [[ "$celery_yes" == "yes" ]]; then
    ssh popop supervisorctl restart celery
    ssh popop supervisorctl restart celerybeat
fi

字符串分割得到数组

bash
#!/bin/bash

str="a,b,c"
lst=(${str//,/ })

echo ${lst[@]}              # a b c
echo ${lst[0]} ${lst[1]}    # a b
  • 核心是括号里头的 //,/ ,注意后面有一个空格

删除匹配的前缀

bash
#!/bin/bash

str="what is your name?"
echo ${str#* }      # is your name?
echo ${str##* }     # name?
  • # 最短匹配
  • ## 最长匹配
  • man bash 文档中搜索 ## 可查询到此方法的介绍

随机数

bash
#!/bin/bash

# 1~10 之间的随机数
num=$((RANDOM % 10 + 1))
echo $num
  • 核心是 RANDOM

指定循环次数

seq

bash
#!/bin/bash

for i in $(seq 10); do
    echo $i
done
  • 核心:seq 命令打印出一串有序的数字

使用{..}

bash
#!/bin/bash

for i in {1..10}
do
    echo $i
done

for(;;)

bash
#!/bin/bash

for ((i=1; i<=10; i++))
do
    echo $i
done

格式化日期时间

bash
#!/bin/bash

echo "`date +%Y%m%d_%H%M%S`"    # 20240229_174515
echo "`date +%H%M`"             # 1745

=~ 多值判断

bash
if [[ "$ACTION" =~ [start|stop|restart] ]]; then
    echo $ACTION
fi

自增

bash
((i++))
  • 需要双括号

算术运算

bash
#!/bin/bash

a=5
b=2
echo $(($a+$b))     # 7
echo $(($a-$b))     # 3
echo $(($a*$b))     # 10
echo $(($a/$b))     # 2
echo $(($a%$b))     # 1

数组的定义与遍历

bash
#!/bin/bash

arr=(a b c)

for item in ${arr[@]}
do
    echo $item
done

# 获取第一个元素
echo ${arr[0]}      # a

# 获取数组长度
echo ${#arr[@]}     # 3
  • Bash Shell 只支持一维数组,不支持多维数组

case 用法

bash
case "$ACTION" in
    start)
        start
    ;;
    stop)
        stop
    ;;
    restart)
        stop
        start
    ;;
    *)
        usage
    ;;
esac

函数的定义与调用

bash
#!/bin/bash

test_func() {
    echo $1
    echo $2
}

test_func a 100