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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值