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 /oldboy/oldboy.txt

[root@znix ~]# echo $?

0

[root@znix ~]# test -f /oldboy/oldboy

[root@znix ~]# echo $?

1

2.2.2 判断一个目录是否存在

-d 为对目录进行判断,0为存在,1为不存在.

[root@znix ~]# test -d /znix

[root@znix ~]# echo $?

1

[root@znix ~]# test `-d /oldboy/

[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/oldboy.txt ]

[root@znix ~]# echo $?

0

2.3.2 判断成功后,执行下一个命令 &&

判断文件/目录是否存在,判断成功执行后面的内容,输出ok ;判断失败,不执行后面的命令.

[root@znix ~]# [ -f /oldboy/znix.txt ] && echo "ok"

[root@znix ~]# [ -d /oldboy ] && echo "ok"

ok

2.3.3 判断不成功后执行下一条命令 ||

如果这个文件不存在,就创建 (使用 || ), || 表示前面的执行错误了,执行后面的命令.

[root@znix ~]# [ -f /oldboy/znix.txt ] || touch /oldboy/znix.txt

[root@znix ~]# ls -l /oldboy/znix.txt

-rw-r--r-- 1 root root 0 Sep 20 10:31 /oldboy/znix.txt

2.3.3.1 [示例1]如果/root/oldboydir 目录不存在就创建     

[root@znix ~]# [ -d /root/oldboydir ] || mkdir -p /root/oldboydir

[root@znix ~]# ls -ld /root/oldboydir

drwxr-xr-x 2 root root 4096 Sep 20 10:36 /root/oldboydir

2.3.3.2 [示例2]如果/root/oldboydir 目录不存在,就创建这个目录  

使用 && ,前面的执行成功,执行后面的; ! 表示非,不存在.

[root@znix ~]# [ ! -d /root/oldboydir/1 ] && mkdir  -p /root/oldboydir/1

[root@znix ~]# ll -d /root/oldboydir/1

drwxr-xr-x 2 root root 4096 Sep 20 10:41 /root/oldboydir/1

第3章 判断在脚本的使用

3.1.1 中文示例(更好理解)

如果 [ 这个文件存在 ];然后

           提示文件存在

否则

           创建这个文件

果如

3.2 [示例]判断文件是否存在,不存在就创建

3.2.1 第一步 按照格式书写判断语句

if [ -f /root/oldboy.txt ];then

    echo "文件存在"

else

    touch /root/oldboy.txt

fi

3.3 第二步 写入脚本:

写入脚本的时候,注意脚本的基本格式.

[root@znix ~]# vim /server/scripts/if.sh

#!/bin/bash

 

if [ -f /root/oldboy.txt ];then

    echo "文件存在"

else

    touch /root/oldboy.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

时间: 2024-10-05 07:55:50

shell编程下 特殊变量、test / [ ]判断、循环、脚本排错的相关文章

Shell编程学习:分支结构和循环结构

一.if结构 1.单分支结构 if condition then statement1 statement2 ... fi 2.双分支结构 if condition then statement1 statement2 ... else statement3 statement4 fi 3.多分支结构 if condition then statement elif condition2 then statement2 fi 二:case结构 case condition in pattern1

linux下Shell编程--标准的守护进程的启动脚本

一个标准的守护进程的启动脚本: #! /bin/sh WHOAMI=`whoami` PID=`ps -u $WHOAMI | gerp mydaemond | awk '{print $1}'` if (test "$1" = "") then echo "mydaemond [start][stop][version]" exit 0 fi if ( test "$1" = "status") then

Linux C编程与Shell编程在开发实用工具方面的相同点总结

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://dgd2010.blog.51cto.com/1539422/1712280 以whois包中的mkpasswd的源码mkpasswd.c文件为例,    两者都需要做的事情:         (1)在程序运行前需要满足其运行环境,包括声明需要使用哪些库哪些文件,例如C中的条件编译,Shell编程中的部分条件判断,如文件是否存在.是否可执行         (2)具备灵活性和可移

shell编程中if [[ ! ${a} =~ ^[0-9]+ ]]条件判断式如何工作的?

问题描述 shell编程中if [[ ! ${a} =~ ^[0-9]+ ]]条件判断式如何工作的? if [[ ! ${a} =~ ^[0-9]+ ]]这个语句具体是怎么工作的?我只知道这个好像是如果变量a不是以数字开头就执行if语句,但是特别的: =~是什么意思? ^[0-9]+ 是什么意思?另外这个判断使用的是扩展正则表达式? 解决方案 这里只有^[0-9]+是正则表达式,表示一个数字,别的都不是正则. 解决方案二: 只是原样的字符 解决方案三: =~意思是匹配后面的正则式,^是匹配开头,

跟老男孩学Linux运维:Shell编程实战3.2 环境变量

3.2 环境变量 环境变量一般是指用export内置命令导出的变量,用于定义Shell的运行环境,保证Shell命令的正确执行.Shell通过环境变量来确定登录用户名.命令路径.终端类型.登录目录等,所有的环境变量都是系统全局变量,可用于所有子进程中,这包括编辑器.Shell脚本和各类应用. 环境变量可以在命令行中设置和创建,但用户退出命令行时这些变量值就会丢失,因此,如果希望永久保存环境变量,可在用户家目录下的.bash_prof?ile或.bashrc(非用户登录模式特有,例如远程SSH)文

跟老男孩学Linux运维:Shell编程实战3.1 什么是Shell变量

Shell变量的核心基础知识与实践 3.1 什么是Shell变量 1.?什么是变量 在小学或初中时,我们开始接触数学方程式,例如:已知x=1,y=x+1,那么y等于多少? 在上述问题中,等号左边的x和y当时被称为未知数,但在Shell编程里它们是变量名,等号右边的1和x+1则是变量的内容(变量的值).注意,这里的等号符号被称为赋值,而不是等号. 通过上面的例子可以得出一个变量概念的小结论:简单地说,变量就是用一个固定的字符串(也可能是字符.数字等的组合)代替更多.更复杂的内容,该内容里可能还会包

shell编程for循环的问题

问题描述 shell编程for循环的问题 在linux下,应该怎样编程利用for循环实现1+2+..+n? 解决方案 #!/bin/bash total=0 n=100 for ((j=1;j<=n;j++)) do total=`expr $total + $j` done echo "The result is $total" 解决方案二: #! /bin/bash total=0; n=100 for((i=1;i<=n;i++)) do let "tota

脚本-shell编程中随机产生数组里一个变量的代码怎么写?

问题描述 shell编程中随机产生数组里一个变量的代码怎么写? 想写一个与随机抽取有关的脚本,从定义在数组里面的变量抽取,,初学shell编程很多细节不太会,朋友教教我 解决方案 function random() { min=$1; max=$2-$1; num=$(date +%s+%N); echo(num%max+min); } 假设数组长n,先使用random 0 n获得一个随机数a,然后数组[a]就是随机抽的变量 解决方案二: 可以给我讲解下不?不太看得懂,基础太差了

Linux下Shell编程

Linux的shell编程  1.什么是shell? 当一个用户登录Linux系统之后,系统初始化程序init就为每一个用户运行一个称为shell(外壳)的程序. shell就是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动.挂起.停止甚至是编写一些程序.一般的Linux系统都将bash作为默认的shell. 2.几种流行的shell 目前流行的shell有ash.bash.ksh.csh.zsh等,可以用下面的命令来查看sh