shell-6-退出状态与流程控制语句(if;test;case命令)

简介:

shell 的每一条命令,无论是内置的,外部的,还是shell 函数,当它退出时都会返回一个小的整数值
给引用他的程序,这就是程序的退出状态,我们会经常用到,比如 if for test  等等,这些命都需要
使用程序的退出状态来,完成条件判断。

lz6.1
[root@master ~]# ls /dev/null 
/dev/null
[root@master ~]# echo $?
0
[root@master ~]# ls /dev/Null;echo $?
ls: 无法访问/dev/Null: 没有那个文件或目录
2
[zm@master ~]$ file /root/pw;echo $?
/root/pw: ERROR: cannot open `/root/pw' (Permission denied)
1

echo $? (关于shell特殊变量)用于输出shell最后一次所执行的一个程序退出状态,
我们发现 成功执行的命令,退出状态为 0 ,而 没有成功执行的命令 退出状态 非0 (大于0的值都为失败)。

lz6.2 下边是在amp.sh脚本中的一段

 if [ ! -d /usr/local/freetype ]
  then
  echo "error! can't install freetype  please check ! Will now out of the script!"
  exit 1
 fi

如果找不到这个目录,那么test命令([ ! -d /usr/local/freetype ]为test命令快捷方式,详细介绍)退出状态 为 1 ,这里使用了逻辑运算符"!"表示取反 非1即0那么此时退出状态为0,接下来我们就可以使用 exit 命令,传递一个退出值也就是 exit 1 ,脚本会退出并返回值为1,如果只有 exit 命令 而没有参数(返回值),则以最后一个执行命令的退出状态,作为退出状态,这点需要注意了!

lz6.3
[root@master ~]#if test 1 -eq 1         
> then 
> echo "exit status is 0"
> else
> echo "exit status is 1"
> fi
exit status is 0
[root@master ~]#if test 1 -eq 2         
> then 
> echo "exit status is 0"
> else
> echo "exit status is 1"
> fi
exit status is 1

nginx_install.sh 部分

if ! grep 'nginx' /etc/passwd;then         #grep没有匹配nginx,返回1,"!"非1即0
    useradd nginx -s /sbin/nologin
else
    echo "nginx uesr and nginx group is already exists!"
fi


lz6.2 与 lz6.3 中都使用了 if语句,它们都根据程序(命令 test/grep)退出状态来进行判断,test命令判断 整数1 是否等于 整数1, (将在下一节详细介绍test命令和它的快捷方式"[]")如果相等则成功并返回0,执行then后边的语句,相反 如果不相等则失败并返回1,执行else后边的语句,所以 if 语句与程序退出状态是结合在一起的,if语句还可以当成“开关”(多条件判断)语句使用,不过我更喜欢使用case语句,来完成同样的功能。

lz6.4 下行的case语句是在newtc.sh脚本中的一段,case语句比较简单要测试的值在case 与 in 之间,在列表中依次测试
发现匹配的时候,便执行相应的程序代码,直至;;为止
case "$1" in
   start)
       echo "start!"
       tc_main
       exit 0
       ;;
   clear)
       echo "clear!"
       tc_clear
       exit 0
       ;;
   ......
   ......
    *)
       echo "Usage: $0 {start|clear|vip|show}"
       exit 1
esac

使用双括号语法扩展if语句,双括号语法请参考这里

if(($k>=10));then
        k=a
        echo $k
        exit 2
fi




lz6.5
[root@master ~]# if grep 'ROOT' /etc/passwd ;then :;else echo "not found";fi
not found
[root@master ~]# if ! grep 'ROOT' /etc/passwd; then  echo "not found";fi
not found

第一if判断中 then使用了':',它什么都不做而只是为了使用else部分,其实不用这么麻烦,我们可以在shell中使用
逻辑的not(!) ,and(&&) ,or(||)
,比如第二个if判断 使用逻辑非运算符,grep 没有匹配到 'ROOT' 此时退出状态值为 1, 而
! 1 ,我们知道 逻辑值只有两个 非 0 即 1, 那么此时退出状态值 变为 0, 同样的 and(&&) ,or(||) 也是这样,比如lz6.5
lz6.5
[root@master ~]# if test -e /etc/passwd && grep 'root' /etc/passwd;then echo ok;else echo no;fi
root:x:0:0:root:/root:/bin/bash
ok                                               #两个命令都必须成功执行(逻辑与)
[root@master ~]# if test -e /etc/PASSWD || grep 'root' /etc/passwd;then echo ok;else echo no;fi
root:x:0:0:root:/root:/bin/bash
ok                                               #两个命令有一个命令成功执行即可(逻辑或)



本文转自 dongnan 51CTO博客,原文链接: 

http://blog.51cto.com/dngood/616483


相关文章
|
2月前
|
Shell Linux 程序员
【Linux】Shell 命令以及运行原理
【Linux】Shell 命令以及运行原理
|
16天前
|
存储 Shell 数据安全/隐私保护
Shell 内建命令:Shell 的内在魔力
Shell 内建命令比外部命令执行快,不需额外进程。`type` 命令用来检查命令类型。内建命令如 `cd`、`alias` 和 `echo` 直接在 Shell 中执行,不涉及磁盘 I/O。`type` 示例展示了 `cd` 是内建的,`ifconfig` 是外部的。`bash` 包含多种内建命令,如 `cd` 用于切换目录,`alias` 定义别名,`read` 从输入读取数据。`echo` 默认加换行,`echo -n` 可避免。
21 5
|
16天前
|
Shell 虚拟化
分布式系统详解--框架(Zookeeper-基本shell命令)
分布式系统详解--框架(Zookeeper-基本shell命令)
15 1
|
19天前
|
安全 Shell Linux
探索Linux命令chsh:更改用户的默认shell
`chsh`是Linux命令,用于更改用户的默认登录shell。它涉及用户环境配置和系统安全,允许用户选择更适合自己的shell以提升效率。命令有交互式选项和参数如`-s`来指定新shell。在使用时要注意新shell的可执行性、权限问题及选择合适的shell。例如,要更改为bash,用户可运行`chsh`后按提示操作,而root用户能用`sudo chsh -s /bin/zsh john`为用户`john`设定zsh。在更改前,确认shell路径、权限,并了解不同shell的特点。
|
16天前
|
分布式计算 Hadoop Shell
分布式系统详解--框架(Hadoop-基本shell命令)
分布式系统详解--框架(Hadoop-基本shell命令)
12 0
|
20天前
|
Shell
Shell [[]] 命令:条件判断的升级版
`[[ ]]` 是 Bash 中增强型的条件判断命令,提供比 `[ ]` 更多的灵活性,如无需引号包裹变量、直接字符串比较及正则支持。例如: ```markdown - 不加引号比较:`[[ -z $str1 ]]` - 逻辑运算:`[[ -z $str1 ]] || [[ -z $str2 ]]` - 正则匹配:`[[ $phone =~ ^1[0-9]{10}$ ]]` ``` 它不支持 `-a` 和 `-o`,但能用 `&&` 和 `||` 进行逻辑操作。用于复杂字符串验证和文件处理时非常有用。
18 0
|
20天前
|
Shell Windows
Shell test [] 命令:条件判断的艺术
`test` 命令在Shell脚本中用于条件检测,涉及数值、字符串和文件比较。例如,`test $a -eq $b` 检查两个数是否相等;`-e` 检查文件是否存在;`-w` 检查文件是否可写。数值比较不支持 `>=` 和 `<=`,需用 `-ge` 和 `-le`。字符串比较时注意空值,使用双引号。逻辑运算包括 `-a`(与)、`-o`(或)和 `!`(非)。文件类型和权限检测也是`test`的重要用途。
12 0
|
2月前
|
Shell 程序员 数据安全/隐私保护
shell 脚本 if-else判断 和流程控制 (基本语法|基础命令)
shell 脚本 if-else判断 和流程控制 (基本语法|基础命令)
|
2月前
|
网络协议 Unix Shell
第十一章 Shell常用命令与工具(二)
第十一章 Shell常用命令与工具(二)
|
2月前
|
Shell Windows Perl
Shell编程中的条件判断与流程控制
Shell编程中的条件判断与流程控制
64 0