shell脚本编程 学习笔记
1.shell简介
1.1 什么是shell
Shell 是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。
交互的方式:从键盘输入命令,通过/bin/bash的解析,可以立即得到Shell的回应
[root@clsn ~]# ls
anaconda-ks.cfg
[root@clsn ~]# echo ls |bash
anaconda-ks.cfg
非交互的方式: 脚本
1.2 shell脚本
shell脚本就是一种专门使用shell编写的脚本程序,它虽然没有C++、Java、Python等一系列高级语言功能强大,但是在服务器运维领域以及嵌入式开发领域,shell脚本具有举足轻重的地位。
脚本语言定义:
为了缩短传统的编写-编译-链接-运行(edit-compile-link-run)过程而创建的计算机编程语言。
特点:程序代码即是最终的执行文件,只是这个过程需要解释器的参与,所以说脚本语言与解释型语言有很大的联系。脚本语言通常是被解释执行的,而且程序是文本文件。
典型的脚本语言有,JavaScript,Python,shell等。
1.3 运行shell脚本
- 方式1(输入脚本的绝对路径或相对路径)
说明:首先要赋予helloworld.sh脚本的+x权限,再执行脚本
比如./hello.sh 或者使用绝对路径/root/shcode/hello.sh
- 方式2(sh+脚本)
说明:不用赋予脚本+x权限,直接执行即可。
比如 sh hello.sh,也可以使用绝对路径
shell脚本编写如下,并将其保存为test.sh
,进入存放此文件目录
#!/bin/bash
echo "Hello World"
- 当作为可执行程序运行时候
chmod +x test.sh # 赋予可执行权限
./test.sh # 执行程序
- 作为解释器参数运行
/bin/sh test.sh # 执行命令
/bin/php test.php # 执行命令
1.4 shell注释
- 单行注释:和python注释相同,以#号开头作为单行注释
# 这是一个注释
# author:ohuohuoo
# date:`date`
- 多行注释:可以将其定义为一个花括号的注释函数,也可以用多行注释
:<<EOF
注释内容...
注释内容...
注释内容...
EOF# EOF可以换成其他符号
:<<E!
注释内容...
注释内容...
注释内容...
!
1.5 shell编写的基本步骤
- 建立shell文件
- 赋予shell文件可执行程序权限(使用chmod命令修改权限)
- 执行shell文件(直接运行赋予权限后的二进制文件)
2.shell变量
- Linux Shell中的变量分为,系统变量和用户自定义变量。
- 系统变量:
$HOME
、$PWD
、$SHELL
、$USER
等等,比如:echo $HOME
等等. - 显示当前shell中所有变量:
set
2.1 变量定义
- 定义变量: 变量名=值
- 撤销变量: unset变量
- 声明静态变量: readonly变量,注意:不能unset
#!/bin/bash
#TASK1:define variable A
A=100
#Output A : $
echo A=$A
echo "A=$A"#TASK2: cancel A
unset A
echo "A=$A"#task3 define static variable B=2
readonly B=2
echo "B=$B"#unset B 不允许操作#将指令返回的结果赋给变量
C=date
D=`date`
E=$(date)
echo "C=$C"
echo "D=$D"
echo "E=$E"#使用环境变量TOMCAT_HOME
echo "tomcat_home=$TOMCAT_HOME"
"var.sh" 28L, 372C
结果:
shell中,英文符号"$"
用于取变量值
如果在变量中使用系统命令,需要加上 " `"符号(ESC键下方)
DATE1=`date`
DATE2=$(date)
2.2 使用变量
使用变量的时,用英文符号"$"取变量值,对于较长的变量名,建议加上{ }花括号,帮助解释器识别变量的边界,如下
name="test_name"
echo "My name is ${name}and you"
2.3 环境变量
- export变量名=变量值(功能描述:将shell变量输出为环境变量/全局变量)
- source 配置文件(功能描述:让修改后的配置信息立即生效)
- echo $变量名 (功能描述:查询环境变量的值)
2.4 传递参数
- 在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:
$n
。 - n 代表一个数字,
$0
为命令本身,$1
1为执行脚本的第一个参数,$2
为执行脚本的第二个参数,以此类推……,10以上参数用大括号包含${10}
echo "传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";
执行:
chmod +x test.sh
./test.sh 1 2 3
结果:
$*
: 代表命令行中所有的参数,$*
把所有的参数看成一个整体;$@
: 代表命令行中所有的参数,不过$@
把每个参数区分对待;$#
: 代表命令行中所有参数的个数;$$
脚本运行的当前进程ID号$!
后台运行的最后一个进程的ID号
2.5 预定义变量
3.shell字符串
3.1 字符串类型
使用单引号
str='this is a string'
使用双引号
name="ohouhuoo"
str="please input your \"$name"\"
echo -e $str
- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;可以在双引号中使用变量;
- 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用;
- 可以在双引号中使用转移字符;
3.2 字符串操作
获取字符串长度
使用" #
"符号对字符串进行取值
string="abcd"
echo ${#string} # 输出 4
提取子字符串
使用字符串的截取命令,用于提取部分字符串
string="this is a test"
echo ${string:2:6} # 表示从第3个字符开始截取
查找字符串
用于查找字符的位置,输出结果为字符在字符串中所占的数据位置,如果查找多个字符,那哪个字母先出现就计算哪个;
string="this is a test"
echo `expr index "$string" it` # 输出 1
查找it中i和t两个字符,t先出现,输出为1
4.shell数组
4.1 定义数组
# 一般定义
array_name=(value1 value2 value3 value4)# 多级定义
array_test=(
value1
value2
value3
value4
)#
array_text[0]=value0
array_text[1]=value1
array_text[3]=value3
...
4.2 数组操作
读取数组
和读取变量名相同,使用$符号,需要加上下标名
valuen=${array_name[n]}
echo ${array_name[@]} # 读取所有
获取数组长度
获取数组长度的方法与获取字符串长度的方法相同
# 取得数组元素的个数
length=${#array_name[@]} # 从头到尾取
# 或者
length=${#array_name[*]} # 取所有
# 取得数组单个元素的长度
lengthn=${#array_name[n]} # 取特定
5.shell运算符
shell想要使用这些运算符,需要结合其他命令和工具来使用(因为shell中不支持简单的数学运算),如使用算符运算符就需要搭配的常用的工具有两种
- awk
- expr
#!/bin/bash
#计算(2+3)*4
#1)
RES1=$(((2+3)*4))
echo "res1=$RES1"
#2)
RES2=$[(2+3)*4]
echo "res2=$RES2"
#3) expr
TEMP=`expr 2 + 3`
#打空格 否则输出字符串
#乘法 \*
RES3=`expr $TEMP \* 4`
echo "temp=$TEMP"
echo "res4=$RES3"#计算命令行两个参数的和
SUM=$[$2+$1]
echo "sum=$SUM"
算数运算符
运算符 | 说明 | 例子 |
---|---|---|
+
|
加 |
expr $a + $b
|
-
|
减 |
expr $a - $b
|
\*
|
乘 |
expr $a \* $b
|
/
|
除 |
expr $a / $b
|
%
|
取余 |
expr $a % $b
|
=
|
赋值 |
a = $b
|
==
|
相等则返回 true |
[ $a != $b ]
|
!=
|
不相等返回 true |
[ $a != $b ]
|
- 符号左右打空格 否则输出字符串
关系运算符
指定a为10,b为20
运算符 | 说明 | 例子 |
---|---|---|
-eq
|
两数相等,则返回 true。 |
[ $a -eq $b ] 返回 false。
|
-ne
|
两数不相等,则返回 true。 |
[ $a -ne $b ] 返回 true。
|
-gt
|
左数大于右数,则返回 true。 |
[ $a -gt $b ] 返回 false。
|
-lt
|
左数小于右数,则返回 true。 |
[ $a -lt $b ] 返回 true。
|
-ge
|
左数大于等于右数,则返回 true。 |
[ $a -ge $b ] 返回 false。
|
-le
|
左数小于等于右数,则返回 true。 |
[ $a -le $b ] 返回 true。
|
布尔运算符
逻辑运算符
字符串运算符
文件测试运算符
6.shell编程中的命令
6.1 echo命令
6.2 printf命令
6.3 test命令
7.shell流程控制
7.1 if else条件
格式:
if condition
thencommand1 command2...commandN
fi
# 写成单行
if condition;then command1; command2;fi
#存在不满足的条件
if condition
thencommand1 command2...commandN
elsecommand
fi
举例:
#!/bin/bash
#1)"ok"是否等于"ok"
#判断语句:使用=
if [ "ok" = "ok" ]
thenecho "equal"
fi#2)23是否大于22
#判断语句:使用 -ge
if [ 23 -ge 22 ]
thenecho "大于"
fi#3):/root/shcode/ifdemo.txt 目录中文件是否存在
#判断语句:使用 -f
if [ -f /root/shcode/ifdemo.txt ]
thenecho "存在"
fi#4)
if [ ppp ]
thenecho "output evyth"
fi
7.2 case条件
格式:
case 值 in
模式1)command1command2...commandN;;
模式2)command1command2...commandN;;
esac
- 取值后面需要加上
in
- 每一模式必须以
右括号
结束 - 每个模式结束后使用
;;
符号结尾 - 如果没有找到对应的模式。以
*
结尾,并跳出case - case需要搭配
esac
结尾,与C语言中的switch … case语句类似
举例:
echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read num
case $num in1) echo '你选择了 1';;2) echo '你选择了 2';;3) echo '你选择了 3';;4) echo '你选择了 4';;*) echo '你没有输入 1 到 4 之间的数字';;
esac
执行脚本,运行如下:
输入 1 到 5 之间的数字:4
你输入的数字为 4!
输入 1 到 5 之间的数字:8
你输入的数字不是 1 到 5 之间的! 游戏结束
case中想要跳出循环有两个命令:break
和continue
7.3 for循环
格式:
for var in item1 item2 ... itemN
docommand1command2...commandN
done# 写成一行同样使用分号将语句分开
- in列表中可以包含替换、字符串和文件名等
- in列表是可选的,如果默认不适用,将会循环使用命令行中的位置参数
举例:
for num in 1 2 3 4 5
doecho "The value is: $num"
done
结果:
The value is: 1
The value is: 2
The value is: 3
The value is: 4
The value is: 5
7.4 while循环
格式:
while condition
docommand
done
输入值跳出循环举例:
echo '按下 <Q> 退出'
echo -n '输入你最喜欢的歌名: '
while read SONG
doecho "啊!$SONG 真是一首好歌"
done
7.5 until循环
8.shell函数
8.1 定义函数
[ function ] funname [()]
{action;[return int;]
}
- function fun () 表示有返回参数的函数(如同C语言中的有返回类型的函数(int,char等))
- fun() 表示无返回参数的函数(类似于C语言中的void类型函数)
- 使用return可以返回参数值(一般为数值n),如果不使用,将默认以最后一条命令运行的结果作为返回值
8.2 参数定义
此外想要使用shell函数传递参数时,需要在函数体的内部,通过 $n 的形式来获取参数的值,与其他语言不同的是,这不是在定义函数的时候就给定参数,而是在函数体中获取到的参数,例如,$1表示第一个参数,$2表示第二个参数,参数调用列表如下
参数处理 | 说明 |
---|---|
$#
|
传递到脚本或函数的参数个数 |
$*
|
以一个单字符串显示所有向脚本传递的参数 |
$$
|
脚本运行的当前进程ID号 |
$!
|
后台运行的最后一个进程的ID号 |
$@
|
与$*相同,但是使用时加引号,并在引号中返回每个参数。 |
$-
|
显示Shell使用的当前选项,与set命令功能相同。 |
$?
|
显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
举例:
#!/bin/bash
FunParam(){echo "输入第一个参数 $1 !"echo "输入第二个参数 $2 !"echo "输入第十个个参数 $10 !"echo "参数总数共 $# 个!"echo "作为一个字符串输出所有参数 $* !"
}
FunParam 1 2 3 4 5 6 7 8 9 10
结果
第一个参数为 1 !
第二个参数为 2 !
第十个参数为 10 !
参数总数有 10 个!
作为一个字符串输出所有参数 1 2 3 4 5 6 7 8 9 10!
shell脚本编程 学习笔记相关推荐
- shell脚本编程学习笔记6(xdl)——字符串截取命令
shell脚本编程学习笔记6--字符串截取命令 1,cut命令 [root@localhost ~]# cut [选项] 文件名-f 列号,表示提取第几列-d 分隔符,按照指定的分隔符分割列注意:默认 ...
- shell脚本编程学习笔记8(XDL)——流程控制和循环
shell脚本编程学习笔记8--流程控制和循环 1,if语句 1,框架 1,单分支:if [条件判断式] ;thenprogramfiif [条件判断式]thenprogramfi注意:if语句使用f ...
- shell脚本编程学习笔记1(xdl)——shell基础与Bash基本功能()
shell脚本编程学习笔记1--shell基础与Bash基本功能 1,简介: 1,Shell就是一个命令行解释器,用以连接输入设别和内核. 2,Shell是解 释执行的脚本语言,在Shell中可以直接 ...
- shell脚本编程学习笔记5(xdl)——正则表达式
shell脚本编程学习笔记5--正则表达式 1,简介 正则表达式,用来在文件中匹配符合条件的字符串,包含匹配.注意是文件中选择字符串,和通配符是 不同的.grep,awk,sed等命令可以支持正则表达 ...
- shell脚本编程学习笔记2(xdl)——Bash变量
shell脚本编程学习笔记2--Bash变量 1,变量简介 1,计算机内存单元2,设置规则字母数组下划线组成,不能以数字开头Bash中,默认类型字符串型,变量类型可修改 2,Bash变量规则 1,变量 ...
- shell脚本编程学习笔记4(xdl)——Bash常见环境变量
shell脚本编程学习笔记4--Bash常见环境变量 非专业运维,例如开发人员,环境变量熟悉常见的,了解不常见的即可. 1,简介 环境变量配置文件中主要是定义对系统的 操作环境生效的系统默认环境变量, ...
- shell脚本编程学习笔记7(XDL)——字符处理命令和条件判断
shell编程学习笔记--字符处理命令和条件判断 1,字符处理 [root@localhost ~]# sort [选项] 文件名 选项: -f: 忽略大小写 -n: 以数值型进行排序,默认使用字符串 ...
- Linux Shell脚本编程学习笔记和实战
http://www.1987.name/141.html shell基础 终端打印.算术运算.经常使用变量 Linux下搜索指定文件夹下特定字符串并高亮显示匹配关键词 从键盘或文件里获取标准输入 [ ...
- shell脚本编程学习笔记(四)shell操作数据库
一.数据库基本操作 1)登录mysql服务器:mysql -u root -p 密码 2)查看数据库:show databases 3)查看表:show tales from db; 4)查看表结构: ...
最新文章
- C#中用schema验证xml的合法性
- python基础-字典
- Django使用心得(四)
- linux(1)- 简单的 shell 解释器
- VScode使用python的yapf库
- OpenCV—矩阵数据类型转换cv::convertTo
- mysql 12142_php连接mysql的类mysql.class.php
- 寒冷的高纬度——我的梦开始的地方
- Django(part2)--创建项目与Django目录结构
- java运行时读取注解_Java自定义注解和运行时靠反射获取注解
- android setimageresource取list的,Java ImageView.setImageTintList方法代码示例
- LeetCode 1324. 竖直打印单词
- 微信公众开放平台开发07---java servlet 实现微信开发第一步:微信服务器验证
- React Native Fetch封装那点事...
- html标签种类很多,为什么不都用div?
- antd table动态表头_jQuery的datatable动态列处理,轻松重绘表格
- phpcms图库_love.php
- 关闭防火墙linux出错,linux关闭防火墙【应对办法】
- 前端开发:Vue项目中解决Emitted value instead of an instance of Error问题
- MSA多序列比对(multiple sequence alignment)
热门文章
- Ubuntu 开机黑屏两大原因解决办法
- 性能测试loadrunner之Analysis、WIN服务资源监控、nomon工具介绍、性能测试报告
- 政府信息化建设之——微门户和政务微信
- android 类似金山词霸 每日一句源代码 csdn,个人作业2——英语学习APP案例分析(示例代码)...
- Jenkins在tomcat中启动配置nginx
- 规模划分电子计算机,电子计算机按规模划分,可以分为_____。
- android电视查看百度网盘,百度网盘如何投屏到电视?百度网盘投屏到电视的方法...
- Unity打包Android的apk文件时有关Json的注意事项
- Remoting安全设置
- 广发催收流程全解,你还敢欠钱不还吗