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 环境变量
  1. export变量名=变量值(功能描述:将shell变量输出为环境变量/全局变量)
  2. source 配置文件(功能描述:让修改后的配置信息立即生效)
  3. echo $变量名 (功能描述:查询环境变量的值)
2.4 传递参数
  • 在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n
  • n 代表一个数字,$0为命令本身,$11为执行脚本的第一个参数,$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
then
    command1 
    command2
    ...
    commandN 
fi
# 写成单行
if condition;then command1; command2;fi
#存在不满足的条件
if condition
then
    command1 
    command2
    ...
    commandN
else
    command
fi

举例:

#!/bin/bash
#1)"ok"是否等于"ok"
#判断语句:使用=
if [ "ok" = "ok" ]
then
        echo "equal"
fi

#2)23是否大于22
#判断语句:使用 -ge
if [ 23 -ge 22 ]
then
        echo "大于"
fi

#3):/root/shcode/ifdemo.txt 目录中文件是否存在
#判断语句:使用 -f
if [ -f /root/shcode/ifdemo.txt ]
then
        echo "存在"
fi

#4)
if [ ppp ]
then
        echo "output evyth"
fi      
7.2 case条件

格式:

casein
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac

  • 取值后面需要加上in
  • 每一模式必须以右括号结束
  • 每个模式结束后使用;;符号结尾
  • 如果没有找到对应的模式。以*结尾,并跳出case
  • case需要搭配esac结尾,与C语言中的switch … case语句类似

举例:

echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read num
case $num in
    1)  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中想要跳出循环有两个命令:breakcontinue

7.3 for循环

格式:

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

# 写成一行同样使用分号将语句分开 

  • in列表中可以包含替换、字符串和文件名等
  • in列表是可选的,如果默认不适用,将会循环使用命令行中的位置参数

举例:

for num in 1 2 3 4 5
do
    echo "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
do
    command
done

输入值跳出循环举例:

echo '按下 <Q> 退出'
echo -n '输入你最喜欢的歌名: '
while read SONG
do
    echo "啊!$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!
