Linux入门第五天——shell脚本入门(中)基础语法之判断与条件
一、判断式
利用 test 命令进行执行结果的判断(例如判断是否存在该文件):关于test test:test
示例:结合回传值 $? 进行判断:关于$?:$?
- [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脚本入门(中)基础语法之判断与条件的更多相关文章
- Linux入门第五天——shell脚本入门(上)基本概念
一.什么是shell脚本 Shell 脚本(shell script),是一种为 shell 编写的脚本程序. 二.shell入门 1.先导知识 变量知识补充:https://www.cnblogs. ...
- Linux入门第五天——shell脚本入门(下)基础语法之调试debug
一.如何debug 1.通过sh命令的参数: sh [-nvx] scripts.sh 选项与参数: -n :不要执行 script,仅查询语法的问题: -v :再执行 sccript 前,先将 sc ...
- Linux入门第五天——shell脚本入门(下)基础语法之循环
一.循环 1.不定循环 有两种形式: while [ condition ] <==中括号内的状态就是判断式 do <==do 是循环的开始! 程序段落 done <==done 是 ...
- Linux入门第四天——shell基础
一.shell概述 1.概述 命令行解释器(壳,也就是我们的操作界面),计算机只认识0101的二进制,我们需要通过ASCII表来进行翻译 较为官方的解释是: Shell 是一个用 C 语言编写的程序, ...
- Linux Shell脚本入门--cut命令
Linux Shell脚本入门--cut命令 cut cut 命令可以从一个文本文件或者文本流中提取文本列. cut语法 [root@www ~]# cut -d'分隔字符' -f fields &l ...
- linux的shell脚本入门
Linux shell脚本入门教程 为什么要进行shell编程 在Linux系统中,虽然有各种各样的图形化接口工具,但是sell仍然是一个非常灵活 的工具.Shell不仅仅是命令的收集,而且是一门非常 ...
- Linux Shell脚本入门--wget 命令用法详解
Linux Shell脚本入门--wget 命令用法详解 wget是在Linux下开发的开放源代码的软件,作者是Hrvoje Niksic,后来被移植到包括Windows在内的各个平台上.它有以下功能 ...
- 【shell】shell脚本入门
1. 前言 1.1 为什么学习shell编程 Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具,Linux/UNIX系统的底层及基础应用软件的核心大部分涉及Shell脚 ...
- Linux学习Day6:编写Shell脚本
Shell脚本命令的工作方式有两种: 交互式(Interactive):用户每输入一条命令就立即执行. 批处理(Batch):由用户事先编写好一个完整的Shell脚本,Shell会一次性执行脚本中诸多 ...
随机推荐
- UNIX crontab自动执行脚本
crontab 是不会加载环境变量的你手动执行可以是因为登录了oracle用户加载了环境变量,你可以在脚本里添加,echo $ORACLE_HOME echo $ORACLE_SID 等等试试,看看 ...
- ZT自老罗的博客 Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析
Android系统的智能指针(轻量级指针.强指针和弱指针)的实现原理分析 分类: Android 2011-09-23 00:59 31568人阅读 评论(42) 收藏 举报 androidclass ...
- 关于数据库SQL优化
1.数据库访问优化 要正确的优化SQL,我们需要快速定位能性的瓶颈点,也就是说快速找到我们SQL主要的开销在哪里?而大多数情况性能最慢的设备会是瓶颈点,如下载时网络速度可能会是瓶颈点,本地复制文件 ...
- psql: FATAL: role “postgres” does not exist
I'm a postgres novice. I installed the postgres.app for mac. I was playing around with the psql comm ...
- tar 打包带软连接的文件
打包普通文件夹,压缩带参数z,创建tar.gz tar -cvf ./tmp/SK_Aug_camera.tar ./gap_40_5 但是文件夹里含有软连接,带参数 h tar -cvhf ./tm ...
- [Java123] JDBC and Multi-Threading 多线程编程学习笔记
项目实际需求:DB交互使用多线程实现 多线程编程基础:1.5 :( (假设总分10) 计划一个半月从头学习梳理Java多线程编程基础以及Oracle数据库交互相关的多线程实现 学习如何通过代码去验证 ...
- MFC各个控件之间运用SendMessage()传送CString和char[]字符串,以及int类型数据
LRESULT SendMessage( HWND hWnd, // handle to destination window UINT Msg, // message WPARAM wParam, ...
- PHP面试系列 之Linux(二)---- Linux系统定时任务
环境:ubuntu 16 一.cron实现定时任务 cron实现的定时任务是周期性循环执行的. 1.安装cron sudo apt-get install cron 2.添加定时任务(进行编辑) cr ...
- 高斯消元求主元——模意义下的消元cf1155E
#include <bits/stdc++.h> , MO = ; ; inline int qpow(int a, int b) { ; while(b) { ) { ans = 1ll ...
- 404 Note Found 队 Alpha 6
目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示 ...