转:初学shell脚本--shell语法使用
这两天初次接触shell编程,所谓shell编程其实就是用一定的语法将各种基本的命令组合起来,让shell程序去解释执行。如果对 windows的dos有了解,可以这样理解,其实shell脚本文件和.bat批处理文件差不多,不过linux下的shell比起windows的 dos强大很多。
shell有很多种,如bash、sh 、tcsh、 ksh等,linux系统里面默认使用的是bash。
下面看一下学习shell的第一个程序:
输入命令vi my_01.sh,创建一个my_01.sh文件并用vi编辑器打开。编辑内容如下:
1 #!/bin/bash 2 echo "aaaa" 3 echo "第一次接触shell"
这里第一行是指让bash这个shell去执行这个shell程序。echo是用来输出的,第二行和第三行分别输出两句话。
执行这个shell程序可以用如下几种方法:
1 ./my_01.sh
2 . my_01.sh
3 bash my_01.sh
下面是第二个shell程序:
1 #!/bin/bash 2 #my_02.sh 3 read -p "please input your name:" name 4 echo "$name,welcome!"
这里第三行read命令是指等待用户输入,-p后面是指提示,它还有一个参数-t是设置等待时间的。这个程序运行结果如下:
[liuling@bogon test]$ ./my_02.sh
please input your name:liuling
liuling,welcome!
注:第四行echo使用的是双引号,如果使用单引号的话,则这句就会直接输出 $name,welcome! 。双引号是可以解析里面的变量的,而单引号则不行。
下面看看shell脚本的语法:
一、条件判断if else的使用
if分支语句的写法:
if 条件测试then 满足条件执行什么else 不满足条件执行什么 fi
多分支写法:
if 条件1then 执行命令2 elif 条件1then 执行命令2 else执行命令3 fi
注:if和fi要配对,以fi结束这个条件判断。在不满足第一个条件下再判断使用的是elif,而不是else if。then必须独占一行。
下面看几个例子:
1 #!/bin/bash 2 #my_03.sh 3 4 read -p "pelease input your name:" name 5 read -p "pleaase input your password:" passwd 6 #if test $name = "liuling" 7 if [ $name = "liuling" -a $passwd = "lz19921009" ]#dasn备注=号前后要有空格 8 then 9 echo "登录成功!" 10 else 11 echo "登录失败!" 12 fi
1 #!/bin/bash 2 #my_04.sh 3 4 read -p "please input your score:" score 5 6 if [ $score -gt 90 ] 7 then 8 echo "优秀!" 9 elif [ $score -gt 80 -a $score -le 90 ] 10 then 11 echo "良好!" 12 else 13 echo "一般!" 14 fi
1 #!/bin/bash 2 #my_05.sh 3 4 read -p "please input your score:" score 5 #如果使用(())的话,只能用< > >= <= 6 if (( $score > 90 )) 7 then 8 echo "优秀!" 9 elif [[ $score -gt 80 && $score -le 90 ]] 10 then 11 echo "良好!" 12 else 13 echo "一般!" 14 fi
测试用户输入的文件名是目录还是文件:
1 #!/bin/bash 2 #my_06.sh 3 4 read -p "请输入一个目录或者文件名:" name 5 if [ -z $name ] 6 then 7 echo "你输入的信息为空!" 8 else 9 if [ -f $name ] 10 then 11 echo "这是一个文件!" 12 elif [ -d $name ] 13 then 14 echo "这是一个目录!" 15 else 16 echo "不存在这样一个目录或者文件!" 17 fi 18 fi
这三个例子都是关于if条件判断的用法。条件有这么几种写法:[ 条件 ]、test 条件、[[ 条件 ]]、(( 条件 )),用的最多的是第一种。常用判断符号如下
①、逻辑运算符
-a expr1 -a expr2 逻辑与
-o expr1 -o expr2 逻辑或
! !expr1 逻辑非
②、数值判断
-eq num1 -eq num2 是否相等
-ne num1 -ne num2 是否不相等
-gt num1 -gt num2 是否大于
-ge num1 -ge num2 是否大于等于
-lt num1 -lt num2 是否小于
-le num1 -le num2 是否小于等于
③、字符串判断
= str1 = str2 字符串是否相等
!= str1 != str2 字符串是否不等
-n -n str1 字符串长度是否不等于0
-z -z str2 字符串长度是否等于0
④、文件判断
-r -r filename 文件是否存在且可读
-w -w filename 文件是否存在且可写
-s -s filename 文件是否存在且长度非0
-f -f filename 文件是否存在且是普通文件
-d -d filename 文件是否存在且是一个目录
在使用条件判断的时候一定要注意空格,如if [ $name = "liuling" -a $passwd = "lz19921009" ],[]里面前后要有一个空格,所有的判断符号以及逻辑运算符号前后都要有空格,否则会报错。使用[[ 条件 ]]的时候只能使用"&&"符号作为逻辑与来代替"-a",如果使用(( 条件 ))的话,只能用< > >= <=符号,而不能使用“-eq”等符号。
二、case的用法
这里的case优点类似于java中的swith case
case语法如下:
case var in pattern 1)执行语句1;; pattern 2)执行语句2;; pattern 3)执行语句3;; *)执行语句4;; esac
注意:*)指匹配其他任意字符串
每种情况都以;;结束
下面是几个case用法的例子
1.模拟菜单的选择
1 #!/bin/bash 2 #my_07.sh 3 4 echo "1 - 普通显示" 5 echo "2 - 详细显示" 6 echo "3 - 显示隐藏文件" 7 echo "4 - 推出" 8 9 read -p "请选择操作号:" num 10 case $num in 11 1) 12 ls ;; 13 2) 14 ls -l ;; 15 3) 16 ls -al ;; 17 4) 18 exit ;; 19 *) 20 echo "请输入正确的操作(1--4)" 21 exit ;; 22 esac
三、循环语句的使用
1、for循环
for 变量名 in 取值列表 do命令序列 done
下面是for循环使用的小例子:
1 #!/bin/bash 2 #my_08.sh 3 4 for a in `seq 1 3 10` 5 do 6 echo $a 7 done 8 echo "-------------------" 9 for ((i=1;i<=10;i++)) 10 do 11 echo $i 12 done
这里第四行使用了`seq 1 3 10`,``是反引号,也就是键盘上Esc下面的一个键,``里面可以写执行命令,把执行后的结果返回。
seq命令是指序列,seq start size max,start是起始,size是步长,max就是限制的数,比如seq 1 3 10,则返回的是1 4 7 10。
第9行代码也有点特别,有点像java里面的for循环,不过是双重小括号,在shell中这样也是可以的。
下面是一个统计文件数目的小程序:
1 #!/bin/bash 2 #my_09.sh 3 4 i=0 5 for name1 in `ls /etc` 6 do 7 # i=`expr $i + 1` 8 # let i++ 9 # i=$[$i + 1] 10 # i=$(($i + 1)) 11 ((i++)) 12 13 done 14 echo "文件总数为:$i"
注:7、8、9、10、11行是数字自增的不同写法,都可以。
2、while循环
while 条件 do命令序列 done
下面是一个录入客户资料的shell脚本:
1 #!/bin/bash 2 #my_10.sh 3 4 while true 5 do 6 echo "登记客户资料(c继续,q退出):" 7 read choice 8 9 case $choice in 10 c) 11 echo "请输入客户名字:" 12 read name1 13 echo "请输入客户年龄:" 14 read age1 15 echo "姓名:"${name1}" - 年龄:"${age1} >>customer.txt 16 ;; 17 q) 18 exit 19 ;; 20 esac 21 done
注:
>>是指重定向,将标准输出重定向到其他的输出流中,如上面15行是指将标准输出重定向到customer.txt文件。所以echo输出的内容会输出到customer.txt文件中去。
>> 和 > 区别
>>customer.txt 追加保存到customer.txt文件中, 如果文件不存在会自动创建。
>customer.txt 就会重新写入, 覆盖原有的数据
四、函数的应用
function 函数名(){} or 函数名(){}函数调用: 函数名 函数名 参数1 参数2
下面是一个小例子程序:
1 #!/bin/bash 2 #fun.sh 3 function add(){ 4 echo $(($1+$2)) 5 } 6 add 20 30 7 add 20 90
转载于:https://www.cnblogs.com/dasn/articles/3237292.html
转:初学shell脚本--shell语法使用相关推荐
- Shell脚本基本语法大全
目录 1.如何理解Shell脚本 2.如何一行执行多条命令 3.脚本的执行 4.管道与重定向 5.变量的使用 6.数组的使用 7.转义和引用 8.运算符 9.各种特殊符号 10.测试与判断 11.分支 ...
- shell脚本常用语法大全
shell脚本常用语法大全 一.shell简介 二.shell常用命令 2.1echo 2.2printf 2.3test 三.shell变量 3.1变量命名规则 3.2赋值方式 3.3使用变量 3. ...
- shell脚本——shell函数详解
shell脚本--shell函数详解 一.shell函数 1.shell函数的概念 2.shell函数的格式 (1)函数的定义 (2)调用函数的方法 3.函数返回值 4.函数传参 5.函数变量的作用范 ...
- Shell脚本基础语法
一. 编写shell的格式 1 第一行决定使用哪一种shell Bash:#! /bin/bash Python: #! /usr/bin/python 不知道解释器的完整路径,可使用wh ...
- 最全shell脚本语句语法使用(超详细)
博文大纲: 1.对谈式脚本--read语句 2.shell脚本中的测试的字符 3.判断脚本举例 4.条件判断--if语句 5.条件判断--case语句 6.条件判断--function函数结合case ...
- shell脚本常用语法——获得当前目录
1 . 获得shell脚本所在的绝对路径 CURRENT_DIR=$(cd $(dirname $0); pwd) 或者 CURRENT_DIR=$(cd `dirname $0`; pwd) 执行步 ...
- linux 循环shell脚本,shell脚本的使用---for循环
shell脚本的循环:重复执行命令 1.for循环 语法 for 变量名称 in 变量值列表 do 命令 done for根据变量值列表中的内容,重复执行命令,直到变量值列中的所有内容都取值完后结束. ...
- Shell脚本——Shell编程规范及变量
Shell编程规范及变量 一.Shell脚本概述 1.1.1 Shell基本概念 1.1.2 Shell脚本应用场景 1.1.3 Shell作用--翻译官 二.shell编程规范 2.1 用户登录sh ...
- c语言加密shell脚本,shell脚本加密
如何保护自己编写的shell程序 要保护自己编写的shell脚本程序,方法有很多,最简单的方法有两种:1.加密 2.设定过期时间,下面以shc工具为例说明: 一.下载安装shc工具 shc是一个加密s ...
- 手把手教你写shell脚本——shell循环结构
一 条件语句 1.1 if-then #!/bin/bash if root thenecho "hello" fi 如果命令运行成功(退出码为0),则then部分的命令被执行 1 ...
最新文章
- 长连接测试_如何选择好一根测试电缆组件?
- 广东省工业和信息化厅关于印发广东省 5G 基站和数据中心总体布局规划 (2021-2025 年)的通知...
- 如何用互联网上的广告来赚取广告费——有点吹牛吗?
- 2018.3.26 1501 二叉树最大宽度和高度
- WPF特效-拼图游戏
- Hibernate之必须导入jar包
- oracle安装实验,Oracle之课程实验一(安装oracle)
- Java 获取指定日期的方法汇总
- 【机器学习_2】机器学习资料
- iphone 计算机乱码,苹果电脑Word变乱码怎么办
- 360*640是什么设备的分辨率?
- 多帧点云数据拼接合并_点云拼接
- 心中无码便是高清,用“脑补”除马赛克!
- burp数据包抓取操作
- 集成googlepay,出现Service not registered
- iOS生成推送push证书,push.p12文件
- 6阶子群同构于s3或者z6_[2017年整理]离散数学复习.ppt
- 微信app支付服务端开发记录
- js制作的炫酷3D太阳系行星运行效果
- 纵断面 java_道路土方计算软件
热门文章
- Julia : DataFrame常见用法
- 阿里巴巴集团 CTO 约你聊聊这些事
- 机器学习笔记(二):矩阵、环境搭建、NumPy | 凌云时刻
- 洞察|2019年混合云发展:前景广阔 巨头混战 SD-WAN成重要推手
- 【图像处理基础】基于matlab图像Harris角点检测【含Matlab源码 1731期】
- 2021年全国研究生数学建模指导
- 【优化算法】符号LMS算法【含Matlab源码 697期】
- 【滤波器】基于matlab窗函数法FIR数字滤波器设计【含Matlab源码 316期】
- 【C++】STL-函数对象(仿函数)
- 同名文件替换怎么恢复_U盘里被替换的文件怎么恢复?方法选对,其实很简单...