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

Bash脚本中$?值存入变量后为空的问题解决咨询

Bash脚本中$?值存入变量后为空的问题解决咨询

嗨,我来帮你捋清楚这个问题哈~你的脚本里flag变量为空的核心原因是:你把“写入文件”和“变量赋值”搞混啦!

先说说你的错误点:

你写的echo $? > flag这行代码,不是把$?的值赋值给变量flag,而是把$?的内容输出到了当前目录下一个名为flag的文件里。你可以去脚本运行的目录看看,肯定多了个叫flag的文件,打开它就能看到0或者非0的数字——但你的变量flag从来没被赋值过,所以echo "flag is $flag"自然输出空啦。

正确的几种写法:

方法1:直接把$?赋值给变量(最直观)

我们可以先执行grep命令,再把它的退出码直接存到变量里,而且给grep加-q参数让它静默运行(因为我们只关心匹配成功与否,不需要输出匹配结果):

#!/bin/bash

# check for 5 digit argument
read -p "Enter 5 digit Account Number `echo $'\n> '`" accNum

# 静默检查格式,不输出内容
echo "$accNum" | grep -q "^[0-9]\{5\}$"
# 把上一条命令的退出码赋值给flag变量
flag=$?

echo "flag is $flag"

方法2:用if判断直接赋值(更易读)

如果想让逻辑更清晰,可以直接用if判断grep的结果,给flag赋值:

#!/bin/bash

read -p "Enter 5 digit Account Number `echo $'\n> '`" accNum

if echo "$accNum" | grep -q "^[0-9]\{5\}$"; then
    flag=0  # 匹配成功,退出码0
else
    flag=1  # 匹配失败,退出码非0
fi

echo "flag is $flag"

方法3:用Bash内置正则(更高效,不用启动子进程)

Bash本身支持正则匹配,不用调用grep命令,性能更好:

#!/bin/bash

read -p "Enter 5 digit Account Number `echo $'\n> '`" accNum

if [[ "$accNum" =~ ^[0-9]{5}$ ]]; then
    flag=0
else
    flag=1
fi

echo "flag is $flag"

测试效果:

比如输入asdf,会输出flag is 1;输入11111,会输出flag is 0,完全符合你的需求~

备注:内容来源于stack exchange,提问作者hercules

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 10:47:58