Shell 编程常用代码块之一

日志

定义日志的颜色

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/bin/bash

_COLORS=${BS_COLORS:-$(tput colors 2>/dev/null || echo 0)}
__detect_color_support() {
if [ $? -eq 0 ] && [ "$_COLORS" -gt 2 ]; then
RC='\033[1;31m'
GC='\033[1;32m'
BC='\033[1;34m'
YC='\033[1;33m'
EC='\033[0m'
else
RC=""
GC=""
BC=""
YC=""
EC=""
fi
}
__detect_color_support
echoerror() {
printf "${RC} * ERROR${EC}: %s\\n" "$@" 1>&2;
}
echoinfo() {
printf "${GC} * INFO${EC}: %s\\n" "$@";
}
echowarn() {
printf "${YC} * WARN${EC}: %s\\n" "$@";
}

# 使用示例
echoinfo "Hello World"
echowarn "Hello World"
echoerror "Hello World"

常见的条件判断

判断目录是否存在

1
2
3
4
5
6
7
8
9
#!/bin/bash

LOGS_PATH="/tmp/logs/blog"

if [ ! -d "$LOGS_PATH" ]; then
echo "目录不存在"
else
echo "目录已存在"
fi

判断操作系统类型

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash

_OS_LINUX="Linux"
_OS_INFO=`uname -a`

if [[ $_OS_INFO =~ $_OS_LINUX ]]
then
echo "Linux 操作系统"
else
echo "非 Linux 操作系统"
fi

判断是否为 Root 用户

1
2
3
4
5
#!/bin/bash

if [ $UID -ne 0 ]; then
echo "非 Root 用户!"
fi

执行脚本

执行指定的 Shell 脚本文件

使用 Linux 命令,执行指定的 Shell 脚本文件

1
sh date.sh

执行指定的 Shell 脚本内容

使用 Linux 命令,执行指定的 Shell 脚本内容

1
sh -c "echo 现在的时间:`date '+%Y-%m-%d %H:%M:%S'`"

获取 Linux 命令的执行结果

1
2
3
4
#!/bin/bash

date_str=$(date)
echo $date_str

执行字符串里的 Shell 脚本内容

1
2
3
4
#!/bin/bash

UPDATE_SYSTEM_DYNAMIC_LIBS=0
echo "### 是否更新系统的动态链接库: `[[ $UPDATE_SYSTEM_DYNAMIC_LIBS -eq 1 ]] && echo '是' || echo '否'`"

程序运行状态

获取应用的进程数

1
2
3
4
5
6
7
8
#!/bin/bash

# 应用的名称
program_name="dockerd"

# 精确统计应用正在运行的进程数量
count=`ps -aux | grep -w "$program_name" | grep -v grep | wc -l`
echo $count

获取应用的进程 ID

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash

# 应用的名称
program_name="dockerd"

# 精确获取应用正在运行的进程ID(应用同时运行了多个实例时,会有多个值,返回数组)
process_ids=`ps -aux | grep -w "$program_name" | grep -v grep | awk '{print $2}'`

# 判断进程ID是否为空
if [ ! -n "$process_ids" ]; then
echo "$program_name 没有运行"
else
# 数组转字符串
process_ids_str=`echo $process_ids`
echo "$program_name 已经有实例正在运行,PID 是 ${process_ids_str/ /, }"
fi

日期处理

判断是否为周末

1
2
3
4
5
6
7
#!/bin/bash

if [[ $(date +%u) -gt 5 ]]; then
echo "今天是周末"
else
echo "今天不是周末"
fi

判断今天是星期几

1
2
3
4
5
#!/bin/bash

# 值的范围是1 ~ 7,其中 1 表示星期一
DOW=$(date +%u)
echo $DOW

文件处理

读取 ini 配置文件

提示

  1. ini 配置文件的格式介绍,可以参考这里
  2. ini 配置文件的后缀名不一定必须是 .ini,也可以是 .cfg.conf 或者是 .txt
  • config.ini 配置文件的内容
1
2
3
4
5
[Server1]
ip = 127.0.0.1

[Server2]
ip = 192.168.1.1
  • example.sh 脚本的内容
1
2
3
4
5
6
7
8
9
10
11
function __readINI() {
INIFILE=$1; SECTION=$2; ITEM=$3
_readContent=`awk -F '=' '/\['$SECTION'\]/{a=1}a==1&&$1~/'$ITEM'/{print $2;exit}' $INIFILE`
echo ${_readContent}
}

_IP1=( $( __readINI config.ini Server1 ip ) )
_IP2=( $( __readINI config.ini Server2 ip ) )

echo ${_IP1}
echo ${_IP2}
  • 脚本执行后输出的结果
1
2
127.0.0.1
192.168.1.1

FFmpeg 批量压缩 MP4 文件

请确保将 /path/to/your/directory 替换为 MP4 文件所在的目录路径。此脚本将使用 FFmpeg 将每个 MP4 文件压缩为 H.264 视频编解码器和 AAC 音频编解码器,并将压缩后的文件保存在原始目录中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/bash

# 设置目录路径
directory="/path/to/your/directory"

# 遍历目录下的所有MP4文件
for file in "$directory"/*.mp4; do
# 获取文件名和扩展名
filename=$(basename "$file")
extension="${filename##*.}"

# 创建输出文件名
output_filename="${filename%.*}_compressed.${extension}"

# 使用FFmpeg进行压缩
ffmpeg -i "$file" -c:v libx264 -crf 23 -c:a aac -b:a 128k "$directory/$output_filename"

# 输出压缩完成的消息
echo "已压缩文件: $filename -> $output_filename"
done