shell—命令执行成功的判断

在shell 中可以使用 echo $? 的结果来判断上一条命令是否执行成功,成功为0,否则非0.
分号;用来间隔多个依次执行的命令。
如果要使两个命令有关联,如果前面的执行正确就接着执行后面的,否则就略过,可以用&&来完成。

woody@linux:~$ ls /tmp && touch /tmp/testfile
gconfd-woody scim-helper-manager-socket-woody ssh-IBhPBd4873
mplayhfvs8X scim-panel-socket:0-woody
orbit-woody scim-socket-frontend-woody
woody@linux:~$ ls /tmp
gconfd-woody scim-helper-manager-socket-woody ssh-IBhPBd4873
mplayhfvs8X scim-panel-socket:0-woody testfile
orbit-woody scim-socket-frontend-woody

上面先用ls 判断目录tmp是否存在,如果存在就创建testfile文件,否则就不创建。
|| 与&&相反,如果执行错误才会执行后面的命令。
可以用来完成类似这样的功能: 当某个文件不存在的时候就去创建那个文件
woody@linux:~$ ls haha || touch haha
ls: cannot access haha: No such file or directory
woody@linux:~$ ls
Backup doc file1 haha playlist wallpapers
Desktop Downloads file2 linux_c_src vbox_share xrgsu
woody@linux:~$

例子:
用ls 测试/tmp/heihei 是否存在, 存在则显示exist 否则显示 not exist
woody@linux:~$ ls /tmp/heihei && echo "exist"||echo "not exist"
ls: cannot access /tmp/heihei: No such file or directory
not exist
上面ls 不成功, 则echo "exist" 不执行,返回值是ls的返回值(失败),这样||后面的指令执行。
woody@linux:~$ touch /tmp/heihei
woody@linux:~$ ls /tmp/heihei && echo "exist"||echo "not exist"
/tmp/heihei
exist
woody@linux:~$
上面的ls 执行成功,接着成功执行echo "exist" ,||后面不执行。
但是不能写成 ls /tmp/heihei ||echo "not exist" && echo "exist"
因为如果ls失败, 则echo "not exist" , 但是echo执行成功, 则 &&后面的echo "exist" 会接着执行。这样就同时显示not exist exist 了。
记住命令是顺序执行的就可以了!

备份目录下面文件
#!/bin/bash
case $# in //$#表示转入参数的个数,sh bak.sh ./ .sh 有二个参数./和.sh
0) // 参数为空时,提示错误,并且退出
echo "message:param is wrong"
exit $E_BADARGS;;
esac

string=" "

cd $1 //进入传入的目录

//备份子目录中的文件时,参数也要接上
if [ $# -gt "1" ]
then
string=$string" "$2
fi

for filename in * //读取当前目录中的文件
do
if [ -d "$filename" ] //判断一下是不是目录
then
/bin/sh /home/zhangy/test/$0 $(pwd)/$filename $string //是目录的话,进行递归
else
if [ $# -gt "1" ] && [ ${filename:(-${#2})} = $2 ] //指定备份什么样的文件
then
cp $filename $filename"bak"
fi
if [ $# -eq "1" ]
then
cp $filename $filename"bak" //没指定,备份目录下面的所有文件
fi
fi
done
exit 0

bak.sh ./ .sh 这句话的意思是把当前目录(以及子目录)中的所有以.sh为后缀的文件,进行备份
Shell 脚本中判断命令是否执行成功,通常使用预定义变量 `$?` 来获取上一个命令的退出状态。如果 `$?` 的值为 `0`,表示上一条命令执行成功;若为非零值,则表示执行失败[^1]。 ### 基本方法 可以通过 `if-else` 语句结合 `$?` 来判断命令执行结果: ```bash cp setup.sh setup11.sh if [ $? -eq 0 ]; then echo "命令执行成功" else echo "命令执行失败" fi ``` 上面的示例中,脚本先尝试复制文件,然后检查 `cp` 命令的返回值。如果返回值是 `0`,则输出“命令执行成功”,否则输出“命令执行失败”[^2]。 ### 更简洁的写法 还可以将命令直接放在 `if` 判断中,省略对 `$?` 的显式调用: ```bash if cp setup.sh setup11.sh; then echo "命令执行成功" else echo "命令执行失败" fi ``` 这种方式更加简洁,并且逻辑清晰。当 `cp` 命令执行成功时,`if` 条件成立,进入 `then` 分支;否则进入 `else` 分支[^4]。 ### 使用场景扩展 该方法不仅适用于普通的 Shell 命令,也适用于 `make` 等工具命令。例如: ```bash make mytarget if [ $? -ne 0 ]; then echo "构建失败" exit 1 fi ``` 这段代码会检查 `make mytarget` 是否执行成功,如果没有成功(即 `$?` 不等于 `0`),则打印错误信息并退出脚本。 ### 其他比较运算符 在编写条件判断语句时,Shell 提供了一些常用的比较运算符,用于数值和字符串比较: | 运算符 | 含义 | |--------|--------------| | `-eq` | 等于 | | `-ne` | 不等于 | | `-gt` | 大于 | | `-lt` | 小于 | | `-ge` | 大于等于 | | `-le` | 小于等于 | 这些运算符可以用于更复杂的逻辑判断,如检查某个命令的返回码是否符合预期[^1]。 ### 示例:综合判断 以下是一个完整的脚本示例,演示如何结合 `$?` 和 `if-else` 进行命令执行结果的判断: ```bash #!/bin/bash # 执行一个命令 ls /nonexistent_directory # 检查上一条命令的执行结果 if [ $? -eq 0 ]; then echo "目录存在,命令执行成功" else echo "目录不存在,命令执行失败" fi ``` 运行这个脚本时,如果 `/nonexistent_directory` 不存在,`ls` 命令会失败,脚本将输出“目录不存在,命令执行失败”。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值