【转】shell编程下 特殊变量、test / [ ]判断、循环、脚本排错
【转】shell编程下 特殊变量、test / [ ]判断、循环、脚本排错
第1章 shell中的特殊变量
1.1 $#
$# 表示参数的个数
1.1.1 【示例】脚本内容
[root@znix ~]# cat /server/scripts/show2.sh
#!/bin/bash
echo $1 $2 $#
if [ $? == 0 ];then
echo "OK"
fi
实例1-1 执行的不同结果
[root@znix ~]# sh /server/scripts/show2.sh 1 2 3 4 6
1 2 5
[root@znix ~]# sh /server/scripts/show2.sh aa bb
aa bb 2
[root@znix ~]# sh /server/scripts/show2.sh aa bb cc
aa bb 3
1.2 $?
$?表示:上一个命令执行后的状态
状态为0 表示执行正确
状态非0 表示执行错误
1.2.1 【示例】$?的使用
[root@znix ~]# aaa
-bash: aaa: command not found
[root@znix ~]# echo $?
127
[root@znix ~]# sed
Usage: sed [OPTION]...
[root@znix ~]# echo $?
4
[root@znix ~]# sh /server/scripts/show2.sh aa bb
aa bb 2
[root@znix ~]# echo $?
0
1.3 【了解】编译安装的过程
切菜备菜 ./configure
炒菜 make
上菜 make install
1.4 如何向变量中存放内容---【read命令】
1.4.1 read命令使用
[root@znix ~]# read a
惨绿少年
[root@znix ~]# echo $a
惨绿少年
1.4.2 让执行命令后出现提示信息
-p 为显示提示信息。p作为输出,一定要写在其他参数的最后面。
[root@znix ~]# read -p "请输入:" a
请输入:呵呵
[root@znix ~]# echo $a
呵呵
1.4.3 设置等待(超时)的时间
-t5 等待5秒
[root@znix ~]# read -t5 -p "请输入密码:" a
请输入密码:
[root@znix ~]#
[root@znix ~]# read -t5 -p "请输入密码:" a
请输入密码:123
1.4.4 不显示输入的内容
-s 输入的时候不显示输入内容。
[root@znix ~]# read -s -t50 -p "请输入密码:" a
请输入密码:
[root@znix ~]# echo $a
admin
1.5 将read命令运用到脚本上
1.5.1 修改计算器脚本的内容,让他能够更智能。
[root@znix ~]# vim /server/scripts/cal.sh
#!/bin/bash
read -p "input 1st num:" a
read -p "input 2st num:" b
1.5.2 测试脚本
[root@znix ~]# sh /server/scripts/cal.sh
input 1st num:1
input 2st num:2
0.5
3
-1
2
1.5.3 简化命令
1.5.3.1 read 可以同时读入多个字符。
[root@znix ~]# read -p "输入第一个 第二关数字:" a b
输入第一个 第二关数字:123 456
[root@znix ~]# echo $a $b
123 456
1.5.3.2 修改脚本的内容。
使用一条read命令,读取两个参数。
[root@znix ~]# vim /server/scripts/cal.sh
#!/bin/bash
read -p "input 1st&2st num:" a b
awk -vnum1=$a -vnum2=$b 'BEGIN{print num1/num2}'
awk -vnum1=$a -vnum2=$b 'BEGIN{print num1+num2}'
awk -vnum1=$a -vnum2=$b 'BEGIN{print num1-num2}'
awk -vnum1=$a -vnum2=$b 'BEGIN{print num1*num2}'
"/server/scripts/cal.sh" 15L, 355C written
1.5.3.3 测试脚本。
⚠注意 : 同时传入两个参数的时候,参数之间要使用空格分割.
[root@znix ~]# sh /server/scripts/cal.sh
input 1st&2st num:1 2
0.5
3
-1
2
第2章 判断一个 文件/目录 是否存在
2.1 几种思路:
cat + $?'
ls + $?
test命令
2.2 test命令实例
test命令不会自己输出执行的结果,配合$?查询上一条命令是否执行成功,就能够判断是否存在这个文件或目录.
2.2.1 判断一个文件是否存在
-f 为判断的对象是文件,0为存在,1为不存在
[root@znix ~]# test -f /clsn/clsn.txt
[root@znix ~]# echo $?
0
[root@znix ~]# test -f /clsn/clsn
[root@znix ~]# echo $?
1
2.2.2 判断一个目录是否存在
-d 为对目录进行判断,0为存在,1为不存在.
[root@znix ~]# test -d /znix
[root@znix ~]# echo $?
1
[root@znix ~]# test `-d /clsn/
[root@znix ~]# echo $?
0
2.3 使用 [ ] 进行判断
⚠使用[ ]的时候注意中间的空格,两边都要有两个空格
[ ]与test命令的功能相似,可以进行判断,相比test命令更为便捷
2.3.1 [ ]判断一个文件是否存在
与test命令一样 [ ] 判断的结果也0为存在,1为不存在
[root@znix ~]# [ -f /zinx.txt ]
[root@znix ~]# echo $?
1
[root@znix ~]# [ -f /root/clsn.txt ]
[root@znix ~]# echo $?
0
2.3.2 判断成功后,执行下一个命令 &&
判断文件/目录是否存在,判断成功执行后面的内容,输出ok ;判断失败,不执行后面的命令.
[root@znix ~]# [ -f /clsn/znix.txt ] && echo "ok"
[root@znix ~]# [ -d /clsn ] && echo "ok"
ok
2.3.3 判断不成功后执行下一条命令 ||
如果这个文件不存在,就创建 (使用 || ), || 表示前面的执行错误了,执行后面的命令.
[root@znix ~]# [ -f /clsn/znix.txt ] || touch /clsn/znix.txt
[root@znix ~]# ls -l /clsn/znix.txt
-rw-r--r-- 1 root root 0 Sep 20 10:31 /clsn/znix.txt
2.3.3.1 [示例1]如果/root/clsndir 目录不存在就创建
[root@znix ~]# [ -d /root/clsndir ] || mkdir -p /root/clsndir
[root@znix ~]# ls -ld /root/clsndir
drwxr-xr-x 2 root root 4096 Sep 20 10:36 /root/clsndir
2.3.3.2 [示例2]如果/root/clsndir 目录不存在,就创建这个目录
使用 && ,前面的执行成功,执行后面的; ! 表示非,不存在.
[root@znix ~]# [ ! -d /root/clsndir/1 ] && mkdir -p /root/clsndir/1
[root@znix ~]# ll -d /root/clsndir/1
drwxr-xr-x 2 root root 4096 Sep 20 10:41 /root/clsndir/1
第3章 判断在脚本的使用
3.1.1 中文示例(更好理解)
如果 [ 这个文件存在 ];然后
提示文件存在
否则
创建这个文件
果如
3.2 [示例]判断文件是否存在,不存在就创建
3.2.1 第一步 按照格式书写判断语句
if [ -f /root/clsn.txt ];then
echo "文件存在"
else
touch /root/clsn.txt
fi
3.3 第二步 写入脚本:
写入脚本的时候,注意脚本的基本格式.
[root@znix ~]# vim /server/scripts/if.sh
#!/bin/bash
if [ -f /root/clsn.txt ];then
echo "文件存在"
else
touch /root/clsn.txt
fi
3.3.1 第三步 测试脚本
[root@znix ~]# sh /server/scripts/if.sh
文件存在
3.4 在脚本中进行判断的格式
|
符号 |
参数 |
含义 |
英文 |
|
> |
-gt |
大于 |
great than |
|
>= |
-ge |
大于等于 |
great equal |
|
< |
-lt |
小于 |
less than |
|
<= |
-le |
小于等于 |
less than or equal |
|
== |
-eq |
等于 |
equal |
|
!= |
-ne / ! -eq |
不等于 |
not equal |
3.5 [实例]如果cal2.sh脚本的参数个数不等于2,就显示 "命令错误"
3.5.1 书写脚本
!= 表示判断两个是否不相等,如果不想等就显示命令错误
#/bin/bash
if [ $# != 2 ];then
echo "命令错误"
fi
3.5.2 对脚本进行测试.
当参数的个数为2的时候,不会输出,个数不为二的时候输出 命令错误
[root@znix ~]# sh /server/scripts/cal2.sh
命令错误
[root@znix ~]# sh /server/scripts/cal2.sh 1 2
[root@znix ~]# sh /server/scripts/cal2.sh 1 2 3
命令错误
3.6 修改之前的计算器,进行两个数字的加减乘除,在计算器前面加上参数个数判断。当输入的参数是2个的时候执行计算,不为2的时候显示参数错误.
3.6.1 书写脚本
当输入的参数不为2的时候 执行 echo "Usage: NUM1 NUM2", 然后执行 exit..
exit 表示前面的执行完成后就结束(跳出),不会再执行脚本后面的内容.
[root@znix ~]# vim /server/scripts/cal2.sh
#!/bin/bash
if [ $# -ne 2 ];then
echo "Usage: NUM1 NUM2"
exit
fi
a=$1
b=$2
awk -vh=$a -vz=$b 'BEGIN{print h/z}'
awk -vh=$a -vz=$b 'BEGIN{print h+z}'
awk -vh=$a -vz=$b 'BEGIN{print h-z}'
awk -vh=$a -vz=$b 'BEGIN{print h*z}'
3.6.2 测试脚本
当输入的参数个数不为2的时候执行echo 命令
当输入的参数个数为2的时候进行计算
[root@znix ~]# sh /server/scripts/cal2.sh
Usage: NUM1 NUM2 ##提示信息
[root@znix ~]# sh /server/scripts/cal2.sh 22 22
1
44
0
484
第4章 循环语句
4.1 [示例]修改系统时间为20170501到20170520,然后创建文件的名字为2017-05-01.txt
4.1.1 基础姿势
4.1.1.1 for循环可以从后面的数组中读取内容进行操作
循环的格式 :
for hd in znix_{a..z}
do
echo $hd
done
4.1.1.2 执行for 循环语句
[root@znix ~]# for hd in znix_{a..z}
> do
> echo $hd
> done
znix_a
znix_b
znix_c
znix_d
……
znix_z
4.1.2 书写循环语句
do里面可以两条命令同时执行.
for hd in {01..20}
do
date -s "201705$hd"
touch /tmp/date/$(date +%F).txt
done
4.1.3 测试循环语句
[root@znix ~]# for hd in {01..20}
> do
> date -s "201705$hd"
> touch /tmp/date/$(date +%F).txt
> done
Mon May 1 00:00:00 CST 2017
Tue May 2 00:00:00 CST 2017
Wed May 3 00:00:00 CST 2017
……
Sat May 20 00:00:00 CST 2017
4.1.4 检查执行结果
[root@znix ~]# ls /tmp/date/
2017-05-01.txt 2017-05-05.txt 2017-05-09.txt 2017-05-13.txt 2017-05-17.txt
2017-05-02.txt 2017-05-06.txt 2017-05-10.txt 2017-05-14.txt 2017-05-18.txt
2017-05-03.txt 2017-05-07.txt 2017-05-11.txt 2017-05-15.txt 2017-05-19.txt
2017-05-04.txt 2017-05-08.txt 2017-05-12.txt 2017-05-16.txt 2017-05-20.txt
4.2 [实例]优化linux开机启动项目-for循环方法
4.2.1 第一步:确定目标
for name in 要关闭的服务的名字
do
chkconfig $name off
done
4.2.2 第二步:取出要关闭服务的名字
[root@znix ~]# chkconfig |egrep -v "sshd|network|crond|rsyslog|sysstat"|awk '{print $1}'
abrt-ccpp
abrtd
acpid
……
4.2.3 第三步 把名字与for循环结合
for name in `chkconfig |egrep -v "sshd|network|crond|rsyslog|sysstat"|awk '{print $1}'`
do
chkconfig $name off
done
第5章 脚本执行排错
5.1 sh -x 显示脚本详细的执行过程
前面有 + 表示执行过的命令的
前面没有东西,表示输出到屏幕上的内容。
[root@znix ~]# sh -x /server/scripts/cal2.sh
+ '[' 0 -ne 2 ']'
+ echo 'Usage: NUM1 NUM2'
Usage: NUM1 NUM2
+ exit
5.1.1 检查脚本运行中的错误
[root@znix ~]# sh -x /server/scripts/cal2.sh 10 20
+ '[' 2 -ne 2 ']'
+ a=10
+ b=20
+ awk -vh=10 -vz=20 'BEGIN{print h/z}'
0.5
+ awk -vh=10 -vz=20 'BEGIN{print h+z}'
30
+ awk -vh=10 -vz=20 'BEGIN{print h-z}'
-10
+ awk -vh=10 -vz=20 'BEGIN{print h*z}'
200
第6章 vim 快捷键
ctrl + v 按d批量删除
ctrl + v 按x批量删除
dd 删除光标所在行
dG 删除光标所在行到最后一行
D 光标所在位置到行尾的内容
x 删除光标所在位置的一个字符
第7章 昨日回顾
7.1 【sed命令】删除文件中的空行或只有空格的行。
7.1.1 文件内容
[root@znix ~]# cat -A test.txt
znix$
$
linux$
$
good$
$
n$
7.1.2 * 表示前一个字符出现了0次或以上
0次的时候即为^$ 表示空行,以上表示空格的行
[root@znix ~]# sed '/^ *$/d' test.txt
znix
linux
good
n
7.1.3 +表示连续出现至少一次
[root@znix ~]# sed -r '/^ +$|^$/d' test.txt
znix
linux
good
n
7.1.4 !表示取反
[root@znix ~]# sed -n '/^ *$/!p' test.txt
znix
linux
good
n
7.1.5 同样用来取反
[root@znix ~]# sed -nr '/^$|^ +$/!p' test.txt
znix
linux
good
n
7.2 shell编程中的变量
7.2.1 特殊变量(shell脚本中)
$1,$2... 用来传递参数
$0 脚本文件的文件名
$# 脚本中参数的个数
$? 前一条命令是否执行成功
7.2.2 全局变量(环境变量)
常用的 LANG PATH PS1 ……
7.2.3 普通变量
自己定义的变量
7.3 shell编程中与用户有关的环境变量的文件和目录
/etc/profile
/etc/profile.d (目录)
/etc/bashrc
~/.bashrc
~/.bash_profile
【转】shell编程下 特殊变量、test / [ ]判断、循环、脚本排错的更多相关文章
- shell编程下 特殊变量、test / [ ]判断、循环、脚本排错
第1章 shell中的特殊变量 1.1 $# $# 表示参数的个数 1.1.1 [示例]脚本内容 [root@znix ~]# cat /server/scripts/show2.sh #!/bin/ ...
- Linux学习——shell编程之环境变量配置文件
小白学习,在学习中总结! shell编程之环境变量配置文件 一:环境变量配置文件 1 shell编程之环境变量配置 变量类型: 用户自定义变量(本地变量) 环境变量 :定义每个用户的操作环境,如pat ...
- 01 shell编程规范与变量
前言: 大家对shell脚本应该都不算陌生了,如果突然问你什么是shell脚本?是干什么用的?由什么组成以及怎么使用?变量的概念是什么?作用范围是什么?变量间的算术运算怎么表示?你能很容易答出来吗 本 ...
- shell编程下
第1章 Whicle 1.1 while循环语句 在编程语言中,while循环(英语:while loop)是一种控制流程的陈述.利用一个返回结果为布林值(Boolean)的表达式作为循环条件,当这个 ...
- linux学习(七)Shell编程中的变量
目录 shell编程的建立 shell的hello world! Shell的环境变量 使用和设置环境变量 Shell的系统变量 用户自定义变量 @(Shell编程) shell编程的建立 [root ...
- Shell 编程基础之变量和环境变量
一.变量赋值和引用 Shell 编程中,使用变量无需事先声明,同时变量的命名不惜遵循如下规则: 首个字符必须为字母(a-z,A-Z)或者_ 变量名中间不能有空格,可以使用_连接 不能使用其他表达符号 ...
- shell编程之环境变量
在shell编程里我们首先接触到的是环境变量,常用命令说明 1. 使用echo命令查看单个环境变量.例如: echo $PATH 2. 使用env查看所有环境变量.例如: env 3. 使用set查看 ...
- Linux_(4)Shell编程(下)
五.shell流程控制1.一重分支if 语句语法格式:if condition then command1 fi末尾的fi就是if倒过来. 写成一行: if condition; then comma ...
- SHELL编程规范与变量
shell相比标准开发语言比如JAVA,C,C++来说还是比较简单的,其实就是一堆命令的集合而已,初学者从简单的shell脚本学起,至于shell编程还是要有编程思想在里面,因此,循序渐进很重要,先研 ...
随机推荐
- MT【5】蝴蝶效应:一道递推式为二次的数列
评:蝴蝶效应[蝴蝶效应(The Butterfly Effect)是指在一个动力系统中,初始条件下微小的变化能带动整个系统的长期的巨 ...
- luogu4182 [USACO18JAN] Lifeguards P (单调队列优化dp)
显然可以先把被覆盖掉的区间去掉,然后排个序,左.右端点就都是单调的 设f[i][j]表示前i个区间中删掉j个,而且钦定i不能删的最大覆盖长度 (如果不钦定,就要有一个删掉的状态,那我无法确定前面的到底 ...
- Mysql distinct、group by
具体业务场景:根据某些字段组合去重得到所有字段结果. 遇到的error:sql_mode=only_full_group_by. 原因是mysql配置问题. distinct: distinct这个关 ...
- 离线安装.NET 3.5
最近为系统新增一个功能,写完以后进行部署,发现在IIS7上部署没有问题,但是IIS6上部署会出现未知情况,具体表现为取不到数据,估计是IIS6和IIS7直接的差异导致程序异常退出. 为了重现异常,在本 ...
- SpringMvc的Url映射和传参案例
Springmvc的基本使用,包括url映射.参数映射.页面跳转.ajax和文件上传 以前学习的时候写的代码案例,今天整理笔记的时候找到了,很久没有来园子了,发上来当个在线笔记用吧,免的时间长了又忘了 ...
- 【洛谷P1230】智力大冲浪
题目大意:给定 N 项任务,每项任务有一个截至完成时间,若在截止时间之后完成要罚款 \(w_i\) 元,最初有 M 元,怎样完成能够留下最多得钱. 题解:按照罚款从多到少贪心,在查找能够最晚完成一项任 ...
- 安装office自定义项,安装期间出错
由于安装vs2013,导致excel打开时出现问题 [解决方案] 开始菜单-excel图标处,右键快捷菜单-以管理员身份运行-新建空白工作簿 文件-选项-加载项-管理中选择COM加载项,转到-删除Lo ...
- STM32 --- 什么时候打开复用IO的时钟(比如RCC_APB2Periph_AFIO)
需要用到外设的重映射功能时才需要使能AFIO的时钟,包括外部中断. 外部中断(EXTI)中与AFIO有关的寄存器是AFIO-EXTICR1.2.3,它们是用来选择EXTIx外部中断的输入脚之用. 举例 ...
- MYCAT分库分表
一.整体架构 1.192.168.189.130:mysql master服务,两个数据库db_store.db_user,db_store做了主从复制 db_user: 用户表users为分片表 数 ...
- Java语法总结--Java集合类
这一节我们来总结一下Java集合类. Java集合总结 继承与Collection接口的–List接口 List接口本身的特点 常见的继承List接口的实用类 实用类对比 继承与Collection接 ...