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

