# 一.基础语句
# 1.shell 换行
#删除文件换行并自动yes
yes | rm dct-manager-starter-1.0.0-SNAPSHOT.jar0916-1 \
dct-manager-starter-1.0.0-SNAPSHOT.jar0916-2 \
dct-manager-starter-1.0.0-SNAPSHOT.jar0916-3 \
dct-manager-starter-1.0.0-SNAPSHOT.jar0916-4 \
dct-manager-starter-1.0.0-SNAPSHOT.jar0916-5 \
dct-manager-starter-1.0.0-SNAPSHOT.jar0916-6 \
dct-manager-starter-1.0.0-SNAPSHOT.jar0916-7 \
2
3
4
5
6
7
8
# 2.多脚本同时启动的情况
有几种情况下可能需要同时启动多个 sh 脚本:
并行任务处理:当需要同时处理多个任务,而这些任务之间没有相互依赖性时,可以使用多个 sh 脚本同时启动,以加快整体处理速度。
分布式计算:在分布式计算环境中,可能需要在多台计算节点上同时启动多个 sh 脚本,以并行地执行任务,提高计算效率。
批量处理:当需要对多个文件、数据进行批量处理时,可以编写多个 sh 脚本,分别处理不同的文件或数据集。
多个定时任务:在某些情况下,可能需要在同一时间点执行多个定时任务,这时可以编写多个 sh 脚本,并使用定时任务调度工具(如 cron)同时启动这些脚本。
需要同时启动多个 sh 脚本的场景通常涉及到需要并行处理多个任务、提高计算效率或批量处理数据等情况。
要同时启动多个 Shell 脚本(以.sh 为扩展名),你可以使用以下几种方法:
使用后台运行符号&
:
sh script1.sh & sh script2.sh & sh script3.sh &
使用nohup
命令:
nohup sh script1.sh & nohup sh script2.sh & nohup sh script3.sh &
使用xargs
:
echo "script1.sh script2.sh script3.sh" | xargs -n 1 -P 0 sh
这将会同时启动三个脚本,使用-P 0
选项告诉xargs
以并行方式运行命令。
使用parallel
命令:
parallel ::: "sh script1.sh" "sh script2.sh" "sh script3.sh"
这将会同时启动三个脚本。
使用这些方法之一,你可以同时启动多个 Shell 脚本。
# 二.逻辑语句
# 1.遍历时间
#/bin/bash
start_time='2022-05-01'
endT_time='2022-05-03'
echo "开始时间为: $start_time"
echo "结束时间为:$endT_time"
start_timestamp=`date -d "$start_time" +%s`
end_timestamp=`date -d "$endT_time" +%s`
for((i=$start_timestamp; i<=$end_timestamp; i=i+3600*24))
do
start_day=`date -d @$i +%F`
echo "当前时间为:$start_day"
"
done
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 2.遍历时间
#!/bin/bash
echo "开始打印日期" # 开始打印日期
start_date=$(date -d "2023-01-01" +%s) # 将开始日期转换为Unix时间戳
end_date=$(date -d "yesterday" +%s) # 将昨天的日期转换为Unix时间戳
current_date=$start_date
while [ "$current_date" -lt "$end_date" ]; do
formatted_date=$(date -d "@$current_date" +%Y-%m-%d)
echo "$formatted_date"
current_date=$((current_date + 86400)) # 增加一天的秒数(86400秒)
done
echo "结束打印日期" # 结束打印日期
2
3
4
5
6
7
8
9
10
11
12
13
14
15
文件:
chmod +x date_loop_unix.sh
./date_loop_unix.sh
2
# 3.判断语句
其中,-z
选项用于判断字符串长度是否为 0,${#var}
用于获取变量的长度,${var+x}
用于判断变量是否存在。
注意,在 Shell 脚本中,变量的引用需要使用双引号来避免空格和特殊字符的影响。
var_test_app=`ps -ef | grep test_app | grep -v grep | awk '{print $2}'`
if [ -z "$var_test_app" ]; then
echo "变量 var_test_app 为空"
else
echo "变量 var_test_app 不为空"
kill -9 `ps -ef | grep test_app | grep -v grep | awk '{print $2}'`
fi
var_azure_demo=`ps -ef | grep azure_demo | grep -v grep | awk '{print $2}'`
if [ -z "$var_azure_demo" ]; then
echo "变量 var_azure_demo 为空"
else
echo "变量 var_azure_demo 不为空"
kill -9 `ps -ef | grep azure_demo | grep -v grep | awk '{print $2}'`
fi
cd /kwan/chainlit
python3.10 -m venv myenv
source myenv/bin/activate
nohup chainlit run test_app.py >/dev/null 2>&1 & exit
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 4.判断是否是闰年
#! /bin/bash
## This is a script that determines whether it is a leap year.
## The default object is this year. And you can specify a year
## as parameter input.
if [ $# -gt 1 ]
then
echo ParameterError:This script has one parameter.
elif [ $# -eq 1 ]
then
year=$1
fla=1
else
year=`date +"%Y"`
fla=0
fi
if [ $(($year%4)) -eq 0 ]&&[ $(($year%100)) -ne 0 ]||[ $(($year%400)) -eq 0 ]
then
echo $year is a leap year.
else
echo $year is not a leap year.
fi
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 5.打印时间
#输出当前年月日
echo $(date +%F)
#输出当前时间(时分)
echo $(date +%R)
#输出当前时间(时分秒)
echo $(date +%T)
#输出星期
echo $(date +%A)
#组合输出日期时间
echo $(date +%Y/%m/%d)
#输出时分秒
echo $(date +%H:%M:%S)
#输出年月日时分秒,备注 %n 空格 %F年月日 %T时分秒
echo $(date +%F%n%T)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 三.set -euo pipefail
set -euo pipefail
在 Bash 脚本中用于提高脚本的可靠性,避免常见错误。以下是每个选项的作用:
set -e
(遇到错误立即退出):当脚本中的任意命令返回非零退出状态(表示错误)时,脚本会立即停止执行。这样可以防止脚本继续执行出错后的操作,避免进一步的问题。
示例:
cp 不存在的文件 /tmp echo "如果 cp 命令失败,这行代码不会执行"
1
2如果
cp
命令失败,脚本会立即退出,echo
命令不会执行。
set -u
(使用未定义变量时报错):这个选项会在脚本中使用未定义的变量时导致脚本退出。它可以帮助发现拼写错误或由于变量未正确初始化而引发的问题。
示例:
echo "值: $未定义变量"
1如果
未定义变量
没有提前定义,脚本会直接报错并退出。
set -o pipefail
(管道命令中检测失败):当管道中的任意命令失败时,整个管道的返回值为失败(非零退出状态)。通常,只有最后一个命令的退出状态会被管道返回,这个选项确保即使管道中间的命令失败,脚本也会捕捉到并停止执行。
示例:
command1 | command2 | command3
1如果
command1
或command2
失败,pipefail
会使脚本检测到并停止,而不只是依赖command3
的返回值。
通过 set -euo pipefail
,可以避免很多常见的错误,确保脚本在出现问题时不会继续执行,从而提高脚本的健壮性和可维护性。
# 1.自定义输出
# 发送 POST 请求
response=$(curl -s -X POST \
-H 'Content-Type: application/json' \
-d "$DATA" \
"$WEBHOOK_URL")
echo "$response"
2
3
4
5
6
7
# 2.合并数据
cat ./.env.test ../middleware/.env.mid > .env.combined
# 3.删除前缀
# 删除前缀 test-
param='test-abcd'
param_cicd_path="${param#test-}"
2
3
# 4.中划线转下划线
# 中划线转下划线,并转大写
param_img=$(echo "$param" | tr '-' '_' | tr '[:lower:]' '[:upper:]')
echo "执行命令:${param_img}"
2
3
# 5.字符串拼接
param_img=$(echo "$param" | tr '-' '_' | tr '[:lower:]' '[:upper:]')
# 执行命令,使用$param作为参数
param_img_key=${param_img}_IMAGE
echo "执行命令:${param_img_key}"
2
3
4
# 6.if else
# 执行 docker_build.sh 脚本
if [ "$param" == "test-flex-flow" ]; then
cd $CODE_PATH/api
docker build -f Dockerfile -t ${IMAGE}:${IMAGE_TAG} .
else
cd $CODE_PATH
git pull
current_branch=$(git rev-parse --abbrev-ref HEAD)
if [ "$param" == "test-test" ]; then
read -p "是否重新构建前端包?(y/n)" reply
if [ "$reply" = "y" ]; then
# 前端构建
chmod +x ./frontend_build.sh
sh ./frontend_build.sh
fi
fi
sh docker_build.sh $IMAGE_TAG
fi
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 7.数组变量替换
要使用 envsubst
替换 YAML 中的数组变量 CHAT_MODELS
,可以按照以下步骤进行操作:
设置环境变量:
export CHAT_MODELS="test-72b-instruct,test-yi-34b-chat-0812"
创建一个模板文件 template.yaml
,内容如下:
chat_models: [${CHAT_MODELS}]
使用 envsubst
进行替换:
envsubst < template.yaml > output.yaml
生成的 output.yaml
文件内容将是:
chat_models: [test-72b-instruct, test-yi-34b-chat-0812]
# 如果你希望以 YAML 数组的格式输出:
为了将逗号分隔的字符串转换为每个元素单独一行的格式,你可以使用 tr
命令:
将逗号替换为空格并准备模板:
export CHAT_MODELS="test-72b-instruct,test-yi-34b-chat-0812"
echo "chat_models:" > template.yaml
echo " - ${CHAT_MODELS//,/\\n - }" >> template.yaml
2
3
然后可以将模板内容输出到文件:
cat template.yaml > output.yaml
生成的 output.yaml
文件将是:
chat_models:
- test-72b-instruct
- test-yi-34b-chat-0812
2
3
这样,你就可以成功将环境变量 CHAT_MODELS
替换为符合 YAML 格式的数组。