You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从main.sh调用invoke.sh并检测、返回状态字符串的实现方法

Shell脚本状态检测与返回实现方案

背景说明

现有两个Shell脚本main.sh和invoke.sh,需要在main.sh里调用invoke.sh。invoke.sh执行后会输出系统资源信息,其中包含一行状态行:State: registered或State: unregistered。目标是从invoke.sh的输出里揪出这行状态,把结果传给main.sh,再由main.sh告诉用户设备的注册状态。


1. 怎么检测指定的状态字符串?

直接用Shell自带的文本处理工具,从invoke.sh的输出里过滤出状态行就行,常用两种写法:

写法一:用grep+正则提取

# 调用invoke.sh,过滤出状态行并提取后面的状态值
status=$(./invoke.sh | grep -oP 'State: \K\w+')
  • grep -oP:-o只输出匹配到的内容,-P支持Perl风格正则
  • State: \K\w+:\K会忽略前面的State: ,只捕获后面的单词(也就是registered或unregistered)

写法二:用awk直接取字段

# 匹配包含State:的行,打印第二个字段(状态值)
status=$(./invoke.sh | awk '/State:/ {print $2}')

这种写法更简洁,awk会自动拆分每行的字段,直接取第二个就行。


2. 怎么把状态字符串返回给main.sh?

有三种实用的方式,按需选择:

方式一:直接在main.sh里提取(最常用)

不用修改invoke.sh,直接在main.sh里通过上面的命令捕获状态值即可,完整示例如下:

#!/bin/bash

# 调用invoke.sh并提取状态
device_status=$(./invoke.sh | awk '/State:/ {print $2}')

# 给用户反馈状态
if [ "$device_status" = "registered" ]; then
    echo "设备已注册"
elif [ "$device_status" = "unregistered" ]; then
    echo "设备未注册"
else
    echo "无法获取设备注册状态"
fi

方式二:让invoke.sh主动输出状态值

如果希望invoke.sh专门把状态值单独输出,方便main.sh捕获,可以在invoke.sh的末尾加一行代码,单独打印状态:

#!/bin/bash

# 原有输出逻辑(比如输出系统资源信息)
echo "CPU占用:20%"
echo "内存占用:50%"
echo "State: unregistered"

# 单独输出状态值,供main.sh捕获
awk '/State:/ {print $2}' <<< "$(cat /proc/self/fd/1)"

然后在main.sh里只取最后一行输出(也就是状态值):

#!/bin/bash

# 捕获invoke.sh最后一行的状态值
device_status=$(./invoke.sh | tail -n1)
echo "设备注册状态:$device_status"

方式三:用退出码传递(适合二元状态)

如果只需要区分“已注册”和“未注册”两种情况,也可以用脚本的退出码传递:
在invoke.sh里检测状态后设置退出码:

#!/bin/bash

# 原有输出逻辑
echo "系统资源信息..."
echo "State: registered"

# 根据状态设置退出码
if grep -q 'State: registered' <<< "$(cat /proc/self/fd/1)"; then
    exit 0  # 0代表已注册
else
    exit 1  # 1代表未注册
fi

然后在main.sh里判断退出码:

#!/bin/bash

./invoke.sh
if [ $? -eq 0 ]; then
    echo "设备已注册"
else
    echo "设备未注册"
fi

内容的提问来源于stack exchange,提问作者Yunus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 20:18:34