shell控制流结构笔记

man  test 可以看见这些

比较符号:-lt小于 -le小于等于   -gt大于   -ge大于等于  -ne不等于   -eq等于

< 小于(需要双括号),如:(("$a" < "$b"))

<= 小于等于(需要双括号),如:(("$a" <= "$b"))

> 大于(需要双括号),如:(("$a" > "$b"))

>= 大于等于(需要双括号),如:(("$a" >= "$b"))

=或==(需要双括号),如:if [ "$a" == "$b" ]

-b file            若文件存在且是一个块特殊文件,则为真

-c file            若文件存在且是一个字符特殊文件,则为真

-d file            若文件存在且是一个目录,则为真

-e file            若文件存在,则为真

-f file            若文件存在且是一个规则文件,则为真

-g file            若文件存在且设置了SGID位的值,则为真

-h file            若文件存在且为一个符合链接,则为真

-k file            若文件存在且设置了"sticky"位的值

-p file            若文件存在且为一已命名管道,则为真

-r file            若文件存在且可读,则为真

-s file            若文件存在且其大小大于零,则为真

-u file            若文件存在且设置了SUID位,则为真

-x file            若文件存在且可执行,则为真

-o file            若文件存在且被有效用户ID所拥有,则为真

-z string          若string长度为0,则为真

-n string          若string长度不为0,则为真

string1 = string2  若两个字符串相等,则为真

string1 != string2 若两个字符串不相等,则为真

if  then else语句:

if 条件 1

then 命令1

elif  条件 2

then  命令2

else

命令3

fi 完成

如果if和then在同一行那命令格式为 if 条件1;then

eg:

#####vim name.sh

#!/bin/bash

#name.sh

echo -n "Enter you name:"

read NAME

if [ "$NAME" == " " ]; then

echo "you did not enter you name"

else

echo "you name is: $NAME"

fi

####保存退出,chmod +x name.sh

#### 运行 ./name.sh

[[email protected] ~]# ./name.sh

Enter you name:tony (这个名字你是输入的)

you name is: tony

eg:copy一个文件,如果文件不存在会提示系统错误的信息,和提示自己给的信息

####vim ifcp.sh

#!/bin/bash

#ifcp.sh

if cp test1.txt myfile.txt; then

echo "copy is successful"

else

echo "`basename $0`:no such test1.txt file" >&2

fi

####保存退出,chmod +x ifcp.sh

####运行 ./ifcp.sh  -n (-n参数可以检查脚本是否有语法错误)

[[email protected] ~]# ./ifcp.sh