第1章 BashShell命令 6 1.1 Shell提示符 6 1.2 文件与目录Shell命令 7 1.2.1 更改目录命令(cd) 7 1.2.2 列表命令(ls) 7 1.2.3 操作文件命令 10 1.2.4 目录处理命令 14 1.2.5 查看文件内容命令 15 1.3 监控程序 20 1.3.1 进程查看 20 1.3.2 实时进程监控 22 1.3.3 停止进程 24 1.4 监控磁盘空间 25 1.4.1 挂载介质 25 1.4.2 使用df命令 26 1.4.3使用du命令 27 1.5 操作数据文件 28 1.5.1 数据排序(sort) 28 1.5.2 搜索数据 (grep) 30 1.5.3 压缩数据 30 1.5.4 归档数据(tar) 33 1.6 使用Linux环境变量 34 1.6.1 设置环境变量 34 1.6.2 默认的shell环境变量与path变量的设置 37 1.7 Linux文件权限 40 1.7.1 Linux安全性 40 1.7.2 使用Linux用户组 46 1.7.3 解码文件权限 47 1.7.4 修改安全设置 49 1.8 vim编辑器 52 第2章 基本脚本编译 54 2.1 创建脚本与使用变量 54 2.1.1 创建脚本 54 2.1.2 使用变量 55 2.2 重定向输入输出与数学计算 57 2.2.1 输出重定向 57 2.2.2 输入重定向 58 2.2.3 管道 58 2.2.4 数学计算 58 2.3 退出脚本 60 第3章 结构化命令 61 3.1 if语句 61 3.1.1 if-then语句 61 3.1.2 if-then-else语句 61 3.1.3 嵌套if语句 62 3.2 if条件语句 63 3.2.1 数值比较 63 3.2.2字符串比较 64 3.2.3 文件比较 65 3.2.4 复合条件检查 65 3.3 if-then的高级特征与case命令 66 3.3.1 使用双圆括号 66 3.3.2 使用双方括号 67 3.3.3 case命令 67 3.4 for命令 67 3.4.1 读取列表 68 3.4.2 读取变量与读取命令 69 3.4.3 改变字段分隔符与使用通配符读取目录 69 3.4.5 C式的for命令 70 3.5 while、until命令 71 3.5.1 使用多条测试命令 71 3.5.2 until命令与循环嵌套 72 3.6 文件数据的循环与控制循环 73 3.6.1 文件数据的循环 73 3.6.2 break命令 73 3.6.3 continue命令 75 第4章 处理用户输入与显示数据 76 4.1 命令行参数与特殊的参数变量 76 4.1.1 读取参数 76 4.1.2 读取程序名称 77 4.1.3 测试参数 77 4.1.4 参数计数 77 4.1.5 获取所有数据 78 4.2 移位与选项 79 4.2.1 移位 79 4.2.2 找出选项 79 4.2.3 使用getopt命令 81 4.2.4 更高级的getopts命令 83 4.2.4 标准化选项 84 4.3 获取用户输入 84 4.3.1 基本读取 84 4.3.2 计时 85 4.3.3 默读与文件读取 85 4.4 显示数据 86 4.4.1 标准文件描述符 86 4.4.2 重定向错误 87 4.4.3 临时重定向 88 4.4.4永久重定向 88 4.4.5 在脚本中重定向输入 89 4.5 创建自己的重定向 90 4.5.1 创建输出文件描述符 90 4.5.2 重定向文件描述符 90 4.5.3 创建输入文件描述符 91 4.5.4 创建读取/写入文件描述符 91 4.5.5 关闭文件描述符 92 4.5.6列出开发文件描述符 92 4.5.7禁止命令输出 94 4.6 使用临时文件 94 4.6.1 创建本地临时文件 94 4.6.2 在/temp中创建临时文件 95 4.6.3 创建临时目录 96 4.6.4 记录消息 96 第5章 脚本控制 97 5.1 处理信号 97 5.1.1 Linux信号回顾 97 5.1.2 生成信号 97 5.1.3捕获信号 99 5.1.4捕获脚本退出 99 5.1.4移除捕获 100 5.2 以后台模式运行脚本 100 5.3 作业控制 102 5.3.1查看作业 102 5.3.2重新启动停止的作业 103 5.4 nice与renice命令 104 5.4.1 nice命令 104 5.4.2 renice命令 104 5.5 定时运行脚本 105 5.5.1使用at命令调度作业 105 5.5.2使用batch命令调 107 5.5.3 调用定期脚本 107 5.6 从头开始 109 5.6.1在启动时启动脚本 109 5.6.2随新shell一起启动 109 第6章 创建函数 110 6.1 基本脚本函数 110 6.1.1 创建函数 110 6.1.2 使用函数 110 6.2 返回值 111 6.2.1 默认退出状态 111 6.2.2 使用return命令 111 6.2.3 使用函数输出 112 6.3 在函数中使用变量 112 6.3.1 向函数传递参数 112 6.3.2 在函数中处理变量 113 6.4 数组变量与函数 114 6.4.1 向函数传递数组 114 6.4.2从函数返回数组 115 6.5 函数递归与创建库 116 6.5.1函数递归 116 6.5.2 创建库 116 6.6 在命令行中使用函数 117 6.6.1在命令行创建函数 117 6.6.2在.bashrc文件中定义函数 117 6.7 select命令使用 119 第7章 sed、gawk介绍与正则表达式 120 7.1 sed编辑器 120 7.1.1 在命令行中定义编辑器命令 120 7.1.2 在命令行中使用多个编辑器命令 121 7.1.3 从文件读取编辑器命令 121 7.2 gawk程序 122 7.2.1 gawk命令格式 122 7.2.2 自命令行读取程序脚本 122 7.2.3 使用数据字段变量 123 7.2.4 在程序脚本中使用多个命令 124 7.2.5从文件读取程序 124 7.2.6 在处理数据之前运行脚本 125 7.2.7 在处理数据之后运行脚本 125 7.3 sed编辑器基础知识 126 7.3.1 更多替换选项 126 7.3.2 使用地址 127 7.3.3 删除行 128 7.3.4 插入和附加文本 129
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值