shell脚本2——控制语句
1、顺序结构体
命令从上往下顺序执行
2、分支结构体
1)判断真假
test 表达式 或者 [ 表达式 ](必须有空格) 真返回0,假返回1 test的别名是[, 参数是]
| 判断表达式 | 记忆 | 解释 |
| !表达式 | ||
| 表达式1 -a 表达式2 | and | 相与 |
| 表达式2 -o 表达式2 | or | |
| -z string | zero | string为空字符串,则返回真0 |
| -n string | not zero | |
| string1 = string2 | 两个字符窗相等,返回0 | |
| string1 != string2 | ||
| INTEGER1 -eq INTEGER2 | equal | |
| INTEGER1 -ge INTEGER2 | greater equal | 大于等于 |
| INTEGER1 -gt INTEGER2 | greater | 大于 |
| INTEGER1 -le INTEGER2 | little equal | 小于等于 |
| INTEGER1 -lt INTEGER2 | little | 小于 |
| INTEGER1 -ne INTEGER2 | not equal | 不等 |
|
文件存在?文件类型? |
||
| -d FILE | dir | 如果FILE是目录则为真 |
| -e FILE 同-a | exists | 是否存在如果是文件则为真 |
| -N | 检测文件自从上次读取之后是否被修改 | |
| -f | 是否是文件,是否是常规文件 | |
| -s | 文件存在且不为空 | |
| -b、-c、-L、S、p |
块文件、字符文件、符号连接 套接字、命名(FIFO)管道 |
|
| 硬连接实际是文件本身 | ||
|
rwx |
||
| -r、-w、-x | read | 存在且可读、、 |
| -g、-u | sgid、suid | 以文件所有用户/组的身份运行 |
|
属主、属组 |
||
| -O、-G | 是否属于当前用户或组 | |
-ef 比较两个文件是否为同一文件系统中相同inode节点的硬连接,
比较文件是否相同用diff -q $file1 $file2,相同返回码0
if [ new -nt old ]; then比较修改时间mtime n——new t——time o——old -ot/-nt 不能对访问时间atime inode修改时间ctime进行测试
字符串比较测试
[ = ] [ != ] [[ > ]] [[ < ]]
-z 空字符串;最好用“”把变量引起来,因为当为空时没引号会是这样 [ -z ]不合法
-n 非空字符串;
正则表达式测试
#!/bin/bash
for rpms in /home/lixn/Downloads/*
do
rpmname=`basename $rpms`
if [[ $rpmname =~ .*\.rpm ]];then
echo "$rpmname is a .rpm package"
else
echo "File \"$rpmname\" is not a .rpm name"
fi
done
也有类似python正则的(),
if [[ $rpmname =~ (.+)_(.*)_(.*)\.rpm ]]; then
echo “package ${BASH_REMATCH[]}第一个括弧
bash正则表达式
例如:
[lixn@localhost ~]$ [-d learn] && cd learn
bash: [-d: command not found...
[lixn@localhost ~]$ [ -d learn ] && cd learn
[lixn@localhost learn]$
2)if分支语句
if list; then list; [elif list; then list]...[else list] fi;then后可以没有换行符,换行可以用;代替
#!/bin/bash
if [ `id -u` -eq 0 ]; then
PS1='##'
else
PS1='$$'
fi
3) case分支语句,可以使用模式匹配
#!/bin/bash
case $ in
[-]) echo 'digital';;
[a-z]) echo 'lower char';;
[A-Z]) echo 'upper char';;
"Good") echo 'OK';;
*) cd /tmp
touch a
echo "Other";;
esac ;;——表示不再执行其他语句
;;&——表示还要匹配接下来的所有模式
;&——表示接下来的模式已经匹配
3、循环语句
1)for循环语句
for name [ [ in [ word ... ] ] ; ] do list; done
for (( expr1; expr2; expr3 )) ; do list; done
#!/bin/bash
for i in
do
echo -n "$i次|"
done
cd /tmp
for fil in * ; do
[ -f ${fil} ] && mv ${fil} ${fil}.old
[ -d ${fil} ] && break
done total=
for ((i=; i<; i=i+))
do
[ `expr $i % ` -eq ] && continue
total=`expr ${total} \* $i`
done
echo ${total}
2)while循环
while list; do list; done
#!/bin/bash
#通过管道循环读取/etc/passwd内容
cat /etc/passwd | while read line
do
#以:为分割符,只读取第一个字段
user=`awk -F : '{print $1}' <<< ${line}`
echo "Account: ${user}" done
3) select选择语句
PS3="Please Select:"
menus="com|net|org|edu|quit"
IFS="|"
a='Apply '
b=' domain'
select item in $menus
do
case $item in
com) echo "$a$item$b";;
net) echo "$a$item$b";;
org) echo "$a$item$b";;
edm) echo "$a$item$b";;
quit) break;;
esac
done
4)break continue 循环控制
for fil in *
do
if [ $fil = "." -o $fil = ".." ]
then
echo 'x'
continue
fi
echo $fil
[ $fil = '' ] && break
cp -r $fil $fil.old
done
shell脚本2——控制语句的更多相关文章
- shell脚本学习心得
近来主要捣鼓ubuntu,大多数项目中都用到了sh脚本作为启动脚本等,以前只是大概明白如何使用,今天需要自己修改并运行脚本就碰到了很多问题,所以决定静下心来学习一下shell脚本,学习了几个小时,现将 ...
- shell脚本二
在shell脚本一 中,我讨论了shell脚本的语法规范,shell脚本的变量,以及shell脚本的测试语句. 仅仅懂得这些只能写简单的脚本,在简单的脚本中各条语句按顺序执行,从而实现自动化的管理,顺 ...
- Linux运维初级教程(一)Shell脚本
序,掌握shell脚本是linux运维工程师的最基础技能. 一.脚本语言 与高级语言不通,脚本语言运行时需要调用相应的解释器来翻译脚本中的内容. 常见的脚本语言有Shell脚本.Python脚本.ph ...
- 【Shell脚本学习1】Shell简介:什么是Shell,Shell命令的两种执行方式
Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的.Shell既是一种命令语言,又是一种程序设计语言.作为命令语言,它交互式地解释 ...
- shell脚本编写笔记
包含转载内容,转载自http://wenku.baidu.com/link?url=jtCHxEYzgGve6P64U3JRQRgU6nhpGvqFLLpWu9I2Htq6hi9TGLudRFkk7r ...
- Linux系统编程(15)——shell脚本语法
Shell字符串 字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号.单双引号的区别跟PHP类似. 单引号 s ...
- shell 脚本阅读之二——ltp工具下的runltp
#!/bin/sh ################################################################################ ## ## ## ...
- Shell 脚本常用命令
Shell脚本是Linux开发工作中常用的工具,但是我一直没有找到一个适合自己的简明扼要的HandBook.在工作过程中整理了一下,贴在这里已备查看. 1 Shell中的特殊符号 ...
- [转载]关于shell脚本的基本语法
关于shell脚本的基本语法 整理于:2014-03-31,何俭飞,mymladdr@sina.com 一.执行 1.shell脚本如果要被执行,一般地必须要有执行权限"x"(除了 ...
随机推荐
- 记一次EF Core DBContext在Action委托中GC异常的问题.
今天在开发过程中发现.在SaveChanges的时候偶尔会抛出异常:Cannot access a disposed object. A common cause of this error is d ...
- vue 详情跳转至列表页 实现列表页缓存
甲爸爸提了一个需求,希望公众号内的商城能够像app一样,从商品详情页跳转至列表页及其他列表页时,可以实现列表页缓存(数据不刷新.位置固定到之前点的商品的位置) 本来想着scrollBehavior应该 ...
- pycharm(社区版2019.1版本)打开README.md文件卡死解决办法
现象:pycharm(社区版2019.1版本)打开README.md文件卡死 解决办法: 将插件Markdown support前的勾选√去掉,保存修改后重启pycharm即可
- 盘点那些适配Linux的国产常用软件
前几天,10月24日,在这个程序员的节日里,腾讯时隔十一年,更新了QQ for Linux.瞬间,各大技术论坛,群聊,关于Linux的新QQ的话题不断.为什么QQ这么多年不更新QQ for Linux ...
- python的递归函数怎么用
在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数 理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰 使用递归函数需要注意防止栈溢出.由于栈的大小不 ...
- MySQL操作(一)用户及权限
一.mysql 里的所有用户都是存储在数据库mysql的user表里 二.创建普通用户.赋权.撤销权限 的操作 1.创建用户(需要先用root进去mysql)格式:create user '用户名 ...
- python之深拷贝和浅拷贝
1.当拷贝的是不可变数据类型(数值.字符串.元组),不管是深拷贝和浅拷贝,都指向的是同一地址: 2.当拷贝的对象是可变数据类型(列表.字典): (1)当浅拷贝的对象中无复杂子对象,原来值的改变不会影响 ...
- 腾讯云上面部署PHP运行环境
现在云服务器已经很普及了,其价格.安全优势等成为不少开发者的首选.本人由于兴趣爱好,从朋友那边借了一个过来玩了两天,下面就分享整个部署流程吧. 1. 先到腾讯云官网购买服务器,这边就不演示.很简单,跟 ...
- Spring Boot 日志处理你还在用Logback?
▶ Log4j2 性能 https://logging.apache.org/log4j/2.x/performance.html ▶ Spring Boot 依赖与配置 Maven 依赖 <! ...
- post方式实现导出/下载文件
项目需求: 前端需要传入过多的参数给后端,get地址栏不行,只能接受post方式去导出数据 1.get的下载方式 通常下载方式如下: let url = xxxx.action?a=xx&b= ...