cp: cannot stat `test1.txt‘: No such file or directory

ifcp.sh:no such test1.txt file

eg:copy一个文件,文件不存在系统提示的信息不显示在屏幕上,显示提示自己给的信息

####vim ifcp.sh

#!/bin/bash

#ifcp.sh

if cp test1.txt myfile.txt 2>/dev/null; then

echo "copy is successful"

else

echo "`basename $0`:no such test1.txt file" >&2

fi

####保存退出,chmod +x ifcp.sh

####运行 ./ifcp.sh

[[email protected] ~]# ./ifcp.sh

ifcp.sh:no such test1.txt file

eg:copy一个文件,文件存在则提示copy is successful

####vim ifcp.sh

#!/bin/bash

#ifcp.sh

if cp 1.txt myfile.txt 2>/dev/null; then

echo "copy is successful"

else

echo "`basename $0`:no such test1.txt file"

fi

####保存退出,chmod +x ifcp.sh

####运行 ./ifcp.sh

[[email protected] ~]# ./ifcp.sh

copy is successful

[[email protected] ~]# cat myfile.txt

the end

解释:`bsename $0`值显示当前脚本或命令的名字,$0显示会包括当前脚本或命令的路径

>&2重定向到标准错误,输出到屏幕上

eg:一个if---elif---elif--else的语句, -z的参数不知道是什么意思,自己可以man test查看一下,注意空格和分号,引号

#####vim  ifelse.sh

#!/bin/bash

#ifelse.sh

echo -n "Enter your name:"

read NAME

if [ -z $NAME ] || [ "$NAME" = " " ];then

echo "you did not enter a name"

elif [ "$NAME" = "root" ];then

echo "Hello root"

elif [ "$NAME" = "tony" ];then

echo "Hello tony"

else

echo "hi,$NAME"

fi

####保存退出,chmod +x ifelse.sh

####运行 ./ifelse.sh

[[email protected] ~]# ./ifelse.sh

Enter your name:root

Hello root

[[email protected] ~]# ./ifelse.sh

Enter your name:tony

Hello tony

[[email protected] ~]# ./ifelse.sh

Enter your name:jie

hi,jie

case语句:

case值 in

模式1)

命令1

;;

模式2)

命令2

;;

esac

case取值后面必须为单词in,每一模式必须以右括号结束。取值可以为变量或常数,匹配发现取值符合某一模式后,期间

所有命令开始执行直至;;.模式匹配符合*表示任意字符,?表示任意单字符,[..]表示类或范围中任意字符

eg:

######vim case.sh

#!/bin/bash

#case.sh

echo -n "Enter a number from 1 to 3:"

read ANS

case $ANS in

1)

echo "you select 1"

;;

2)

echo "you select 2"

;;

3)

echo "you select 3"

;;

*)

echo "`basename $0`:this is not between 1 and 3 ">&2

exit

;;

esac

#####保存退出,chmod + case.sh

####运行 ./case.sh

[[email protected] ~]# ./case.sh

Enter a number from 1 to 3:1

you select 1

[[email protected] ~]# ./case.sh

Enter a number from 1 to 3:2

you select 2

[[email protected] ~]# ./case.sh

Enter a number from 1 to 3:3

you select 3

[[email protected] ~]# ./case.sh

Enter a number from 1 to 3:5

case.sh:this is not between 1 and 3

for循环:

for 变量名 in 列表

do

命令1

命令2

done

当变量值在列表里,for循环即执行一次所有命令,使用变量名访问列表中取值,命令可为任何有效的shell命令和语句,变量名

为任何单词,in列表用法是可选的,如果不用它,for循环使用命令行的位置参数。in列表可以包含替换,字符串和文件名。

eg:in后面的参数为一个列表

#####vim for1.sh

#!/bin/bash

#for1.sh

for loop in 1 2 3 4 5

do

echo $loop

done

####保存退出,chmod +x for1.sh

####运行./for1.sh

[[email protected] ~]# ./for1.sh

1

2

3

4

5

eg:in后面的参数为一个字符串

#####vim for2.sh

#for2.sh

for loop in "orange red bue grey"

do

echo $loop“

done

####保存退出,chmod +x for2.sh

####运行./for2.sh

[[email protected] ~]# ./for2.sh

orange red bue grey

把for2.sh里面的内容for loop in "orange red bue grey"  改成for loop in orange red bue greyz则in后面的分行显示

eg:in后面的参数为一个命令,``反引号里面的是系统的命令

#####vim for3.sh

#!/bin/bash

#for3.sh

for jie in `cat myfile.txt`

do

echo $jie

done

####保存退出,chmod +x for3.sh

[[email protected] ~]# cat myfile.txt

the end

[[email protected] ~]# ./for3.sh

the

end

eg:一个for和if结合的列子

####vim for4.sh

#!/bin/bash

#for4.sh

echo "zhe li mian end you yi ge end" >myfile.txt

for JIE in `cat myfile.txt`

do

if [ "$JIE" = "end" ];then

echo "it is:$JIE"

else

echo "it is not end,it is:$JIE"

fi

done

#####保存退出,chmod +x for4.sh

####运行./for4.sh

[[email protected] ~]# ./for4.sh

it is not end,it is:zhe

it is not end,it is:li

it is not end,it is:mian

it is:end

it is not end,it is:you

it is not end,it is:yi

it is not end,it is:ge

it is:end

until循环:

until 条件

do

命令1

命令2

...

done

条件可以为任意测试条件,测试发生在循环末尾,因此循环至少执行一次

eg:检查磁盘空间的大小,每隔300s检查磁盘空间,超过指定的数字就发邮件给root用户

######vim until.sh

#!/bin/bash

#until.sh

Part="/home"

LOOK_OUT=`df | grep "$Part" | awk ‘{print $5}‘| sed ‘s/%//g‘`

echo $LOOK_OUT

until [ " $LOOK_OUT" -gt "90" ]

do

echo "this Filesystem is empty" |mail root

LOOK_OUT=`df | grep "$Part" | awk ‘{print $5}‘| sed ‘s/%//g‘`

sleep 300

done

#####保存退出,chmod +x until.sh

####运行./until.sh

while循环:

while 命令

do

命令1

命令2

...

done

在while和都之间虽然通常指使用一个命令,但可以放几个命令,命令通常用作测试条件

eg:

######vim while.sh

#!/bin/bash

#while.sh

NAME=name.txt

if [  -e "$NAME"  ];then

echo -e "zhui jia \n jin qu \n yi juhua " >> $NAME

else

touch $NAME

echo -e "zhe ge wen jian \n shi xin \n jian de " > $NAME

fi

while read LINE

do

echo $LINE

done < $NAME

######保存退出,chmod +x while.sh

####运行 ./while.sh

if [  -e "$NAME"  ]    //判断这个文件有木有,若果有则会追加一句话,没有则会新建一个文件,然后会添加一句话

然后通过循环把他显示输出,如果没有这个文件,运行第一遍则只会出现echo -e "zhe ge wen jian \n shi xin \n jian de " > $NAME

