shell初级-----结构化命令
if-then语句
bash shell的if语句会执行if后面的那个命令,如果该命令的退出码状态为0会执行then部分的命令,如果是其他值不会执行。
格式如下:
if command
then
commands
fi
实例:
[root@node1 ljy]# more ceshi.sh
#!/bin/bash
if pwd
then
echo "ok"
fi [root@node1 ljy]# sh ceshi.sh
/ljy
ok
在then部分可以使用多条命令。
[root@node1 ljy]# more ceshi.sh
#!/bin/bash
testuser=ljy
if grep $testuser /etc/passwd
then
echo "ok"
fi [root@node1 ljy]# sh ceshi.sh
ljy:x:1000:1000::/home/ljy:/bin/bash
ok
if-then-else
格式如下:
if command
then
commands
else
commands
fi
用法很简单,看一个例子就行
[root@node1 ljy]# more ceshi.sh
#!/bin/bash
testuser=ljy
if grep $testuser /etc/passwd
then
echo "$testuser exit on system!"
else
echo "$testuser does ont on system!"
fi [root@node1 ljy]# sh ceshi.sh
ljy:x:1000:1000::/home/ljy:/bin/bash
ljy exit on system!
#此时我定义一个不存在的变量
[root@node1 ljy]# more ceshi.sh
#!/bin/bash
testuser=ljy1
if grep $testuser /etc/passwd
then
echo "$testuser exit on system!"
else
echo "$testuser does ont on system!"
fi [root@node1 ljy]# sh ceshi.sh
ljy1 does ont on system!
嵌套if
语法很简单看一个例子:
[root@node1 ljy]# more ceshi.sh
#!/bin/bash
testuser=zhangsan
if grep $testuser /etc/passwd
then
echo "$testuser exit on system!"
else
echo "$testuser does ont on system!"
if ls -d /home/$testuser
then
echo "but $testuser have a directory!"
fi
fi [root@node1 ljy]# sh ceshi.sh
zhangsan does ont on system!
/home/zhangsan
but zhangsan have a directory!
也可以用else部分的另外一种形式elif
格式如下:
if command
then
commands
elif command2
then
more commands
fi
实例:
[root@node1 ljy]# more ceshi.sh
#!/bin/bash
testuser=zhangsan
if grep $testuser /etc/passwd
then
echo "$testuser exit on system!"
elif ls -d /home/$testuser
then
echo "but $testuser have a directory!"
fi [root@node1 ljy]# sh ceshi.sh
/home/zhangsan
but zhangsan have a directory!
test命令
如果test命令中列出的条件成立,test命令就会退出并返回特推出状态码0
test 命令可以判断3类条件:
1. 数值比较
2. 字符串比较
3. 文件比较
1、数值比较
注意:test 命令中不能使用浮点数。

实例:
[root@node1 ljy]# more ceshi.sh
#!/bin/bash
value1=10
value2=11
#
if [ $value1 -gt 5 ] #左括号右侧和右括号左侧各加一个空格,否则会报错。
then
echo "$value1 is bigger than 5"
fi
[root@node1 ljy]# sh ceshi.sh
10 is bigger than 5
2、字符串比较
条件测试还允许比较字符串值

