# 一.基础语句

# 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  \
1
2
3
4
5
6
7
8

# 2.多脚本同时启动的情况

有几种情况下可能需要同时启动多个 sh 脚本:

  1. 并行任务处理:当需要同时处理多个任务,而这些任务之间没有相互依赖性时,可以使用多个 sh 脚本同时启动,以加快整体处理速度。

  2. 分布式计算:在分布式计算环境中,可能需要在多台计算节点上同时启动多个 sh 脚本,以并行地执行任务,提高计算效率。

  3. 批量处理:当需要对多个文件、数据进行批量处理时,可以编写多个 sh 脚本,分别处理不同的文件或数据集。

  4. 多个定时任务:在某些情况下,可能需要在同一时间点执行多个定时任务,这时可以编写多个 sh 脚本,并使用定时任务调度工具(如 cron)同时启动这些脚本。

需要同时启动多个 sh 脚本的场景通常涉及到需要并行处理多个任务、提高计算效率或批量处理数据等情况。

要同时启动多个 Shell 脚本(以.sh 为扩展名),你可以使用以下几种方法:

使用后台运行符号&

sh script1.sh & sh script2.sh & sh script3.sh &
1

使用nohup命令:

nohup sh script1.sh & nohup sh script2.sh & nohup sh script3.sh &
1

使用xargs

echo "script1.sh script2.sh script3.sh" | xargs -n 1 -P 0 sh
1

这将会同时启动三个脚本,使用-P 0选项告诉xargs以并行方式运行命令。

使用parallel命令:

parallel ::: "sh script1.sh" "sh script2.sh" "sh script3.sh"
1

这将会同时启动三个脚本。

使用这些方法之一,你可以同时启动多个 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
1
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 "结束打印日期"  # 结束打印日期
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

文件:

chmod +x date_loop_unix.sh
./date_loop_unix.sh
1
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
1
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
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

# 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)
1
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 脚本中用于提高脚本的可靠性,避免常见错误。以下是每个选项的作用:

  1. set -e(遇到错误立即退出)

    • 当脚本中的任意命令返回非零退出状态(表示错误)时,脚本会立即停止执行。这样可以防止脚本继续执行出错后的操作,避免进一步的问题。

    • 示例:

      cp 不存在的文件 /tmp
      echo "如果 cp 命令失败,这行代码不会执行"
      
      1
      2
    • 如果 cp 命令失败,脚本会立即退出,echo 命令不会执行。

  2. set -u(使用未定义变量时报错)

    • 这个选项会在脚本中使用未定义的变量时导致脚本退出。它可以帮助发现拼写错误或由于变量未正确初始化而引发的问题。

    • 示例:

      echo "值: $未定义变量"
      
      1
    • 如果 未定义变量 没有提前定义,脚本会直接报错并退出。

  3. set -o pipefail(管道命令中检测失败)

    • 当管道中的任意命令失败时,整个管道的返回值为失败(非零退出状态)。通常,只有最后一个命令的退出状态会被管道返回,这个选项确保即使管道中间的命令失败,脚本也会捕捉到并停止执行。

    • 示例:

      command1 | command2 | command3
      
      1
    • 如果 command1command2 失败,pipefail 会使脚本检测到并停止,而不只是依赖 command3 的返回值。

通过 set -euo pipefail,可以避免很多常见的错误,确保脚本在出现问题时不会继续执行,从而提高脚本的健壮性和可维护性。

# 1.自定义输出

# 发送 POST 请求
response=$(curl -s -X POST \
    -H 'Content-Type: application/json' \
    -d "$DATA" \
    "$WEBHOOK_URL")

echo "$response"
1
2
3
4
5
6
7

# 2.合并数据

cat ./.env.test ../middleware/.env.mid > .env.combined
1

# 3.删除前缀

# 删除前缀 test-
param='test-abcd'
param_cicd_path="${param#test-}"
1
2
3

# 4.中划线转下划线

# 中划线转下划线,并转大写
param_img=$(echo "$param" | tr '-' '_' | tr '[:lower:]' '[:upper:]')
echo "执行命令:${param_img}"
1
2
3

# 5.字符串拼接

param_img=$(echo "$param" | tr '-' '_' | tr '[:lower:]' '[:upper:]')
# 执行命令,使用$param作为参数
param_img_key=${param_img}_IMAGE
echo "执行命令:${param_img_key}"
1
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
1
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"
1

创建一个模板文件 template.yaml,内容如下:

chat_models: [${CHAT_MODELS}]
1

使用 envsubst 进行替换

envsubst < template.yaml > output.yaml
1

生成的 output.yaml 文件内容将是:

chat_models: [test-72b-instruct, test-yi-34b-chat-0812]
1

# 如果你希望以 YAML 数组的格式输出:

为了将逗号分隔的字符串转换为每个元素单独一行的格式,你可以使用 tr 命令:

将逗号替换为空格并准备模板

export CHAT_MODELS="test-72b-instruct,test-yi-34b-chat-0812"
echo "chat_models:" > template.yaml
echo "  - ${CHAT_MODELS//,/\\n  - }" >> template.yaml
1
2
3

然后可以将模板内容输出到文件

cat template.yaml > output.yaml
1

生成的 output.yaml 文件将是:

chat_models:
  - test-72b-instruct
  - test-yi-34b-chat-0812
1
2
3

这样,你就可以成功将环境变量 CHAT_MODELS 替换为符合 YAML 格式的数组。

上次更新: 11/9/2024, 1:25:45 PM