【转】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 / [ ]判断、循环、脚本排错的更多相关文章

  1. shell编程下 特殊变量、test / [ ]判断、循环、脚本排错

    第1章 shell中的特殊变量 1.1 $# $# 表示参数的个数 1.1.1 [示例]脚本内容 [root@znix ~]# cat /server/scripts/show2.sh #!/bin/ ...

  2. Linux学习——shell编程之环境变量配置文件

    小白学习,在学习中总结! shell编程之环境变量配置文件 一:环境变量配置文件 1 shell编程之环境变量配置 变量类型: 用户自定义变量(本地变量) 环境变量 :定义每个用户的操作环境,如pat ...

  3. 01 shell编程规范与变量

    前言: 大家对shell脚本应该都不算陌生了,如果突然问你什么是shell脚本?是干什么用的?由什么组成以及怎么使用?变量的概念是什么?作用范围是什么?变量间的算术运算怎么表示?你能很容易答出来吗 本 ...

  4. shell编程下

    第1章 Whicle 1.1 while循环语句 在编程语言中,while循环(英语:while loop)是一种控制流程的陈述.利用一个返回结果为布林值(Boolean)的表达式作为循环条件,当这个 ...

  5. linux学习(七)Shell编程中的变量

    目录 shell编程的建立 shell的hello world! Shell的环境变量 使用和设置环境变量 Shell的系统变量 用户自定义变量 @(Shell编程) shell编程的建立 [root ...

  6. Shell 编程基础之变量和环境变量

    一.变量赋值和引用 Shell 编程中,使用变量无需事先声明,同时变量的命名不惜遵循如下规则: 首个字符必须为字母(a-z,A-Z)或者_ 变量名中间不能有空格,可以使用_连接 不能使用其他表达符号 ...

  7. shell编程之环境变量

    在shell编程里我们首先接触到的是环境变量,常用命令说明 1. 使用echo命令查看单个环境变量.例如: echo $PATH 2. 使用env查看所有环境变量.例如: env 3. 使用set查看 ...

  8. Linux_(4)Shell编程(下)

    五.shell流程控制1.一重分支if 语句语法格式:if condition then command1 fi末尾的fi就是if倒过来. 写成一行: if condition; then comma ...

  9. SHELL编程规范与变量

    shell相比标准开发语言比如JAVA,C,C++来说还是比较简单的,其实就是一堆命令的集合而已,初学者从简单的shell脚本学起,至于shell编程还是要有编程思想在里面,因此,循序渐进很重要,先研 ...

随机推荐

  1. 【BZOJ2671】Calc(莫比乌斯反演)

    [BZOJ2671]Calc 题面 BZOJ 给出N,统计满足下面条件的数对(a,b)的个数: 1.\(1\le a\lt b\le N\) 2.\(a+b\)整除\(a*b\) 我竟然粘了题面!!! ...

  2. 【BZOJ1856】[SCOI2010]字符串(组合数学)

    [BZOJ1856][SCOI2010]字符串(组合数学) 题面 BZOJ 洛谷 题解 把放一个\(1\)看做在平面直角坐标系上沿着\(x\)正半轴走一步,放一个\(0\)看做往\(y\)轴正半轴走一 ...

  3. MVC 4 图片的上传及显示

    1 首先我们看一下如何上传 1.1 view 上传页面: 1: @using (Html.BeginForm("Create", "Achievement", ...

  4. 启用SharePoint 的 web application下面所有站点“备用语言”

    clear $PSSnapin = Add-PsSnapin Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue | Out-N ...

  5. 【转】cJSON 源码阅读笔记

    前言 cjson 的代码只有 1000+ 行, 而且只是简单的几个函数的调用. 而且 cjson 还有很多不完善的地方, 推荐大家看完之后自己实现一个 封装好的功能完善的 cjson 程序. json ...

  6. Java NIO -- DatagramChannel

    Java NIO中的DatagramChannel是一个能收发UDP包的通道.操作步骤:打开 DatagramChannel接收/发送数据 代码举例: package com.soyoungboy.n ...

  7. 移动端利用-webkit-box水平垂直居中

    首先,必须要在父元素上用display:-webkit-box. 一.box的属性: 1.box-orient 用于父元素,用来确定父容器里子容器的排列方式,是水平还是垂直. horizontal在水 ...

  8. 省选模拟赛第四轮 B——O(n^4)->O(n^3)->O(n^2)

    一 稍微转化一下,就是找所有和原树差距不超过k的不同构树的个数 一个挺trick的想法是: 由于矩阵树定理的行列式的值是把邻接矩阵数值看做边权的图的所有生成树的边权乘积之和 那么如果把不存在于原树中的 ...

  9. hashlib模块(二十八)

    # 1.什么叫hash:hash是一种算法(3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法),该算法接受传入的 ...

  10. PHP的内存限制 Allowed memory size of 134217728 bytes exhausted (tried to allocate 1099 bytes) in

    Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 1099 bytes) in   Fa ...