这个里面的,如果运行第二遍,则 echo -e "zhe ge wen jian \n shi xin \n jian de " > $NAME会显示一次,然后

echo -e "zhui jia \n jin qu \n yi juhua " >> $NAME会输入一次,运行第三遍,则echo -e "zhui jia \n jin qu \n yi juhua " >> $NAME

会显示更多遍

break控制:

退出循环,如果是在一个嵌入循环里,可以指定n来跳出循环的个数,

eg:

######vim break.sh

#!/bin/bash

#break.sh

while :

do

echo -n "Enter any number [  1...5 ]:"

read  ANS

case  $ANS in

1|2|3|4|5)

echo "Your enter a number between 1 and 5."

;;

*)

echo "Wrong number,bye."

break

;;

esac

done

######保存退出,chmod +x break.sh

####运行 ./break.sh

[[email protected] ~]# ./break.sh

Enter any number [  1...5 ]:1

Your enter a number between 1 and 5.

Enter any number [  1...5 ]:3

Your enter a number between 1 and 5.

Enter any number [  1...5 ]:7

Wrong number,bye.

解释:while : ,while后面接一个: 表示while语句永远为真,用break跳出循环。

continue控制:

跳过循环步

eg:

#####vim breakcontinue.sh

#!/bin/bash

#break.sh

while :

do

echo -n "Enter any number [  1...5 ]:"

read  ANS

case  $ANS in

1|2|3|4|5)

echo "Your enter a number between 1 and 5."

;;

*)

echo -n "Wrong number,continue(y/n?)."

read IS_CONTINUE

case $IS_CONTINUE in

y|yes|Y|Yes)

continue;

;;

*) break

;;

esac

;;

esac

done

######保存退出, chmod +x breakcontinue.sh

#####运行, ./breakcontine.sh

[[email protected] ~]# ./breakcontinue.sh

Enter any number [  1...5 ]:3

Your enter a number between 1 and 5.

Enter any number [  1...5 ]:7

Wrong number,continue(y/n?).y

Enter any number [  1...5 ]:6

Wrong number,continue(y/n?).n

vim check_server.sh

####

#!/bin/bash

echo "this script will to find which service have started"

#to find www service

testing=`netstat -tlun | grep ":80"`

if [ -n "$testing" ];then                ##if no null is true

echo "WWW server has started!"

fi

#to find vsftpd service

testing=`netstat -tlun | grep ":21"`

if [ "$testing" != "" ];then            ###if no null is true

echo "vsftpd server has started!"

fi

#to find ssh service

testing=`netstat -tlun | grep ":22"`

if [ -n "$testing" ];then

echo "SSH server has started!"

fi

#to find mail service

testing=`netstat -tlun | grep ":25"`

if [ "$testing" != ""  ];then

echo "MAIL server has started!"

fi

#####

function功能

格式:

function fname()

{

程序段

}

function的设定一定要在程序的最前面

拥有内建变量,$0表示函数名称,后续接的变量标记为$1,$2,$3....

vim func.sh

###

#!/bin/bash

function printinfo()

{

echo "you choice is"

}

case $1 in

"one")

printinfo;echo $1 | tr -s ‘a-z‘ ‘A-Z‘

;;

"two")

printinfo;echo $1 | tr -s ‘a-z‘ ‘A-z‘

;;

esac

####

shell脚本实现1+2+...+100

vim sum.sh

####

#!/bin/bash

i=0

s=0

while [ "$i" -lt 100 ]

do

i=$(($i+1))

s=$(($s+$i))

done

echo "1+2+3+...+$i=$s"

####

vim sum1.sh

####

#!/bin/bash

s=0

for ((i=0;i<=100;i++))

do

s=$(($s+$i))

done

echo "1+2+..+100=$s"

echo "i=$i"

####

for的另一种格式

vim for.sh

####

#!/bin/bash

for animal in cat dog pig

do

case $animal in

"cat")

echo "$animal miao miao jiao"

;;

"dog")

echo "$animal wang wang jiao"

;;

"pig")

echo "$animal luo luo jiao"

;;

"*")

echo "$animal jiao mei jiao"

;;

esac

done

####

时间: 2024-12-12 10:14:10

shell控制流结构笔记的相关文章

linux学习之shell脚本 ------- 控制流结构

[本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020] 今天开始学一些同其他高级语言一样的shell流控制结构 流控制语句: 1. if语句 语句格式: if condition1 then command1 else condition2 then command2 else command3 fi 注:if语句必须以fi终止. 如果没有condition2,则if语句可以简化为如下: if condition then co

Bash Shell脚本编程笔记总结(一)

