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编辑器打开。编辑内容如下:
#!/bin/bash
echo "aaaa"
echo "第一次接触shell"
这里第一行是指让bash这个shell去执行这个shell程序。echo是用来输出的,第二行和第三行分别输出两句话。
执行这个shell程序可以用如下几种方法:
1 ./my_01.sh
2 . my_01.sh
3 bash my_01.sh
注:新创建的文件默认是没有执行权限的,所以必须给该文件授予执行权限后才能执行。授权命令:chmod u+x my_01.sh或者chmod 755 my_01.sh
下面是第二个shell程序:
#!/bin/bash
#my_02.sh
read -p "please input your name:" name
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 条件1
then
执行命令2
elif 条件1
then
执行命令2
else
执行命令3
fi
注:if和fi要配对,以fi结束这个条件判断。在不满足第一个条件下再判断使用的是elif,而不是else if。then必须独占一行。
下面看几个例子:
#!/bin/bash
#my_03.sh read -p "pelease input your name:" name
read -p "pleaase input your password:" passwd
#if test $name = "liuling"
if [ $name = "liuling" -a $passwd = "lz19921009" ]
then
echo "登录成功!"
else
echo "登录失败!"
fi
#!/bin/bash
#my_04.sh read -p "please input your score:" score if [ $score -gt ]
then
echo "优秀!"
elif [ $score -gt -a $score -le ]
then
echo "良好!"
else
echo "一般!"
fi
#!/bin/bash
#my_05.sh read -p "please input your score:" score
#如果使用(())的话,只能用< > >= <=
if (( $score > ))
then
echo "优秀!"
elif [[ $score -gt && $score -le ]]
then
echo "良好!"
else
echo "一般!"
fi
测试用户输入的文件名是目录还是文件:
#!/bin/bash
#my_06.sh read -p "请输入一个目录或者文件名:" name
if [ -z $name ]
then
echo "你输入的信息为空!"
else
if [ -f $name ]
then
echo "这是一个文件!"
elif [ -d $name ]
then
echo "这是一个目录!"
else
echo "不存在这样一个目录或者文件!"
fi
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
;;
pattern )
执行语句2
;;
pattern )
执行语句3
;;
*)
执行语句4
;;
esac
注意:*)指匹配其他任意字符串
每种情况都以;;结束
下面是几个case用法的例子
1.模拟菜单的选择
#!/bin/bash
#my_07.sh echo "1 - 普通显示"
echo "2 - 详细显示"
echo "3 - 显示隐藏文件"
echo "4 - 推出" read -p "请选择操作号:" num
case $num in
)
ls ;;
)
ls -l ;;
)
ls -al ;;
)
exit ;;
*)
echo "请输入正确的操作(1--4)"
exit ;;
esac
三、循环语句的使用
1、for循环
for 变量名 in 取值列表
do
命令序列
done
下面是for循环使用的小例子:
#!/bin/bash
#my_08.sh for a in `seq `
do
echo $a
done
echo "-------------------"
for ((i=;i<=;i++))
do
echo $i
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中这样也是可以的。
下面是一个统计文件数目的小程序:
#!/bin/bash
#my_09.sh i=
for name1 in `ls /etc`
do
# i=`expr $i + `
# let i++
# i=$[$i + ]
# i=$(($i + ))
((i++)) done
echo "文件总数为:$i"
注:7、8、9、10、11行是数字自增的不同写法,都可以。
2、while循环
while 条件
do
命令序列
done
下面是一个录入客户资料的shell脚本:
#!/bin/bash
#my_10.sh while true
do
echo "登记客户资料(c继续,q退出):"
read choice case $choice in
c)
echo "请输入客户名字:"
read name1
echo "请输入客户年龄:"
read age1
echo "姓名:"${name1}" - 年龄:"${age1} >>customer.txt
;;
q)
exit
;;
esac
done
注:
>>是指重定向,将标准输出重定向到其他的输出流中,如上面15行是指将标准输出重定向到customer.txt文件。所以echo输出的内容会输出到customer.txt文件中去。
>> 和 > 区别
>>customer.txt 追加保存到customer.txt文件中, 如果文件不存在会自动创建。
>customer.txt 就会重新写入, 覆盖原有的数据
四、函数的应用
function 函数名(){
}
or
函数名(){
}
函数调用:
函数名
函数名 参数1 参数2
下面是一个小例子程序:
#!/bin/bash
#fun.sh
function add(){
echo $(($+$))
}
add
add
shell语法使用的更多相关文章
- makefile中的shell语法
在Makefile中写shell代码有点诡异,和不同的shell语法不太一样,如果不了解,看Makefile会莫名其妙.下面总结了一些. 1:尽在Makefile文件的目标项冒号后的另起一行的代码才是 ...
- Hadoop学习笔记之HBase Shell语法练习
Hadoop学习笔记之HBase Shell语法练习 作者:hugengyong 下面我们看看HBase Shell的一些基本操作命令,我列出了几个常用的HBase Shell命令,如下: 名称 命令 ...
- Shell语法规范
ver:1.0 博客:https://www.cnblogs.com/Rohn 本文介绍了Shell编程的一些语法规范,主要参考依据为谷歌的Shell语法风格. 目录 背景 使用哪一种Shell 什么 ...
- shell语法习题练习进阶版
第4章 shell语法深度习题练习 4.1 使用if,case,函数的方法将服务改成system(centos6) 4.1.1 if方法 4.1.1.1 system实现 4.1.1.1.1 编写代码 ...
- 读完学会shell语法,shell脚本80%已经学会
第3章 shell语法讲解 3.1 shell运算讲解 3.1.1 运算符的讲解 3.1.2 shell运算方式的讲解 3.1.2.1 $(())运算 [root@m01 test_init] # a ...
- shell语法
基本语法列表 #linux组成:内核+工具 #linux启动: . getty:提示登录名和密码,输入之后调用login . login:login验证用户名和密码,然后调用shell . shell ...
- Shell 语法 if 、 case 、for 、 while、 until 、select 、repeat、子函数
if语法 : if [ expression ] then commandselif [ expression2 ] then commandselse commandsfi ...
- Shell 语法之结构化命令(流程控制)
许多程序在脚本命令之间需要某种逻辑流控制,允许脚本根据变量值的条件或者其他命令的结果路过一些命令或者循环执行这些命令.这些命令通常被称为结构化命令.和其他高级程序设计语言一样,shell提供了用来控制 ...
- shell语法快速入门(1)
#得到绝对路径 DIR=$(cd `dirname $0`;pwd) $DIR/file.txt #去掉#注释 egrep -v "(#|^$)" /etc/zabbix/zabb ...
- shell语法基础
一.变量 1.linux大小写敏感,变量取名要注意大小写.可以通过变量名前面加$来访问变量的内容.可以通过使用read命令来将用户输入的值赋给一个变量. 2.给变量赋值时,如果字符串中包含空格,就必须 ...
随机推荐
- java 反射原理写了一个赋值和取值通用类
首先了解一下反射的原理,什么是反射?所谓的反射就是指java 语言在运行时拥有一项自观的能力,反射能使你得到装载到 jvm 中的类的内部信息,它不需要你在编码的时候就知道所需类的内部信息,允许程序执行 ...
- Java POI 3.17写入、导入EXCEL性能测试
我们先测试一下写入 50000 条 程序源码: 写入的excel文件信息 再看一下文件的结构 我们再次测试一下导入数据库的性能(用移动的网络上传至电信服务器): 在导入的过程中也可以中止导入行为: 上 ...
- 用jquery实现的QQ邮箱里的多收件人选取及其他效果改进版
我们先来看一下之前网上的版本效果: 发现很多bug且应用场景不一样,没办法只能自己写了 操作时 textarea 的值只是显示效果,实现的参数为 hidden 2017-04-25再次改进版与新版的 ...
- Linux 安全信息查看
终端登录情况 last ssh登录情况 cat /var/log/secure | grep -i "accepted password" 定时任务 cat /var/log/cr ...
- Java常用工具类之ArrayUtil
过滤 ArrayUtil.filter方法用于编辑已有数组元素,只针对泛型数组操作,原始类型数组并未提供. 方法中Editor接口用于返回每个元素编辑后的值,返回null此元素将被抛弃. 例如:过滤数 ...
- 轻松看懂Java字节码
java字节码 计算机只认识0和1.这意味着任何语言编写的程序最终都需要经过编译器编译成机器码才能被计算机执行.所以,我们所编写的程序在不同的平台上运行前都要经过重新编译才能被执行. 而Java刚诞生 ...
- [转]php socket编程通信
FROM : http://blog.csdn.net/baixiaoshi/article/details/9399083 今天终于测试成功了php中的socket通信,先看原理图 这里可以清晰的看 ...
- spring boot成功启动后访问报错404的问题
Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as ...
- @Tomcat中的几种log
日志是程序员居家旅行必备,哦不对,是定位问题,修复bug,甚至是验证应用是否正常的必备利器.甚至很多时候,我们做一次部署仅仅是为了加一行log.虽然现在有各种各样的问题诊断工具,但是在定位线上问题时, ...
- 第二章 TypeScript 开发环境搭建
Mac OS X 下 TypeScript 开发环境搭建 一.集成开发环境 WebStrom VSCode 二.安装 TypeScript Homebrew(macOS 缺失的软件包管理器) ruby ...