一、判断式

  利用 test 命令进行执行结果的判断(例如判断是否存在该文件):关于test  testtest

  示例:结合回传值 $? 进行判断:关于$?:$?

[root@localhost tmp]# test -e add.sh;echo $?

[root@localhost tmp]# test -e ad1d.sh;echo $?

[root@localhost tmp]# test -f add.sh;echo $?

[root@localhost tmp]# test -d add.sh;echo $?

  更多选项,请参考test给出的参考连接手册!

  当然,以下方式也是可以的:

test -e /dmtsai && echo "exist" || echo "Not exist"

  练习:   

  1. 这个文件是否存在,若不存在则给予一个“Filename does not exist”的讯息,并中断程序;  

  2. 若这个文件存在,则判断他是个文件或目录,结果输出“Filename is regular file”或“Filename is directory”

  3. 判断一下,执行者的身份对这个文件或目录所拥有的权限,并输出权限数据!

  // 注意 && || 的使用方式,注意变量的使用方式${},在shell中执行命令,可以使用$(command)或者反引号亦可!

#!/bin/bash
#function:
# 根据使用者输入的文件名,判断文件是否存在,且给出类型
#author:
# jiangbei on 2o17//
read -p "input the filename:" filename
test -e ${filename} || echo "file not exists"
test -f ${filename} && filetype="file"
test -d ${filename} && filetype="dir"
test -r ${filename} && perm="r"
test -w ${filename} && perm="${perm}w"
test -x ${filename} && perm="${perm}x"
echo "the filetype of ${filename} is ${filetype}"
echo "the permisstion is ${perm}"

  当然,除了test之外,还可以使用中括号[]来进行判断,参考https://www.cnblogs.com/china1/p/5935999.html

[ "$name1" = "hello world" ]

  并且,shell还内置了很多内置变量,如参考连接所示http://blog.csdn.net/c289054531/article/details/9195913

   $n           $ 表示第一个参数,$ 表示第二个参数 ...
$# 命令行参数的个数
$ 当前程序的名称
$? 前一个命令或函数的返回码,返回0代表成功
$* 以"参数1 参数2 ... " 形式保存所有参数
$@ 以"参数1" "参数2" ... 形式保存所有参数
$$ 本程序的(进程ID号)PID

  测试内置变量如上:

#!/bin/bash
#function:
# test paras
echo "the script name is ${0}"
echo "total para num is $#"
echo "the whole para is $@"
echo "the first para is ${1}"
echo "the second para is ${2}"

  结果:

[root@localhost tmp]# ./paras.sh p1 p2
the script name is ./paras.sh
total para num is
the whole para is p1 p2
the first para is p1
the second para is p2

  参数支持使用shift偏移,参考https://www.cnblogs.com/sunfie/p/5943753.html

二、条件判断式

  1.简单条件判断式——if-then

if [ 条件判断式 ]; then
当条件判断式成立时,可以进行的指令工作内容;
fi <==将 if 反过来写,就成为 fi 啦!结束 if 之意!

  // 中括号的用法参见上文(仔细参考,例如引号与空格的使用!)

  示例:中括号请在左右保持空格,详细参考上文!——中括号支持 [ op1 -o op2 ] 或 [ ] || [ ] 两种形式!

#!/bin/bash
#介绍与作者略
read -p "please input (Y/N):" yn
if [ "${yn}" == "Y" ] || [ "${yn}" == "y" ]; then
echo "OK,continue"
exit
fi
if [ "${yn}" == "N" ] || [ "${yn}" == "n" ]; then
echo "Oh,interrupt"
exit
fi
echo "unknow command!" && exit

  2.带else的判断

# 一个条件判断,分成功进行与失败进行 (else)
if [ 条件判断式 ]; then
当条件判断式成立时,可以进行的指令工作内容;
else
当条件判断式不成立时,可以进行的指令工作内容;
fi

  更加复杂的判断:

# 多个条件判断 (if ... elif ... elif ... else) 分多种不同情况执行
if [ 条件判断式一 ]; then
当条件判断式一成立时,可以进行的指令工作内容;
elif [ 条件判断式二 ]; then
当条件判断式二成立时,可以进行的指令工作内容;
else
当条件判断式一与二均不成立时,可以进行的指令工作内容;
fi

  示例:

