10、shell编程+流程控制+分支嵌套

SHELL 编程

shell 是一个命令解释器,侦听用户指令、启动这些指令、将结果返回给用户(交互式的shell)

shell 也是一种简单的程序设计语言、利用它可以编写一些系统脚本。

查看本机shell 信息:

cat /etc/shells     --查看本支持的shell

echo $SHELL --查看当前支持的shell

shell 在执行命令时,各种命令的优先级:

别名 -> 关键字 -> 函数 -> 内置命令 -> 脚本

别名:命令的另一种形式,有些情况下可以简化命令的输入,例如可以将很长的命令定义成短别名。

别名的设置:

alias  别名= ‘      ‘

如: alias del=‘rm -i‘

alias ll=‘ls -l‘

alias 显示存在的别名

删除别名:unalias del

bash 初始化:

/etc/profile -> ~/.bash_profile  -> /etc/profile.d/*.sh

-> ~/.bashrc  -> /etc/bashrc

bash 退出时也会执行一些脚本

~/.bash_logout

bash 命令历史

默认情况下,shell 执行的命令会保留下来,保存的地方有两个:内存和~/.bash_history

   保存下来后,可以查看,也可以上翻去执行。

   执行的命令先放在内存中,退出窗口时写到 ~/.bash_history

历史查看:

    history

cat ~/.bash_history

历史命令操作:

!! 执行前一个命令

!n 执行第n号命令,如 !1023

!$ 表示的是上一次命令的最后一个参数

     如:  mkdir /abc

cd !$

与history 相关的设置 (/etc/profile)

vim /etc/profile

HISTSIZE=1000    --内存中保存的最大记录条目

HISTFILESIZE=1000  --历史文件中保留的最大记录条目

HISTFILE           --指定命令历史文件

禁用命令历史:

1) HISTSIZE  设置为0

2) 把历史命令文件链接到/dev/null

如: ln -s /dev/null ~/.bash_history

shell 中执行命令:

1、无条件执行多条命令

;  隔开

如:mkdir /abc ; cd /abc ;cp /etc/yp.conf /abc

2、有条件执行多条命令

&&  前一个命令执行成功后,再执行后一个(前面不成功,后面就不执行了)

||  前一个命令执行不成功时,才执行后一个(前面成功了,后面就不执行了)

如:[[email protected] ~]$ mkdir /aaa && cd /aaa && cp /etc/yp.conf /aa

[[email protected] ~]$ mkdir /aaa || mkdir ~/aaa

3、子shell中执行

(   )   把命令括起来

例:(cd /etc/X11;ls)

4、命令替换 `  ` 或 $()

命令替换是将一个命令作为另一个命令的一部分,执行时被替换的部分先执行,执行的给果作为

参数传给外层命令

如: mkdir `echo $USER`

mkdir "`date`"

mkdir "$(date)"

返回值

每执行一个命令都有它的返回值,返回值用来标识命令的执行成功与否

查看上一个命令执行的返回值:echo $?

0 表示执行成功

shell 中的变量

shell 中的变量没有严格的类型之分,但不同数据还是有不同的运算符。

变量定义:

变量名=值

注:

1、变量名由字母、数字、下划线组成,不能以数字开头

2、变量区分大小写

3、shell 变量一般以大写命名(习惯,但不是要求)

如:a=3

获取变量值的方法:

$变量名

或者

${变量名}   尽可能用这个

如:

a=tt

echo "how are you" > $a_old.txt

echo "how are you" > ${a}_old.txt

shell 的变量运算

1、字符运算

字符连接

shell 的字符连接,无须任何符号,只需拼接起来即可

如:a=3;b=5;c=abcdefg

echo $a$b$c

字符处理

获取长度   ${#变量名}

例:a="abcdefg"

echo ${#a}

模式匹配  =~

如 if [[ $a =~ "^a" ]]

判断变量a是否以a开头

取子串   ${变量名:(+/-)n:n}

+n 从左边第n个位置开始取(第一个字符是0)

-n 从右边第n个位置开始取

n  取多少个

s="abcdefg"

echo ${s:(-3):1}    --从倒数第3个开始,取1个

字符删除   ${变量名#*截止字符}

#*x      从左边开始删,遇到第一个x为止

##*x     从左边开始删,遇到最后一个x为止

%x*     从右边开始删除,遇到第一个x为止

%%d*    从右边开始删除,遇到最后一个x为止

str=/dir1/dir2/dir3/dir4/file.txt

echo {str#*d}    --从左边开始,删到第一个d为止

ir1/dir2/dir3/dir4/file.txt

echo {str##*d}   --从左边开始,删到最后一个d为止

ir4/file.txt

echo ${str%d*}

/dir1/dir2/dir3/

echo ${str%%d*}

/

basename  取完整路径中的文件名

basename /etc/sysconfig/network

network

basename $str

file.txt

2、算术运算

$[  ]

$(( ))

如:echo $[3*5]

echo $((3*8))

但要注意 shell 算数的能力比较差,小数处理有很多问题

如在程序需要计算小数,可用 bc 和 awk

如:

echo "scale=2;5/2" | bc

awk ‘BEGIN {print 5/2}‘

算术运算符:

+ - * / ** %

3、比较运算

数值比较

-eq      等于

-ne 不等于

-gt 大于

-lt 小于

-ge 大于等于

-le 小于等于

字符比较

= 等于

!= 不等于

\> 大于

\< 小于

-z string 字符是否为空

-n string 字符是否不为空

更多的内容可见 man test

-b file

-c file

-d file

-e file

-f file

-g file    文件是否设置了 sgid

-G file

-r file

-w file

-x file

输入输出:

输出:  echo

格式:echo [option] 字符串

option:

-n 不换行

-e 对一些控制符加以处理

如 \t  插入tab

\a   发警告音

输入: read

格式:read [option] [var]

option:

-p   设置提示字符

-s 输入时不显示,如同输入密码

-t n 设置等待时间,如果过了指定的秒数,就返回一个非零的状态

-n n       设置只接收多个字符,达到这个字符个数n后,就自动回车

如:read -p “请输入你的姓名:" name

read -sp “请输入密码:" passwd

read -n 1 "是否继续:" jx

cut

语法:cut [option] [文件名]

option:

-b 取字节

-c 取字符

-f 取字段

-d 指定字段分隔符

范围表示:

N   第N项

N-   从第N项开始,到最后

N-M N-M 项

-M   从1到M

例:只显示 /etc/passwd 中的用户名信息

cut -d: -f1  /etc/passwd

shell 程序一般设计流程:

1、创建一个文件,把完成功能的每一步操作写到脚本文件中

2、设置文件的可执行权限

3、执行文件

例:写一程序从键盘读入两个数,输出最大数

[[email protected] script]# cat if1.sh

#!/bin/bash

#if 使用示例,显示两个数的最大数

read -p "请输入第一个数:" n1

read -p "请输入第二个数:" n2

max=$n1

if [ $n2 -gt $max ]

then

max=$n2

fi

echo "最大数是: $max"

练习:输入三个数,显示最大数

练习:输入一个用户名,判断该用户是否存在,如果存就就显示,系统存在该用户,如果不存在就不显示

判断方法:grep -w ^root /etc/passwd

|

输入的用户名

练习:输入一个文件名,判断这个文件是否存在,并给出相应的提示

练习:输入一个文件名,判断这个文件是否存在,如果存在判断当前用户对这个文件的权限

练习:输入一个文件名,判断是否存在,如果存在,显示属主对这个文件的权限

流程控制:

分支结构

格式一:

if [ condition ]    --注意括号两边有空格,condition 是个条件表达式

then

commands

fi

作用:判断 ccondition 条件是否成立,如果成立,执行中间的命令 commands

不成立不执行。

如: if [ $a -gt $b ]

then

echo "a大于b"

fi

if 可以接 条件表达式  如 if [ $a -gt $b ],也可以直接接一个命令

如 if mkdir /abc  ,这时,会把命令的执行结果作为判断,如果成功执行

就相当于条件成立,如果执行不成功,就相当于条件不成立

格式二:

if [ condition ]

then

commands1

else

commands2

fi

作用:判断 condition 条件是否成立,如果成立,执行commands1,如果不成立

执行 commands2

如:if [ $a -gt $b ]

then

echo "a>b"

else

echo "b>=a"

fi

分支嵌套

分支嵌套是分支中包含分支

普通的分支形式:

if [ condition ]

then

commands

fi

或者

if [ condition ]

then

commands1

else

commands2

fi

嵌套后就:

if [ condition ]

then

if [ condition ]

then

commands1

else

commands2

fi

fi

if [ condition ]

then

if [ condition ]

then

commands1

else

commands2

fi

else

commands3

fi

如:

if [ $a -ge 0 ]

then

if [ $a -gt 0 ]

then

b=$a

else

b=0

fi

else

b=$[$a*-1]

fi

if [     ]

then

commands1

else

commands2

fi

例:输入文件,判断是否存在,如果存在,判断当前用户对它的权限

if [ -f $file ]

then

if [ -r   ...

if [ -w ....

if [ -x ...

else

echo "文件不存在!"

exit 1

fi

用分支嵌套实现:

某产品 199 元一件,买5件或以上9折,10件或以上 85 折,输入购买件数,计算付款。

if [ $n -ge 5 ]

then

else

fi

多条件表示:

逻辑与

if [ condition1 -a condition2 ]

if [ condition1 ] && [ condition2 ]

if [[ condition1 && condition2 ]]

逻辑或

if [ condition1 -o condition2 ]

if [ condition1 ] || [ condition2 ]

if [[ condition1 || condition2 ]]

逻辑非(取反)

!

作业:

1、输入 x 值、 y值,判断所在象限

if [ $x -gt 0 ]

then

if [ $y -gt 0 ]

else

if [ $y

fi

2、输入年份,判断是否为润年

能被4整除,但不能被100整除;或者能被400整除

3、输入一个IP地址,判断是否合法

1)有点分的4段,判断段的方法:

echo $b | awk -F. ‘{print NF}‘

2)第一段段值 1-255,之后的0-255

原文地址:https://www.cnblogs.com/steven9898/p/11331203.html

时间: 2024-08-24 19:41:33

10、shell编程+流程控制+分支嵌套的相关文章

Shell编程 流程控制——流程控制语句

if if<判别命令> then {命令清单1} else {命令清单2} //可省略 fi 注意,<判别命令>通常是上述的 “test<表达式>”.如果只写<表达式> 需要用中括号括起来.(中括号两边要有空格) 如果判别命令返回0(表达式成立)反之则执行else{} 分号是多个语句之间的分割符,当只有一个语句的时候,末尾无需分号,最后一个语句后面与无需分号. 例如: if []; then 完全等效于 if [] then 1 #!/bin/bach 2

shell脚本编程——流程控制

shell脚本编程--流程控制 目   录 一. if 二. case 三. for 四. while 五. until 六. 综合应用 一.if 1.语法 (1)单分支 if  判断条件:then fi (2)双分支 if 判断条件; then 条件为真的分支代码 else 条件为假的分支代码 fi (3)多分支 if 判断条件1; then 条件为真的分支代码 elif 判断条件2; then 条件为真的分支代码 elif 判断条件3; then 条件为真的分支代码 else 以上条件都为假

Linux shell脚本流程控制

博主搬家至51CTO,初来乍到,请多指教. 此次我们来通过实例解析Linux shell脚本流程控制 Linux shell脚本流程控制可分为三类:顺序执行,条件选择执行,循环执行 顺序执行:简单理解就是逐行执行脚本内容,逐行解读,逐行执行.(此处不做实例解析) 条件选择执行:可以理解为先进行某一条件的判断选择,再决定执行怎样的脚本内容.常见语句if case 条件选择语句:if if语句用法: 单分支 if 判断条件;then 条件为真的分支代码 fi 双分支 if 判断条件; then 条件

shell脚本流程控制

shell 脚本变成使用过程中通常需要流程控制,一般情况下是顺序执行,在实际使用过程中根据不同情况需要执行不同命令,这时就用到选择执行比如if.case,有时需要重复执行多次,循环执行比如for.while.until 条件选择执行语句if 单分支 双分支 if 判断条件;then 条件为真的分支代码 fi if 判断条件; then 条件为真的分支代码 else 条件为假的分支代码 fi [[email protected] ~]# vim score.sh   1 #!/bin/bash  

Linux Shell之五 流程控制--选择

流程控制可根据不同的情况做不同的处理,而且可重复执行指定的程序区域,展现程序的生产力.在Bash Shell中,流程控制可以分为两大类: "选择"和"循环": 1.选择:if.case.select 2.循环:for.while.until.select 命令select既属选择也属于循环. 一.命令的结束状态 在Shell中每一个命令执行后,都会传回一个结束状态值,只分两种,如果成功,传回0,失败则传回非0. 当命令执行后,用$?来查看状态返回值,当在Shell进

流程控制--分支结构

Java提供了两种常见的分支控制结构,if语句和switch语句. 其中if语句使用boolean表达式或boolean值作为分支条件来进行分支控制, 而switch语句则用于对多个整形值进行匹配,从而实现分支控制. if条件语句 if语句使用boolean表达式或boolean值作为分支条件来进行分支控制.具体有如下3种形式: 1),if(){} 2),if(){}else{} 3),if(){}else if(){}else{} 如果if,else if,else后的代码块只有一行语句时,则

shell的流程控制介绍

Lnux shell和Java.PHP等语言不一样,它有一套自己的流程控制语句,其中包括条件语句(if,case),循环语句(for,while,until),循环控制语句(continue,break,shift).下面我会通过一些简单明了的例子来介绍下各个语句的使用方法. 一.条件语句     1.if语句 (1)单分支结构 if 判断条件; then 条件为真的分支代码 fi 示例:testif1.sh     #!/bin/bash     a=5     if [[ a -gt 4 ]

Linux Shell之六 流程控制--循环

一.for循环 for循环的运作方式,是将串行的元素一一取出,依序放入指定的变量中,然后重复执行包含的命令区域(在do和done之间),直到所有的元素取 完为止.其中,串行是一些字符串的组合,彼此用$IFS所定义的分割字符(如空格)隔开,这些字段串称为字段. for的语法 for  变量 in 串行     将串行的字段迭代放入变量中 do     命令区域                        重复执行命令区域,知道串行中每个字段均处理过 done !/bin/bash for i i

shell之流程控制

一.if语句.while.for循环各种小例题 1.用户验证 [[email protected] ~]# cat buer.sh #!/bin/bash #user='buer' #password='1234.com' read -p 'please your name:' user read -p 'password:' passwd if [ $user = 'buer' -a $passwd = '1234.com' ];then echo 'login successful' fi