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有一套自己的流程控制语句,其中包括条件语句 ...
随机推荐
- 推荐四款 Bug 管理系统,最适合你的才是最好的!
转载自:https://www.jianshu.com/p/e7d3121eaaec 在这个移动互联网的时代,每天都会涌入大量新的 App,想要留住你的用户,必须时刻保持产品创新与系统的稳定.对于 ...
- Docker Dockerfile 一
1.概述 创建Docker镜像的方式有三种 docker commit命令:由容器生成镜像: Dockerfile文件+docker build命令: 从本地文件系统导入:OpenVZ的模板. 关于这 ...
- 开发人员行走Unix的随身四艺
Unix系统永远只会越来越多,开发人员就没必要特意学习它们的安装.配置和管理了,就全部交给集成人员吧. 但开发人员行走于Unix之间,依然有四样东西要熟练. 一.VI 虽然Unix上的 ...
- GitHub版本控制入门(新手学习)
要使用GitHub功能,首先要登陆官方网站https://github.com,注册GitHub账号. 在浏览器中的操作: 新建一个仓库.一个项目一旦被Git控制了版本历史,在GitHub上就有另外一 ...
- [CMAKE] 详解CMakeLists.txt文件
[快速查询]https://cmake.org/cmake/help/v2.8.8/cmake.html#section_Commands 1 CMake简介 CMake是跨平台编译工具,比make更 ...
- 黄聪:is_file和file_exists效率比较
目前在弄文件缓存的时候用到了判定文件存在与否,is_file()还是file_exists()呢?is_file和file_exists两者效率比较起来,谁的运行速度更快呢?还是做个测试吧: 1 2 ...
- Java第03次实验提纲(面向对象1-基本概念)
0. 将码云的项目clone到本机 请参考使用Eclipse Egit与码云管理你的代码中的3 从码云将项目clone到你的电脑 之后就可以在Eclipse中提交本地项目新增或修改的文件.如果在Ecl ...
- 经典面试题目——找到第n个丑数(参考《剑指offer(第二版)》面试题49)
一.题目大意 给你一个数n,要求返回第n个丑数.其中,丑数的定义如下: 丑数是指只包含因子2.3和5的数.(数字1也是丑数,不过是个特例)引用<剑指offer>上的话来说,对于一个数M,如 ...
- STL基础--仿函数(函数对象)
1 首先看个仿函数的例子 class X { public: void operator()(string str) { // 函数调用运算符,返回类型在operator之前 cout << ...
- HTTP之Cookie
cookie是什么 浏览器存储在本地电脑上的一小段文本文件,cookie的存在主要是为了解决http协议无状态的问题,例如通过cookie来判断用户的登录状态,是否是某一个用户等. cookie的结构 ...