字符串比较的三大注意事项:
1. 比较的变量最好加上双引号。
2. 大于小于符号必须转义(使用\>),否则 shell 会把它们当做重定向符号而把字符串值当做文件名。
3. 大于小于顺序和 sort 命令所采用的不同。(test默认大写字母小于小写字母)
实例:
[root@node1 ljy]# more ceshi.sh
#!/bin/bash
value1=basketball
value2=football
#
if [ $value1 \> $value2 ]
then
echo "$value1 is greater than $value2"
else
echo "$value1 is less than $value2"
fi
[root@node1 ljy]# sh ceshi.sh
basketball is less than football
-n和-z可以检查一个变量是否含有数据。
[root@node1 ljy]# more ceshi.sh
#!/bin/bash
value1=basketball
value2=' '
#
if [ -n $value1 ]
then
echo "'$value1' is not empty"
else
echo "'$value1' is empty" fi
#
if [ -z $value2]
then
echo "'$value2' is empty"
else
echo "'$value2' is not empty"
fi
[root@node1 ljy]# sh ceshi.sh
'basketball' is not empty
' ' is empty
-n判断长度是否非0,-z判断长度是否为0
在变量可能为0的情况下,比较两个字符串是否相等可以这样:
if [ "$test"x = "test"x ]; then
这里的关键有几点:
1 使用单个等号
2 注意到等号两边各有一个空格:这是unix shell的要求
3 注意到"$test"x最后的x,这是特意安排的,因为当$test为空的时候,上面的表达式就变成了x = testx,显然是不相等的。
而如果没有这个x,表达式就会报错:[: =: unary operator expected
3、文件比较

-d检测目录是否存在。
[root@node1 ljy]# more ceshi.sh
#!/bin/bash
value1=/home/ljy
if [ -d $value1 ]
then
echo "$value1 is exited"
else
echo "$value1 is not exited"
fi
[root@node1 ljy]# sh ceshi.sh
/home/ljy is exited
-e允许脚本代码在使用文件或者目录前先检测是否存在。
[root@node1 ljy]# more ceshi.sh
#!/bin/bash
value1='lisi'
if [ -e /home/$value1 ]
then
echo "$value1 is exited"
else
echo "$value1 is not exited"
fi
[root@node1 ljy]# sh ceshi.sh
lisi is exited
-f确定对象是否为文件。
[root@node1 ljy]# more ceshi.sh
#!/bin/bash
value1='zhangsan'
if [ -e /home/$value1 ] #判断变量是否存在
then
echo "$value1 is exited"
if [ -f /home/$value1 ] #判断是否为文件
then
echo "$value1 is a file"
else
echo "$value1 is a directory"
fi
else
echo "$value1 is not exited"
fi
[root@node1 ljy]# sh ceshi.sh
zhangsan is exited
zhangsan is a directory
-r测试文件是否可读。
[ljy@node1 ljy]$ more ceshi2.sh
#!/bin/bash
pwfile=/home/lisi
#
if [ -r $pwfile ]
then
tail $pwfile
else
echo "this file unable to read!"
fi
[ljy@node1 ljy]$ sh ceshi2.sh
this file unable to read!
-s检测文件是否为非空,尤其是在不想删除非空文件的时候。
[root@node1 ljy]# more ceshi2.sh
#!/bin/bash
pwfile=/home/lisi
#
if [ -s $pwfile ]
then
echo "this file is not empty"
else
echo "$pwfile is empty"
echo "Deleting empty file..."
rm $pwfile
fi
[root@node1 ljy]# sh ceshi2.sh
/home/lisi is empty
Deleting empty file...
-w判断对文件是否可写。
[root@node1 ljy]# more ceshi2.sh
#!/bin/bash
pwfile=/home/lisi
#
if [ -w $pwfile ]
then
echo "this file can be write!"
date +%H%M >> $pwfile
else
echo "$pwfile can not be write"
fi
[root@node1 ljy]# sh ceshi2.sh
this file can be write!
-x判断文件是否有执行权限。
当然这是针对的非root用户。
[root@node1 ljy]# more ceshi2.sh
#!/bin/bash
pwfile=/home/test.sh
#
if [ -x $pwfile ]
then
echo "this file can be run!"
sh $pwfile
else
echo "$pwfile can not be run!"
fi
[root@node1 ljy]# sh ceshi2.sh
this file can be run!
复合条件测试
if-then 语句允许使用布尔逻辑来组合测试:
- 与:[ condition1 ] && [ condition2 ] 或者 [ condition1 -a condition2 ]
- 或:[ condition1 ] || [ condition2 ] 或者 [ condition1 -o condition2 ]
- 非:[ !condition ]
实例:
[root@node1 ljy]# more ceshi2.sh
#!/bin/bash
pwfile=/home/test.sh
#
if [ -d $pwdfile ] && [ -x $pwfile ]
then
echo "this file can be run!"
sh $pwfile
else
echo "$pwfile can not be run!"
fi
[root@node1 ljy]# sh ceshi2.sh
this file can be run!
case命令
为单个变量寻找特定的值,可以用 case 命令,而不是写那么多的 elif 语句检查。case 命令会检查单个变量列表格式的多个值:
case variable in
pattern1 | pattern2) commands1 ;;
pattern3) commands2 ;;
*) default commands ;;
esac
case 命令会将指定的变量同不同模式进行比较。
如果变量和模式是匹配的,那么 shell 会执行为该模式指定的命令。
也可以通过竖线操作符来分割模式,在一行列出多个模式。星号会捕获所有跟所有列出的模式都不匹配的值。
[root@node1 ljy]# more ceshi2.sh
#!/bin/bash
case $USER in
root | barbara)
echo "Welcome $USER"
echo 'Enjoy your visit' ;;
testing)
echo "Special testing acount" ;;
jessica)
echo "Don't forget to log off" ;;
*)
echo "Sorry, you aren't allowed here" ;;
esac
[root@node1 ljy]# sh ceshi2.sh
Welcome root
Enjoy your visit
shell初级-----结构化命令的更多相关文章
- shell的结构化命令
shell在逻辑流程控制这里会根据设置的变量值的条件或其他命令的结果跳过一些命令或者循环执行的这些命令.这些命令通常称为结构化命令 1.if-then语句介绍 基本格式 if command then ...
- Linux&shell之结构化命令进阶
写在前面:案例.常用.归类.解释说明.(By Jim) for命令重复一系列的命令是一种常见的编程实践. #!/bin/bash # basic for command for test in A B ...
- Linux&shell之结构化命令
写在前面:案例.常用.归类.解释说明.(By Jim)使用if-then语句如果命令的退出状态是0(成功执行命令),将执行then后面的所有命令.如果命令的退出状态是0以外的其他值,那么then后面的 ...
- Shell编程—结构化命令(2)
1for命令 for命令的基本格式: for var in list do commands done 在list参数中,你需要提供迭代中要用到的一系列值. 1.1读取列表中的值 例子: $ vim ...
- Shell编程—结构化命令
1使用if-then语句 f-then语句有如下格式. if command then commands fi bash shell的if语句会运行if后面的那个命令.如果该命令的退出状态码是0(该命 ...
- linux shell脚本使用结构化命令
内容: 一.if-then命令 二.if-then-else命令 三.test命令 四.case命令 1.if-then结构化命令中最基本的类型,其格式如下: if command then comm ...
- Shell 语法之结构化命令(流程控制)
许多程序在脚本命令之间需要某种逻辑流控制,允许脚本根据变量值的条件或者其他命令的结果路过一些命令或者循环执行这些命令.这些命令通常被称为结构化命令.和其他高级程序设计语言一样,shell提供了用来控制 ...
- 《Linux命令行与shell脚本编程大全》第十二章 使用结构化命令
许多程序要就对shell脚本中的命令施加一些逻辑控制流程. 结构化命令允许你改变程序执行的顺序.不一定是依次进行的 12.1 使用if-then语句 如下格式: if command then ...
- Linux编程 23 shell编程(结构化条件判断 命令if -then , if-then ... elif-then ...else,if test)
一.概述 在上一篇里讲到了shell脚本,shell按照命令在脚本中出现的顺序依次进行处理,对于顺序操作已经足够了,但许多程序要求对shell脚本中的命令加入一些逻辑流程控制,这样的命令通常叫做 结构 ...
随机推荐
- python 高级函数
高级函数 map 格式:map(func, lt) 说明:接受两个参数,一个函数和一个可迭代对象,返回一个生成器,将func依次作用于lt 示例: l = [1,2,3,4,5]def double ...
- CentOS7搭建FastDFS V5.11分布式文件系统(一)
1.绪论 最近要用到fastDFS,所以自己研究了一下,在搭建FastDFS的过程中遇到过很多的问题,为了能帮忙到以后搭建FastDFS的同学,少走弯路,与大家分享一下.FastDFS的作者淘宝资深架 ...
- python、第五篇:数据备份、pymysql模块
一 IDE工具介绍 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具 下载链接:https://pan.baidu.com/s/1bpo5mqj 掌握: #1. 测试+链接 ...
- zabbix 4 自带 php、httpd漏洞升级
Zabbix 自带的 PHP 5.4.apache httpd 2.4.6扫描出安全漏洞,需要进行升级. PHP # php -v PHP 5.4.16 (cli) (built: Apr 12 20 ...
- 抄来的,占个位儿【百度架构师是怎样搭建MySQL分布式集群】
1.准备集群搭建环境 使用6台虚拟机来搭建MySQL分布式集群,相应的实验环境与对应的MySQL节点之间的对应关系如下图所示: 管理节点(MGM):这类节点的作用是管理MySQLCluster ...
- IList,List<T>转换为DataTable 常用收藏
List<info> infos = Dal.GetInfos(); DataTable dt = new DataTable(); dt.Columns.Add("cName& ...
- Codeforces Manthan, Codefest 18 (rated, Div. 1 + Div. 2) E.Trips
比赛的时候想到怎么做了 没调出来(感觉自己是个睿智) 给你N个点M条边,这M条边是一条一条加进去的 要求你求出加入每一条边时图中极大'K度'子图的大小 极大'K度'子图的意思是 要求出一个有尽量多的点 ...
- mongdb的优势和不足
l 面向文档的数据库. l 一个介于关系型数据库和非关系型数据库之间的产品,是非关系系数据库中功能最丰富,最像关系型数据库的. l 特征是模式自由,schema-free.无需定义表结构. l ...
- noi.ac NA536 【打地鼠】
又一道可写的小清新思维题 其实想到倒着做了,然而还是因为T1害人不浅(我太菜了),所以并没有写 考虑两个局面不同,显然至少打了一次地鼠,基于操作的颜色覆盖性质,我们可以考虑把操作倒着做,对于一个X点, ...
- 2018年最佳JavaScript数据可视化和图表库
现在有很多图表库,但哪一个最好用?这可能取决于许多因素,如业务需求,数据类型,图表本身的目的等等.在本文中,每个JavaScript图表库将与一些关键因素进行比较,包括图表类型,商业或免费和开源状态. ...