shell语法
说明:
1、本文中我说说明的shell脚本是基于linux基础之上的。
2、大多数的语法我的写法和书本上不一样,但是我写的都是我自己亲身实践出来的,所以可以保证正确性!!!!!
3、shell脚本概念
就是为了完成一个任务,执行指令从上到下的写入到文本文件中,给予执行权限。
可以,举例;在生活中我们买菜来说:
1、明确目的,今天主要买什么菜
2、去超市
3、买完付钱结账
4、回家
这几类似于一个脚本,从上到下的执行你所需要的命令。
第一个“hello world”
我们该如抒写一个脚本呢?
vi script.sh
这样就创建一个脚本文本
如何编译呢;在这里我推荐用 bash编译器来进行,别的方法我不做介绍
bash script.sh
Eg:第一个脚本文件:
#!/user/bin/bash //固定格式,表示定义一个shell脚本。
#hello world! //#表示注释(解释)echo “hello world!” //输出语句
运行结果:
shell的格式化输出
1、echo命令
<1>、echo命令介绍:
功能:将内容输出到显示设备,显示文字
语法:echo [-ne][字符串] //这里的-ne不是不等于
补充说明:echo将输入的字符串送到标准输出,在最后自动换行。
命令选项:
-n:不在最后自动换行
-e:出现以下字符,特别处理,不会将他当做一般文字输出,介绍-e的几个常用:
\a, 发现警告,类似于老年卡“哔!老年卡”
\b, 删除前一个字符
\t, 输出一个tab
\n, 换行并将光标定位到头
eg:
echo -n -e “\ttime”:不自动换行,输出一个tab,之后在输出time
<2>、颜色输出
请自行搜索,我不多介绍。
shell格式化输入
read命令
功能:接受键盘输入,回车代表输入结束。
命令介绍:
-p:打印信息;
-t:限定输入时间,比如限定十秒时间:下面做介绍;
-s:不显示:可以说:你在输入的时候,键盘输入不显示
-n:可以限定键盘输入字数:
read -t 30 -p “Please input your name:” name
可以相当于:
echo “Please input your name:”
read -t 30 -p name
#提示"请输入姓名"并等待30秒,把用户的输入保存到变量name中
echo "Name is KaTeX parse error: Expected 'EOF', got '#' at position 7: name" #̲看看变量"name"中是否保存了你的输入
输出输入小综合:
#!/user/bin/bash
#登录界面:
echo -n “login:” //账号:
read
echo -n “password:” //密码:
//read -t10 //限定十秒
//read -s //不显示数字
但是如果我们想知道read输入的是什么该如何操作呢?
这就要引入变量的概念了。这个问题下面做概述。
shell变量概述
定义
变量是编辑中常用的一种临时存取数据的一种方式,计算机会将变量名和内存空间绑定。
变量类型:
1、本地变量:用户私有,只可以在某一个文件使用
2、全局变量:所用用户和文件共享使用
变量格式
变量名=变量值
注意:
1、变量名和等号之间不能有空格
2、只能用英文,下划线,数字,第一个字符不可以用数字
3、不能用bash关键字
eg:A=123
B=456
读取变量名:echo “$变量名”
上一节的问题遗留解决:
#!/user/bin/bash
echo -n “login:”
read acc //变量名:
相当于 读取数据之后存入变量名acc中
echo -n “password:”
read pw
echo “login:” $acc
echo “password:” $pw
运行结果:
数组
概述
可以让用户一次输入多个值。
语法
1、初始化:
数组名称=(元素1 元素2 元素3 …)
2、读出数组:
${数组名称[索引]}(索引,即下标)
eg:
命令选项:
echo ${array1[0]} 访问数组中的第一个元素
echo ${array1[@]}访问数组中所有元素,一次打印所有数组元素
echo ${#array1[@]}统计数组元素的个数 ,有几个元素
echo ${array2[@]}获取数组元素的索引
echo $farray1[@]:1} 从数组下标1开始
echo ${array1[@]:1:2}从数组下标1开始,访问两个元素
数组遍历
<1>基本数组
1、数组遍历从索引开始。就是用数组下标的方法:
eg:
<2、>关联数组
声明一个数组;
declare -A ass_array1 //ass_array1数组名
赋值
两种方式
1、
ass_array1[name]=‘baidu’
ass_array1[score]=100
2、
ass_array1=([name]=‘baidu’ [num]=10) //注意不是花括号
调用
格式: echo ${数组名[名称]}
echo ${ass_array1[name]}
eg:
基本数组和关联数组最大区别:在于声明;
shell流程控制-if语句
<1、>shell五大运算
test 命令:用来做判断
运行符解释:
1、数学比较运算:
-eq:等于
-gt:大于
-lt:小于
-ge:大于或等于
-le:小于或等于
-ne:不等于
2. 字符串比较:
== 等于 两边要有空格
!= 不等
-z 字符串的长度为0时为真
-n 字符串的长度大于0时为真
3. 文件比较:
eg:test -e tt;echo $? 存在是0,不存在是1.
-e file 测试文件是否存在
-f file 测试文件是否为普通文件
-d file 测试指定路径是否为目录
-r file 测试文件对当前用户是否可读
-w file 测试文件对当前用户是否可写
-x file 测试文件对当前用户是都可执行
4.逻辑运算
脚本文件中多用
逻辑与运算: -a
逻辑或运算: -o
逻辑非远算: !
注意事项:
与运算:真真为真,真假为假,假假为假。
或运算:真真为真,真假为真,假假为假。
非运算:非假为真,非真为假。
5.赋值运算
== 赋值运算符
<2、>if语法
1、单if语句
if [表达式]
then
代码块
fi
eg:
运行结果:
2、if…esle…
运行结果:
3、多if语句
做一个成绩输入终端(并不完全)
1、90以上
2、80-90
3、60-80
4、40-60
5、40以下
可以自己补全文件正确性 :
eg:大于一百怎么办
小于零如何
运行结果:
for语法
for介绍:
也被称之为条件循环:当你需要执行多次命令来操作某些东西的时候,但是你又不一直在旁边输入,这个时候你就可以用到for循环
for语法
语法1、
for 变量名 in 数值列表
do
代码块
done
eg:循环输出数字:
运行:
语法2、
类似于c
for ((变量名;条件;自加或自减))
do
代码块
done
eg:
结果:
用for循环来做成绩:
结果:
不知道有的同学没有发现:其实我在输入的时候,发生了越界:不知道你们改正了吗。。
for循环优点:
1、节省内存
2、结构更清晰
3、节省时间成本
shell循环控制
1、sheep N
说明:控制循环节奏
其中sleep 1 ;表示每隔一秒输出一个,用于控制输出。
2、continue
说明:跳出本次循环,使跳出本次循环
运行:
五就跳出了
3、break
说明:终止循环,后续循环不在执行:
运行:
到五之后结束。
while和until循环
1、while循环
说明:如果while条件里面的为真,才会执行循环,否则将不会执行
while语法
while [条件]
do
代码块
done
eg:我想输出十个数,为零的时候在开始while循环:
运行结果:
^c代表信号
until循环
介绍:
until循环和while正好相反:until循环是条件为假的时候才开始执行,条件为真则不执行。
语法:
until [条件]
do
代码块
done
实践讲解:
运行结果:
case语句
case介绍
根据给予的不同条件执行不同的代码块
case语法
语法:
case 变量 in
条件要用到:1)
代码块
;;
条件:2)
代码块
;;
………
esac
注意:每个代码块执行完毕后要以;;结尾代表结束。
case案例
运行结果:
案例
我们可以做一个成绩管理系统:
运行结果:
shell函数
函数介绍
说明:
我们写代码中使用函数可以是你的代码更简洁,更容易排除错误,我们使用函数,函数就是将你的代码进行模块化,一个模块一个功能。
eg:你找对象:
1、认识
2、表白
3、同居。。试试合不合不和谐
4、见丈母娘
5、结婚
6、没羞没躁的生活
这是不是一个一个模块。
优点:
代码模块化,调试方便,节省内存
排错简单
改变代码执行顺序
函数语法
语法1:
函数名 ()
{
代码块
return N
}
语法2:
function 函数名
{
代码块
return N
}
在shell中 return 可以不用,我下面的介绍两种语法中,一种使用,一种不使用,效果是一样的:
如何调用函数:函数名
函数应用
第一种语法的使用:
函数实践:
也可以多次调用:
运行结果:
第二种语法的使用:
运行结果: