【转】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. MT【63】证明不是周期函数

    证明$f(x)=sinx^2$不是周期函数. 反证:假设是周期函数,周期为$T,T>0$. $$f(0)=f(T)\Rightarrow sinT^2=0\Rightarrow T^2=k_1\ ...

  2. 树剖模板(洛谷P3384 【模板】树链剖分)(树链剖分,树状数组,树的dfn序)

    洛谷题目传送门 仍然是一个板子. 不过蒟蒻去学了一下BIT维护区间修改区间求和,常数果真十分优秀 设数列为\(a_i\),差分数组\(d_ i=a_ i-a_ {i-1}\),前缀和\(s_i=\su ...

  3. 自学工业控制网络之路2.2-PROFINET

    返回 自学工业控制网络之路 自学工业控制网络之路2.2-PROFINET PROFINET由PROFIBUS国际组织(PROFIBUS International,PI)推出,是新一代基于工业以太网技 ...

  4. 自学Python5.4-类 _init_方法

    自学Python之路 自学Python5.4-类  _init_方法 1. 定义一个类 定义一个类的格式如下:

  5. for循环实例

    for循环“池理解”[root@localhost ~]# vi showday.sh#!/bin/bashfor TM in "Morning" "Noon" ...

  6. Linux 常用命令——df, du, ln

    1. df 列出文件系统的整体磁盘使用量 2. du 评估文件系统的磁盘使用量(常用在推估目录所占容量),也可以计算文件或文件夹大小 3. ln 创建实体连接(hard link) 或 符号连接(Sy ...

  7. ASP: Response 对象 错误 'ASP 0251 : 80004005' 解决办法

    Response 对象 错误 'ASP 0251 : 80004005' 超过响应缓冲区限制 这种情况一般是因为需要输出的网页内容太大了,由于asp在输入内容到客户的浏览器上之前,会把需要输出的全部内 ...

  8. MyEclipse 检出新项目后,如果项目名称签名有个红色感叹号

    MyEclipse 检出新项目后,如果项目名称签名有个红色感叹号,那么看 Problems中的错误提示(如果找不到Problems窗口,点 菜单栏的 Window——Reset Perspective ...

  9. JS基本包装类型之三(String)

    1. 基本数据类型和基本包装类型 这里以字符串类型来讲解基本数据类型和基本包装类型. JS中存在基本数据类型String(typeof返回"string"), 也存在基本包装数据类 ...

  10. marshaller unmarshaller解析xml和读取xml

    JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术.该过程中,JAXB也提供了将XML实例文档反向 ...