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)的更多相关文章

  1. Shell 流程控制-if for case while until break continue

    Shell 流程控制 和Java.PHP等语言不一样,sh的流程控制不可为空,如(以下为PHP流程控制写法): <?php if (isset($_GET["q"])) { ...

  2. 九、Shell 流程控制

    Shell 流程控制 和Java.PHP等语言不一样,sh的流程控制不可为空,如(以下为PHP流程控制写法): <?php if (isset($_GET["q"])) { ...

  3. [Shell]条件判断与流程控制:if, case, for, while, until

    ---------------------------------------------------------------------------------------------------- ...

  4. 吴裕雄--天生自然ShellX学习笔记:Shell 流程控制

    和Java.PHP等语言不一样,sh的流程控制不可为空,如(以下为PHP流程控制写法): <?php if (isset($_GET["q"])) { search(q); ...

  5. 『忘了再学』Shell流程控制 — 33、if条件判断语句(一)

    目录 1.单分支if条件语句 2.双分支if条件语句 (1)示例1 (2)示例2 什么是流程控制? 普通理解:Shell编写的程序是顺序执行的,也就是说第一命令先执行,然后接着执行第二条命令,然后再下 ...

  6. MySQL--视图view、触发器trigger、事务(start transaction)、存储过程(特殊的数据逻辑处理函数)、流程控制(if,case....)

    mysql致力于项目开发及数据库管理之间解耦合(帮忙封装一些数据处理方法,使应用程序的开发者可以专注于应用程序的开发),但受限于不同部门沟通的成本问题,现阶段直接使用的价值不大. 一.视图(只能sel ...

  7. 『忘了再学』Shell流程控制 — 39、特殊流程控制语句

    目录 1.特殊流程控制语句介绍 2.exit语句 3.break语句 4.continue语句 1.特殊流程控制语句介绍 Shell程序或者说其他的程序,都是顺序执行的,也就是第一行执行完再执行第二行 ...

  8. linux shell 流程控制(条件if,循环【for,while】,选择【case】语句实例 --转载

    http://www.cnblogs.com/chengmo/archive/2010/10/14/1851434.html nux shell有一套自己的流程控制语句,其中包括条件语句(if),循环 ...

  9. [转]linux shell 流程控制(条件if,循环【for,while】,选择【case】语句实例

    原文链接:http://www.cnblogs.com/chengmo/archive/2010/10/14/1851434.html linux shell有一套自己的流程控制语句,其中包括条件语句 ...

随机推荐

  1. NET设计模式 第二部分 结构性模式(12):享元模式(Flyweight Pattern)

    享元模式(Flyweight Pattern) ——.NET设计模式系列之十三 Terrylee,2006年3月 摘要:面向对象的思想很好地解决了抽象性的问题,一般也不会出现性能上的问题.但是在某些情 ...

  2. Oracle存储过程和自定义函数笔记

    学习地址:https://www.imooc.com/learn/370 存储过程和存储函数定义:指存储在数据库中供所有用户程序调用的子程序叫做存储过程 .存储函数. 相同点:完成特定功能的程序.区别 ...

  3. DevOps需要的工具

    DevOps需要的工具: 代码管理(SCM):GitHub.GitLab.BitBucket.SubVersion 构建工具:Ant.Gradle.maven 自动部署:Capistrano.Code ...

  4. MyBatis中的@Mapper注解及配套注解使用详解(上)

    前言: 从mybatis3.4.0开始加入了@Mapper注解,目的就是为了不再写mapper映射文件(那个xml写的是真的蛋疼...).很恶心的一个事实是源码中并没有对于这个注解的详细解释 现在我们 ...

  5. Java 可执行jar的manifest编写

    Eclipse:形式, 选中项目右键 命令行形式: 1.编写Java类 2.命令行指定到项目/src文件夹,编译 3.编写manifest文件 4.目录重新定位到bin/classes编译文件目录下, ...

  6. CentOS 7.4 初次手记:第四章 CentOS安全了解

    第四章 CentOS安全了解... 66 第一节 user.group.chmod. 66 I 10位文件属性... 66 II user/group增删改... 67 III user/group配 ...

  7. PL/SQL Developer 使用小技巧

    1.PL/SQL Developer记住登陆密码 在使用PL/SQL Developer时,为了工作方便希望PL/SQL Developer记住登录Oracle的用户名和密码: 设置方法:tools- ...

  8. Django--django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE

    Django序列化时遇到错误: django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESP ...

  9. windows安装mysql数据库并修改密码

    1.下载 MySQL Community Server https://dev.mysql.com/downloads/mysql/ 2.解压 如果想要让MySQL安装在指定目录,那么就将解压后的文件 ...

  10. 测试教程网.unittest教程.1. 基本概念

    From:http://www.testclass.net/pyunit/basic_concept/ unittest是python自带的单元测试框架,有时候又被称为”PyUnit”,是python ...