Shell流程控制(if,else,case,while,for,until)
1.条件选择
1.1.if 语句
语法
#!/bin/bash MATH_SCORES="$1"
NAME="$2" if [ -z "${MATH_SCORES}" ]
then
printf "The command requires that options have a scores.\n"
printf "What's ths scores of your math? :"
read MATH_SCORES
fi if [ -z "${NAME}" ]
then
printf "The command requires that options have a student's name.\n"
printf "What's your name? :"
read NAME
fi if [ "${NAME}" = "sunny" ]
then
printf "No, sunny is a teacher.\nPleae input your name,ok? "
read NAME
printf "My god,i think, you are bann sunny, excuse me.\n\n"
else
printf "\n"
fi if [ "${MATH_SCORES}" -ge ]
then
echo "Your scores is very good.Congratulations to you, ${NAME}."
echo "I hope that you are't sunny."
else if [ "${MATH_SCORES}" -ge ]
then
echo "Congratulations. ${NAME}"
elif [ "${MATH_SCORES}" -ge ]
then
echo "Come on ${NAME}."
else
echo "What are you interested in? Please tell me, maybe i can help you, "${NAME}" ?"
fi;fi echo
[web@h p]$ ./if_then_else.sh
The command requires that options have a student's name.
What's your name? :sunny
No, sunny is a teacher.
Pleae input your name,ok? sunny
My god,i think, you are bann sunny, excuse me. What are you interested in? Please tell me, maybe i can help you, sunny ?
语句体,以fi结束。
利用选择语句判断变量获取成功与否
JAVA_PATH=`which java >/dev/null`
if [ "x$JAVA_PATH" != "x" ]; then
JAVA_PATH=`dirname $JAVA_PATH >/dev/null`
JRE_HOME=`dirname $JAVA_PATH >/dev/null`
fi
1.2.case 语句
双分号不能少;跟if一样,语句体也需要结束符。
找工作时,根据应聘岗位不同,给出不同应征者相应的联系人信息。
#!/bin/bash echo -e "\v\tRecruitment Announcement"
echo "Are you ready to apply for any job?"
echo "1 accounting"
echo "2 cashier"
echo "3 secretary"
echo -e "\vPlease enter a number to select the corresponding positions." read NUM
case $NUM in
)
printf "call mr wang. number is 1124\n"
;;
)
printf "call miss li. number is 1233.\n"
;;
)
printf "call miss ji. number is 1367.\n"
;;
*)
printf "If you want to make a lot of money, to be a seller. call 1498.\n"
;;
esac
在输出交互信息时,使用了echo命令。当要格式化输出时,需要来回调试。这里仅仅为了熟悉下case语句的语法,更好的方法在“cat”博文里重新实现。
使用case语句,处理坐标移动的结果。
#!/bin/bash echo $(date)
X1=
Y1= echo "L - turn left"
echo "R - turn right"
echo "U - turn up"
echo "D - turn down"
read INS case $INS in
L)
X1=$[${X1}-]
;;
R)
X1=$[${X1}+]
;;
U)
Y1=$[${Y1}+]
;;
D)
Y1=$[${Y1}-]
;;
[[:lower:]])
printf "Uppers, please.\n"
;;
*)
;;
esac echo "x = ${X1} y = ${Y1}"
输出脚本的帮助信息:
case "$1" in
"")
run_it
;;
-r|--read)
read_it
;;
-v|--version)
display_version
;;
--clear)
clear_TMPFILE
;;
-h|--help)
display_help
;;
*)
echo "findTom -h"
display_help
;;
esac
如果“"-v|--version"”,以双引号表示,会出现意外。要是想用,就该这么写:“"-v"|"--version"”。
1.3.通过辑判断实现条件测试
[view@file donatello]$ [ -gt ] && echo "true " || echo "false "
false
[view@file donatello]$ [ ! -gt ] && echo "true " || echo "false "
true [work@file donatello]$ [ ! -gt ] && ( echo -n "true, "; echo "exit 0" ) || ( echo -n "false, "; echo "exit 1" )
true, exit
[work@file donatello]$ [ -gt ] && ( echo -n "true, "; echo "exit 0" ) || ( echo -n "false, "; echo "exit 1" )
false, exit
2.循环
2.1.for循环
语法格式:
for name[ [in [words…] ] ; ] do commands; done
for ((expr1;expr2;expr3)) ; do commands; done
[web@h p]$ ls >> java.dir
[web@h p]$ cat java.sh
#!/bin/bash for i in $(cat java.dir)
do
echo $i
done
计算1加到10
#!/bin/bash declare -i sum=
for i in {..}
do
sum=$((sum+i))
done echo sum = $sum #!/bin/bash sum=
for i in $(seq )
do
sum=$((sum+i))
done echo sum = $sum
for 语句不带列表,就从命令行获取列表信息
[web@h p]$ cat t1.sh
#!/bin/bash for i
do
echo $i
done
[web@h p]$ sh t1.sh ls
ls
[web@h p]$ sh t1.sh `ls`
类C风格(体现在“for”语句中、以及循环体中;变量不需要“$”符号)
#!/bin/bash SUM=
MAX=
MIN= for ((i=MIN; i<= MAX; i++))
do
SUM=$[SUM+i]
done echo "From ${MIN} add to ${MAX} is $SUM."
2.2.循环until、while
条件判断时如果涉及了命令的返回值,该值不管返回了0还是1之类,都需要跟数字比较来控制程序的运行。
#语法
until test-commands; do consequent-commands; done
while test-commands; do consequent-commands; done
while循环是条件满足时开始执行;until循环是条件不满足时开始循环。
举个例子,条件为假时,才能执行循环体语句:
#!/bin/bash
until false
do
echo -n '-'
sleep
echo -e -n '\b\'
sleep
echo -e -n '\b-'
sleep
echo -e -n '\b/'
sleep
echo -e -n '\b*'
done
若是换作了条件满足时执行循环体语句的情况,就可以选择while语句。
while还可以直接读取文件,在done语句处“done < /path/to/file”。查看系统默认挂载的特殊文件系统:
#!/bin/bash
# while read LINE; do
echo $LINE | grep -v dev &> /dev/null
if [ $? -eq ]; then
echo $LINE | awk '{print $1}' | grep -v boot
fi
done < /etc/fstab
bash脚本调试
检查脚本语法、调试执行脚本
$ bash -n adduser.sh
$ bash -x adduser.sh
shell脚本追踪
在测试脚本时,可以使用set命令进行运行时的追踪。在脚本中加入一行“set -x”;以“+”开头的行,就是获得的追踪内容(程序的执行过程)。
[root@right mag]# cat tes.sh
#!/bin/bash set -x
read -p "How old are you? " answer
if [ $answer == "" ]; then
echo "Yes, very good."
else
echo "No, i don't want say anyting."
fi exit
[root@right mag]# ./tes.sh
+ read -p 'How old are you? ' answer
How old are you?
+ '[' == ']'
+ echo 'Yes, very good.'
Yes, very good.
+ exit
[root@right mag]# ./tes.sh
+ read -p 'How old are you? ' answer
How old are you?
+ '[' == ']'
+ echo 'No, i don'\''t want say anyting.'
No, i don't want say anyting.
+ exit
看看没有追踪的执行过程:
[root@right mag]# ./tes.sh
How old are you?
No, i don't want say anyting.
Shell流程控制(if,else,case,while,for,until)的更多相关文章
- Shell 流程控制-if for case while until break continue
Shell 流程控制 和Java.PHP等语言不一样,sh的流程控制不可为空,如(以下为PHP流程控制写法): <?php if (isset($_GET["q"])) { ...
- 九、Shell 流程控制
Shell 流程控制 和Java.PHP等语言不一样,sh的流程控制不可为空,如(以下为PHP流程控制写法): <?php if (isset($_GET["q"])) { ...
- [Shell]条件判断与流程控制:if, case, for, while, until
---------------------------------------------------------------------------------------------------- ...
- 吴裕雄--天生自然ShellX学习笔记:Shell 流程控制
和Java.PHP等语言不一样,sh的流程控制不可为空,如(以下为PHP流程控制写法): <?php if (isset($_GET["q"])) { search(q); ...
- 『忘了再学』Shell流程控制 — 33、if条件判断语句(一)
目录 1.单分支if条件语句 2.双分支if条件语句 (1)示例1 (2)示例2 什么是流程控制? 普通理解:Shell编写的程序是顺序执行的,也就是说第一命令先执行,然后接着执行第二条命令,然后再下 ...
- MySQL--视图view、触发器trigger、事务(start transaction)、存储过程(特殊的数据逻辑处理函数)、流程控制(if,case....)
mysql致力于项目开发及数据库管理之间解耦合(帮忙封装一些数据处理方法,使应用程序的开发者可以专注于应用程序的开发),但受限于不同部门沟通的成本问题,现阶段直接使用的价值不大. 一.视图(只能sel ...
- 『忘了再学』Shell流程控制 — 39、特殊流程控制语句
目录 1.特殊流程控制语句介绍 2.exit语句 3.break语句 4.continue语句 1.特殊流程控制语句介绍 Shell程序或者说其他的程序,都是顺序执行的,也就是第一行执行完再执行第二行 ...
- linux shell 流程控制(条件if,循环【for,while】,选择【case】语句实例 --转载
http://www.cnblogs.com/chengmo/archive/2010/10/14/1851434.html nux shell有一套自己的流程控制语句,其中包括条件语句(if),循环 ...
- [转]linux shell 流程控制(条件if,循环【for,while】,选择【case】语句实例
原文链接:http://www.cnblogs.com/chengmo/archive/2010/10/14/1851434.html linux shell有一套自己的流程控制语句,其中包括条件语句 ...
随机推荐
- TCP/UDP端口列表(WIKIpedia)
计算机之间依照互联网传输层TCP/IP协议不同的协议通信,都有不同的对应端口.所以,利用短信(datagram)的UDP,所采用的端口号码不一定和采用TCP的端口号码一样.以下为两种通信协议的端口列表 ...
- require 与 include 的区别
require 的英文意思是 需要,有赖于.如果使用了这条语句,也就是告诉PHP内核,我这个程序需要这个文件,有赖于这个文件.或者通俗点儿讲就是:我要她!所以,PHP如果发现require参数中的文件 ...
- Ntfs 下的链接符号创建
熟悉过 Unix/Linux 都应该知道,Unix/Linux 用 ln 建立硬链接,ln -s 建立软链接(符号链接). 硬链接和符号链接的区别 Ntfs下的也有链接符: 内置命令:mklink ...
- Java 中统计文件中出现单词的次数练习
统计英文article.txt文件中出现hello这个单词的次数 这个是article.txt文件内容 { hello The Royal Navy is trying hello to play h ...
- 黄聪:wordpress如何携带cookie模拟浏览器访问网站
$args = array( 'user-agent' => 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, li ...
- [蓝桥杯]ALGO-81.算法训练_动态数组使用
从键盘读入n个整数,使用动态数组存储所读入的整数,并计算它们的和与平均值分别输出.要求尽可能使用函数实现程序代码.平均值为小数的只保留其整数部分. 样例输入: 样例输出: 样例输入: 样例输出: 题目 ...
- Google 新实现的Protobuf RPC: grpc
转自: http://www.dongliu.net/post/622450 Google 刚刚开源了grpc, 一个基于HTTP2 和 Protobuf 的RPC 实现. Protobuf 本身虽 ...
- Windows 使用windump进行循环抓包
准备工作 1.下载tcpdump http://www.winpcap.org/windump/ 2.下载WinPcaphttp://www.winpcap.org/install/bin/WinP ...
- 了解轮询、长轮询、长连接、websocket
业务开发中我们往往会有一些需要即时通信的场景,比如微信扫码登录.聊天功能. 下面这四种方式都可以实现即时通信. 轮询: 浏览器通过定时器每隔一段时间向服务器端发送请求,服务器端收到请求并响应请求.没有 ...
- 轻松快速实现MySql数据向SQLServer数据转移
转移数据的方式其实园子里各位亲友已经写过不少了,这里挑一种常用的ODBC数据转移,主要是把每个步骤尽可能完善讲到,下次直接按文章从头到尾看一遍,可以在最短时间完成数据转移. 这里用到的工具有MYSQL ...