#!/bin/bash
#略
if [ "$1" == "hello" ]; then
echo "hello world!"
elif [ "$1" == "" ];then
echo "please input the arg"
else
echo "your input is not hello"
fi

  // 声明变量的declare,参见:http://linux.51yip.com/search/declare

  3.case多重分支

  就像之前程序的switch类似,不再赘述功能,看语法:

case $变量名称 in <==关键字为 case ,还有变量前有钱字号
"第一个变量内容") <==每个变量内容建议用双引号括起来,关键字则为小括号 )
程序段
;; <==每个类别结尾使用两个连续的分号来处理!
"第二个变量内容")
程序段
;;
*) <==最后一个变量内容都会用 * 来代表所有其他值
不包含第一个变量内容与第二个变量内容的其他程序执行段
exit
;;
esac <==最终的 case 结尾!“反过来写”思考一下!

  

case $变量名 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
*)
默认执行的命令序列
;;
esac

  示例:

#!/bin/bash
#略
case ${} in
"hello")
echo "hello world"
;;
"hehe")
echo "hehe"
;;
*)
echo "error!"
;;
esac

  结果:

  

  注意上面语法写的是模式,支持正则:

#!/bin/bash
read -p "press some key ,then press return :" KEY
case $KEY in
[a-z]|[A-Z])
echo "It's a letter."
;;
[-])
echo "It's a digit."
;;
*)
echo "It's function keys、Spacebar or other ksys."
esac

  提示用户只能指定输入:

case ${num} in
"one")
echo "you choose one"
;;
"two")
echo "you choose two"
;;
"three")
echo "you choose three"
;;
*)
echo "Usage ${0} {one|two|three}"
;;
esac

  4.使用function()进行函数封装

  要注意的是,因为 shell script 的执行方式是由上而下,由左而右, 因此在 shell script 当中的function 的设置一定要在程序的最前面, 这样才能够在执行时被找到可用的程序段喔 (这一点与传统程序语言差异相当大!初次接触的朋友要小心!)!

  语法:

function fname() {
程序段
}

  直接使用函数名即可引用!

#!/bin/bash
#略
function print(){
# -n可以不换行
echo -n "you choose "
}
read -p "input one or two or three" num
case ${num} in
"one")
# tr此处用于大小写转换
print;echo ${num} | tr 'a-z' 'A-Z'
;;
"two")
print;echo ${num} | tr 'a-z' 'A-Z'
;;
"three")
print;echo ${num} | tr 'a-z' 'A-Z'
;;
*)
echo "Usage ${0} {one|two|three}"
;;
esac

  另外,函数也支持类似$0 $1等内置变量

另外, function 也是拥有内置变量的~他的内置变量与 shell script 很类似, 函数名称代表示
$ ,而后续接的变量也是以 $, $... 来取代的~ 这里很容易搞错喔~因为“ function
fname() { 程序段 } ”内的 $, $... 等等与 shell script 的 $ 是不同的。

  示例:

function printit(){
echo "Your choice is ${1}" # 这个 $ 必须要参考下面指令的下达
}
echo "This program will print your selection !"
case ${} in
"one")
**printit ** # 请注意, printit 指令后面还有接参数!
;;
"two")
**printit **
;;
"three")
**printit **
;;
*)
echo "Usage ${0} {one|two|three}"
;;
esac

  另外,传递参数时,必须使用$,也就是使用 fun $arg的形式,而不能使用 fun arg!注意变量的使用方式!第二种方式被认为是传递arg这个字符!

Linux入门第五天——shell脚本入门(中)基础语法之判断与条件的更多相关文章

  1. Linux入门第五天——shell脚本入门(上)基本概念

    一.什么是shell脚本 Shell 脚本(shell script),是一种为 shell 编写的脚本程序. 二.shell入门 1.先导知识 变量知识补充:https://www.cnblogs. ...

  2. Linux入门第五天——shell脚本入门(下)基础语法之调试debug

    一.如何debug 1.通过sh命令的参数: sh [-nvx] scripts.sh 选项与参数: -n :不要执行 script,仅查询语法的问题: -v :再执行 sccript 前,先将 sc ...

  3. Linux入门第五天——shell脚本入门(下)基础语法之循环

    一.循环 1.不定循环 有两种形式: while [ condition ] <==中括号内的状态就是判断式 do <==do 是循环的开始! 程序段落 done <==done 是 ...

  4. Linux入门第四天——shell基础

    一.shell概述 1.概述 命令行解释器(壳,也就是我们的操作界面),计算机只认识0101的二进制,我们需要通过ASCII表来进行翻译 较为官方的解释是: Shell 是一个用 C 语言编写的程序, ...

  5. Linux Shell脚本入门--cut命令

    Linux Shell脚本入门--cut命令 cut cut 命令可以从一个文本文件或者文本流中提取文本列. cut语法 [root@www ~]# cut -d'分隔字符' -f fields &l ...

  6. linux的shell脚本入门

    Linux shell脚本入门教程 为什么要进行shell编程 在Linux系统中,虽然有各种各样的图形化接口工具,但是sell仍然是一个非常灵活 的工具.Shell不仅仅是命令的收集,而且是一门非常 ...

  7. Linux Shell脚本入门--wget 命令用法详解

    Linux Shell脚本入门--wget 命令用法详解 wget是在Linux下开发的开放源代码的软件,作者是Hrvoje Niksic,后来被移植到包括Windows在内的各个平台上.它有以下功能 ...

  8. 【shell】shell脚本入门

    1. 前言 1.1 为什么学习shell编程 Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具,Linux/UNIX系统的底层及基础应用软件的核心大部分涉及Shell脚 ...

  9. Linux学习Day6:编写Shell脚本

    Shell脚本命令的工作方式有两种: 交互式(Interactive):用户每输入一条命令就立即执行. 批处理(Batch):由用户事先编写好一个完整的Shell脚本,Shell会一次性执行脚本中诸多 ...

随机推荐

  1. FTP(文件传输协议)工作原理

    目前在网络上,如果你想把文件和其他人共享.最方便的办法莫过于将文件放FTP服务器上,然后其他人通过FTP客户端程序来下载所需要的文件. 1.FTP架构 如同其他的很多通讯协议,FTP通讯协议也采用客户 ...

  2. metasploit 渗透测试笔记(meterpreter篇)

    0x01 背景 meterpreter作为后渗透模块有多种类型,并且命令由核心命令和扩展库命令组成,极大的丰富了攻击方式. 需要说明的是meterpreter在漏洞利用成功后会发送第二阶段的代码和me ...

  3. jquery实现的时间轴

    代码 样式文件style.css 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ...

  4. 二值形态学——腐蚀与膨胀 及 C语言代码实现

    参考文献:数字图像处理(第三版) 何东健 西安电子科技大学出版社 二值形态学中的运算对象是集合, 但实际运算中, 当涉及两个集合时并不把它们看作是互相对等的. 一般设A为图像集合, S为结构元素, 数 ...

  5. SOJ 1017 Power of Cryptography 库函数精度

    Background Current work in cryptography involves (among other things) large prime numbers and comput ...

  6. Debian下Cannot set LC_CTYPE to default locale: No such file or directory解决方法

    把语言环境变量改为英文 将Ubuntu系统语言环境改为英文的en_US.UTF-8 查看当前系统语言环境 locale 编辑配置文件,将zh_US.UTF-8改为en_US.UTF-8,zh改为en ...

  7. 【webpack】config/index.js

    // see http://vuejs-templates.github.io/webpack for documentation. var path = require('path') module ...

  8. 4、RabbitMQ-消息应答与消息持久化

    消息应答( Message acknowledgment) 1. Message acknowledgment(消息应答) 执行任务可能需要几秒钟.你可能想知道如果其中一个消费者开始一项长期任务并且只 ...

  9. 了解Session的本质

    有一点我们必须承认,大多数web应用程序都离不开session的使用.这篇文章将会结合php以及http协议来分析如何建立一个安全的会话管理机制. AD: 有一点我们必须承认,大多数web应用程序都离 ...

  10. linux下mysql忘记密码怎么办

    前言 今天在服务器安装mysql之后,登录发现密码错误,但是我没有设置密码呀,最后百度之后得知,mysql在5.7版本之后会自动创建一个初始密码. 报错如下: [root@mytestlnx02 ~] ...