抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

简单记录下shell脚本语言的学习。

shell脚本运行方式

首先要了解什么是脚本,脚本本质上是一个可运行的文件,使用特定格式的指令让系统通过脚本解析器解析并执行你的指令。系统提供的shell命令解析器有sh、bash和ash。可以通过echo $SHELL查看自己linux系统的默认解析方式

shell脚本文件的开头:#!/bin/bash

#! 是特殊的用来声明脚本由什么shell解释,否则使用默认shell

sh文件有三种执行方式./xxx.sh bash xxx.sh . xxx.sh

./xxx.sh 先按照 文件中#!指定的解析器解析,如果#!指定指定的解析器不存在才会使用系统默认的解析器

bash xxx.sh 指明先用bash解析器解析,如果bash不存在才会使用默认解析器

. xxx.sh 直接使用默认解析器解析

各种引号的区别

vim创建脚本文件1111.sh:

1
2
3
4
5
6
7
8
9
#!/bin/bash
echo "Phantom的SHELL练习"
num=123
echo "预设数字=$num"
read -p "输入数字" sum # read可以识别标准输入(键盘输入),-p参数设置提示语
echo "输出结果=$sum+$num"
echo "$sum" # ""解析变量值
echo '$sum' # ''不能解析变量值
echo "今天日期`date`" # ``识别为系统命令

变量名不能以数字开头

在变量赋值的过程中,等号两边不能接空格,若要接空格,则整个字符串都要用引号括起来

各种引号区别

双引号“”可以解析变量的值
单引号‘’不能解析变量的值,包含的变量会被当做字符串
反引号`` 反引号的内容作为系统命令并执行 如`date`

各种括号的区别

vim创建脚本文件xxx.sh:

1
2
3
4
5
6
7
#!/bin/bash
Num=1000
{ # 花括号表示在当前shell完成,会影响当前变量
Num=1234
echo "()里面的数字是=$Num"
}
echo "显示当前shell数字=$Num"

vim创建脚本文件xxxx.sh:

1
2
3
4
5
6
7
#!/bin/bash
Num=1000
( # 小括号表示在当前shell完成,不会影响当前变量
Num=1234
echo "()里面的数字是=$Num"
)
echo "显示当前shell数字=$Num"

{命令序列} 在当前shell中执行,直接影响当前变量
(命令序列) 由子shell完成,不影响当前shell的变量
[判断条件]中括号是判断条件,进行数值判断。下面会说明

数值判断

vim建立脚本文件xxxxx.sh:

1
2
3
4
5
6
7
8
9
10
#!/bin/bash
read -p "请输入第一个数字" m
read -p "请输入第二个数字" n
if [ $m -eq $n ]; then # -eq 判断两个参数是否相等
echo "输入的两个数字相等"
elif [ $m -lt $n ]; then # -lt 判断左边参数是否小于右边参数
echo "第一个数字小于第二个数字"
elif [ $m -gt $n ]; then # -gt 判断左边参数是否大于右边参数
echo "第一个数字大于第二个数字"
fi # if控制语句格式:if elif else fi

数值判断参数详解

-eq 比较两个参数是否相等
-ne 比较两个参数是否不相等
-lt 左边参数是否小于右边参数
-le 左边参数是否小于等于右边参数
-gt 左边参数是否大于右边参数
-ge 左边参数是否大于等于右边参数

字符串提取和替换

vim新建脚本文件1234.sh:

1
2
3
4
5
6
7
#!/bin/bash
ll="Phantom Aria f r u i t l e s s l o v e" # 定义字符串变量
echo "长度为:${#ll}" # 字符串长度(包括空格)
echo "${ll:3}" # 从第3个字符往后提取
echo "${ll:3:11}" # 从第3个字符往后提取11个字符
echo "${ll/ /}" # 字符串从左往右删除第一个空格(相当于替换的方式)
echo "${ll// /}" # 删除字符串中所有空格(相当于全局替换的方式)

字符串匹配和删除

vim新建脚本文件match.sh:

1
2
3
4
5
6
#!/bin/bash
ll="Phantom Aria fruitless love"
echo ${ll% *} # 从右往左匹配第一个空格,删除右边所有字符串
echo ${ll%% *} # 从右往左匹配所有空格,删除右边所有字符串
echo ${ll#* } # 从左往右匹配第一个空格,删除左边所有字符串
echo ${ll##* } # 从左往右匹配所有空格,删除左边所有字符串

*号是通配符,可以是匹配的任意长度任意字符串
%和%%匹配原则:都是从右到左匹配,删除右边,%%称为贪婪匹配
#和##匹配原则:都是从左往右匹配,删除左边,##同样称为贪婪匹配,注意通配符位置

for循环语句

for循环语句两种写法如下:

1
2
3
4
5
6
7
8
9
for ((初始值;限制值;执行步阶))    #注意两个小括号,少一个都不行
do
程序段
done

for 变量 in 1 2 3 4 5 6 7 8 9 10 #等价于`seq 1 10`
do
程序段
done

vim建立脚本文件for_example.sh:

1
2
3
4
5
6
7
8
#!/bin/bash
declare -i sum=0 # 强制定义sum为整数型变量(不定义会变成一串字符串)
read -p "请输入整数" n # 标准输入定义变量n
for (( i=0; i<=$n; i++ )) # 等同于for i in `seq 0 $n`,不赘述
do
sum=$sum+$i # 计算0到n之和
done
echo "0到这个数的整数之和=$sum"

自定义函数

vim建立脚本文件12345.sh:

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
function formax()
{
if [ $n -gt $m ]; then
return $n
else
return $m
fi
}
read -p "输入数值1:" n
read -p "输入数值2:" m
formax $n $m
echo "输入的最大值为$?" # $?表示上个指令的返回值

自定义了一个formax函数判断输入的两个数值大小,可以看出shell脚本中是一行一行读取指令的。自定义函数可以被引用,保存上述{}内的指令至原文件名12345.sh,在下一个脚本文件中,将函数放在脚本开始处, shell解释器发现它才可以进行调用(如下所示)

vim建立脚本文件test.sh:

1
2
3
4
5
6
#!/bin/bash
source 12345.sh
read -p "输入数值1:" n
read -p "输入数值2:" m
formax $n $m
echo "输入的最大值为$?"

自定义函数被成功调用

欢迎小伙伴们留言评论~