从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
相关产品推荐
相关产品推荐