本文是上课笔记总结,涉及细节知识点会在以后文章说明! bash脚本编程: 脚本程序:解释器解释执行: shell: 交互式接口:编程环境: shell: 能够提供一些内部命令,并且能通过PATH环境变量找到外部命令:把命令提交给内核启动为进程: 编程环境: 流程控制语句: 顺序执行: 循环执行: 选择执行: 条件测试:真.假 $? 命令的状态结果: 0: 真 1-255: 假 过程式的编程语言的元素:变量.流程.函数.数组 变量:局部变量.本地变量.环境变量.位置参数变量.特殊变量 变量: 数值

shell 脚本实战笔记(5)--搭建资源的镜像服务器

背景: 由于访问国外站点资源, 有时特别慢. 偶尔一次下载, 肯定还能忍受, 对于多次使用或者小团队内部使用, 搭建一个镜像站点, 无疑是个明智的决定. 这边以搭建CDH5的yum源镜像, 作为例子, 具体阐述如何借助apache2搭建一个目录镜像服务, 以及如何复制站点资源. 1) 搭建apache2服务器*) 安装apache2yum install httpdyum info httpd *) 确认配置项/etc/httpd/conf/httpd.conf DocumentRoot "/v

shell 脚本实战笔记(10)--spark集群脚本片段念念碎

前言: 通过对spark集群脚本的研读, 对一些重要的shell脚本技巧, 做下笔记. *). 取当前脚本的目录 sbin=`dirname "$0"` sbin=`cd "$sbin"; pwd` 代码评注:# 以上代码为获取执行脚本所在的目录的常用技巧# sbin=$(dirname $0) 返回可能是相对路径, 比如./ # sbin=$(cd $sbin; pwd) 采用pwd, 来返回脚本所在目录的绝对路径 *). 循环遍历脚本参数 while (( &q

shell脚本介绍,shell脚本结构和执行方式,date命令的用法,shell脚本中的变量简介

笔记内容: 20.1 shell脚本介绍 20.2 shell脚本结构和执行 20.3 date命令用法 20.4 shell脚本中的变量 笔记日期:2017-11-21 20.1 shell脚本介绍 Shell Script,Shell脚本与Windows/Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的.但是它比Windows下的批处理更强大,比用其他编程程序编辑的程序效率更高,它使用了Linux/Unix下的命令

20.1 Shell脚本介绍;20.2 Shell脚本结构和执行;20.3 date命令用法;20.4 Shell脚本中的变量

20.1 Shell脚本介绍 1. shell是一种脚本语言 aming_linux blog.lishiming.net 2. 可以使用逻辑判断.循环等语法 3. 可以自定义函数 4. shell是系统命令的集合 5. shell脚本可以实现自动化运维,能大大增加我们的运维效率 20.2 Shell脚本结构和执行 1. 开头(首行)需要加: #!/bin/bash 2. 以#开头的行作为解释说明: 3. 脚本的名字以.sh结尾,用于区分这是一个shell脚本 4. 执行.sh脚本方法有两种:

shell脚本相关笔记

书写一个shell脚本并使之执行的步骤: 1. 打开一个文件,以 #! bin/bash作为开头 2.在文件中写入一些正确可执行的shell语句 3.保存文件 4.更改文件权限,执行文件 一些小技巧: 如果想在系统中添加自己的命令,比如执行自己建好的shell脚本语句这样一条命令 实例: 1.创建文件cd.sh 内容为: #! bin/bash cd xxx/yyy/zzz 2.保存文件 3.执行文件./cd.sh 现在发现并没有能够打开我们想要打开的目录并进去. 原因是shell还有分父she

shell 脚本实战笔记(6)--集群环境配置检测

1). 背景: 集群部署的时候, 需要一致的配置和环境设置. 对于虚拟机集群, 可以借助镜像拷贝, 复制和还原集群机器. 对与物理机集群而言, 则不一样, 如果机器一多, 多人去操作和配置, 对于成熟精干的团队还好, 对于不熟悉环境的小团队, 由于水平的参差不齐, 往往会导致不一致的环境. 因此无论如何, 写脚本进行自动化的配置和环境校验总是最佳实践. 2). 假设应用场景:*) 系统环境: 安装CDH5, 集群规模为16台机器, 每台机器16CPU, 内存16G, 2块SATA盘共500G,

shell 脚本实战笔记(3)--集群机器的时间同步设置

背景: 有些分布式服务(比如HBase服务), 依赖于系统时间戳, 如果集群各个节点, 系统时间不一致, 导致服务出现诡异的情况. 解决方案: 那如何同步集群各个节点之间的时间? 采用NTP(Network Time Protocol)方式来实现, 选择一台机器, 作为集群的时间同步服务器, 然后分别配置服务端和集群其他机器 1.NTP服务端 *) 安装ntp服务 yum install ntp *) 配置/etc/ntp.conf 这边采用本地机器作为时间的原点 注释server列表 #ser