Skip to content

应用示例

目录/路径获取

  • 获取脚本所在文件夹的绝对路径
sh
#!/bin/bash
SHELL_FOLDER=$(cd $(dirname $0);pwd)

# 输出
/home/taketo/shell-test
  • 获取当前文件夹的名称
sh
#!/bin/bash
CURDIRNAME=${PWD##*/}

# 执行
taketo@ubuntu:~$ bash shell-test/test.sh
# 输出
taketo
  • 获取脚本所在文件夹的名称
sh
#!/bin/bash
SHELL_FOLDER=$(cd $(dirname $0);pwd)
CURDIRNAME=${SHELL_FOLDER##*/}

# 执行
taketo@ubuntu:~$ bash shell-test/test.sh
# 输出
shell-test
  • 获取脚本所在目录所有文件夹名称
sh
#!/bin/bash
SHELL_FOLDER=$(cd $(dirname $0);pwd)

DIRS=($(ls -l ${SHELL_FOLDER} | awk '/^d/ {print $NF}'))

for DIRECTORY in ${DIRS[*]}; do
    echo $DIRECTORY
done

# 执行
taketo@ubuntu:~/shell-test$ bash test.sh 
# 输出
dir1
dir2

Shell中命令执行

  • 启动程序,保存pid到文件
sh
#!/bin/bash  
./my_program > output.log &  
pid=$!  
echo $pid > pid.txt
  • 关闭程序,删除pid文件
sh
if [ -f "pid.txt" ]; then
    pid=$(cat "pid.txt")
    echo $pid
    kill $pid
    rm -r "pid.txt"
    echo -ne "Stoping Node"
    while true; do
        [ ! -d "/proc/$pid/fd" ] && break
        echo -ne "."
        sleep 1
    done
    echo -ne "\rStopped. \n"
fi
  • 调用子脚本(子脚本中包含read -p)

    • 父脚本
    shell
    #!/bin/bash  
      
    # 定义要运行的子脚本路径
    child_script="/path/to/child_script.sh"  
      
    # expect 工具运行子脚本并传递输入
    # 使用 spawn 命令启动子脚本
    # 使用 expect 命令等待子脚本的特定输出
    # 使用 send 命令将输入发送给子脚本,\n 模拟回车
    # 使用 expect 命令eof 等待子脚本完成
    expect <<EOF
    spawn "$child_script"
    expect "Enter your name: "
    send "Take To\n"
    expect eof
    EOF
    
    # 输出结果  
    echo "Hello, Take To!"
    • 子脚本
    shell
    #!/bin/bash  
      
    read -p "Enter your name: " name  
    echo "Hello, $name!"

检查

  • 检查命令是否存在
sh
check_command(){
    command -v "$1" >/dev/null
    if [ $? -ne 0 ]; then  
        echo "Command not found, please install $1 command and try again."  
        exit 1  
    fi  
}

# 使用
check_command Command
  • 检查命令执行是否成功
sh
check_succeed(){
    # 执行命令并获取其返回值
    eval "$1"
    # 根据返回值判断执行结果
    if [ $? -eq 0 ]; then
        return 0
    else
        echo "Command $1 Execution failed"
        exit 1
    fi
}

# 使用
check_succeed Command
  • 失败重试
sh
retry_command() {
    for i in {1..3}; do
        eval "$1"
        if [ $? -eq 0 ]; then
            return 0
        else
            echo "Command $1 Execution failed"
            echo "retrying $i ..."
            sleep 1
        fi
    done
    
    echo "Command execution failed, retry failed !"
    exit 1
}

# 使用
retry_command Command

获取信息

  • 获取系统信息
sh
cat /etc/os-release | grep -oE "(CentOS|Ubuntu|Debian|Alpine)" | head -1
  • 获取系统信息和版本信息
sh
cat /etc/os-release | grep -oE "(CentOS|Ubuntu|Debian|Alpine).*[^\"]"|sort | head -1
  • 获取系统类型
sh
get_os_type() {
    if [ "$(uname)" == "Darwin" ]; then
      echo "this is Mac"
    elif [ "$(uname)" == "Linux" ];then
      echo "this is Linux"
    else
      echo "unknown"
    fi
}
  • 获取系统架构
sh
get_arch() {
    local arch=`arch`
    if [[ $arch =~ "x86_64" ]];then
        echo "this is x86_64"
    elif [[ $arch =~ "aarch64" ]];then
        echo "this is arm64"
    elif [[ $arch =~ "mips64" ]];then
        echo "this is mips64"
    else
        echo "unknown"
    fi
}

日志/打印

  • 日志输出
sh
LOG_INFO() {
    local content=${1}
    local date=$(date +"%Y-%m-%d %H:%M:%S")
    echo -e "\033[32m$date [INFO] ${content}\033[0m"
}

LOG_ERROR() {
    local content=${1}
    local date=$(date +"%Y-%m-%d %H:%M:%S")
    echo -e "\033[31m$date [ERROR] ${content}\033[0m"
}

# 使用
LOG_INFO Content

LOG_ERROR Content

定时任务

  • 定时执行脚本

在 Unix 和类 Unix 系统中,定时任务通常使用 cron 实现。Cron 是一个时间基础的任务调度器,可以定期执行脚本或命令。 下面是如何在 Unix 或类 Unix 系统中设置定时任务的步骤:

sh
# 确认cron服务开启
systemctl status cron

# 输入 crontab -e 命令来编辑 cron 文件。

# 在编辑器中,你可以添加你的定时任务。Cron 文件的格式如下:
*     *     *   *    *        command to be executed  
-     -     -   -    -  
|     |     |   |    |  
|     |     |   |    +----- day of the week (0 - 6) (Sunday=0)  
|     |     |   +------- month (1 - 12)  
|     |     +--------- day of the month (1 - 31)  
|     +----------- hour (0 - 23)  
+------------- min (0 - 59)

# 在你编辑完成后,保存并退出编辑器。这将自动创建或更新你的 cron 文件。

# 要查看你的 cron 任务列表,可以输入 crontab -l。

TIP

输入 crontab -e 命令来编辑 cron 文件

如果这是你第一次运行这个命令,它可能会问你选择一个编辑器(比如 vim,nano 等)。

如果后面想更改编辑器(比如 vim),可以添加环境变量实现。

sh
export EDITOR=/usr/bin/vim

等待状态显示

  • 处于"/"旋转
sh
#!/bin/sh
sleep 10 &
pid=$! # Process Id of the previous running command

spin='-\|/'

i=0
while kill -0 $pid 2>/dev/null; do
    i=$(((i + 1) % 4))
    printf "\r[${spin:$i:1}]"
    sleep .1
done
  • 进度条前进状态
sh
#!/bin/sh
j=''
for ((i=0;$i<=100;i+=2))
do
    printf "progress:[%-50s]%d%%\r" $j $i
    sleep 0.1
    j=#$j
done
echo
  • 进度条前进+处于"/"旋转
sh
#!/bin/bash
i=0
j='#'
k=('|' '\' '-' '/')
l=0
while [ $i -le 25 ]; do
    printf "progress:[%-25s][%d%%][%c]\r" $j $(($i * 4)) ${k[$l]}
    j+='#'
    let i++
    let l=i%4
    sleep 0.1
done
printf "\n"