Shell 脚本学习

本文详细介绍了Shell脚本的格式,包括后缀、首行设置和注释格式,以及三种执行方式。接着讨论了Shell变量,包括系统环境变量、自定义变量的创建和操作,特殊变量的用法。还涵盖了字符串变量、数组以及内置命令和运算符。此外,文章还讲解了流程控制结构如if、case、while、for和函数的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

shell 脚本格式

后缀

以 .sh 结尾

首行设置

设置解析器 #!/bin/bash

注释格式

单行注释 #…
多行注释 :<<!


! 感叹号可以替换为任意符号

常用3种执行方式

1、sh : sh 脚本文件
2、bash : bash 脚本文件
3、仅路径执行: ./脚本文件 需要脚本文件具有可执行权限

shell变量

系统环境变量

通过加载shell配置文件加载到系统中
1、全局配置文件
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
2、用户配置文件
用户/.bash_profile
用户/.bashrc

查看系统环境变量

env 查看系统环境变量
set 查看系统环境变量+自定义变量+函数

创建系统环境变量

1、在/etc/profile文件中追加命令声明变量:export var=value
2、重载文件 source /etc/profile

常用系统环境变量

在这里插入图片描述

自定义变量

自定义局部变量

范围:脚本文件中定义
语法:var_name=value
规范:1、数字、字母、下划线、不能使用数字开头
2、等号两侧不能有空格
3、默认都是字符串类型,不能直接运算
4、变量值有空格,变量要用双引号括起来
5、不能使用shell的关键字

自定义常量

语法 :readonly var_name
作用:变量值不可以改动

自定义全局变量

父子shell:在父shell脚本中调用的shell脚本为子shell
在父shell中定义全局变量,可在子shell中调用
语法:export var_name

自定义变量的操作

删除语法: unset var_name
使用:

1、 $ var_name
2、$ {var_name} 适合字符串去拼接

特殊变量

$n

语意: $n: n-> 1~9 表示shell脚本接收的1 ~ 9 的参数,
n>9, 获取参数方式为 ** ${n}**
n=0, $0 为当前脚本名
传参: sh 脚本 n1 n2 n3 …

$#

语义:获取参数个数

$ *、$@

语义:获取所有参数,但格式不同
$ *:拼接为一个参数
$@:得到一组参数,可以循环遍历

$?

语义:获取上一个shell命令的返回值,或函数的返回值
返回0 ->执行成功
返回 非0->执行失败

$$

语义获取当前shell环境ID号

shell 环境变量深入:加载流程原理介绍

shell工作环境

用户进入linux系统时会加载全局配置文件和用户配置文件

shell工作环境分类

是否交互
交互式shell :输入命令,shell立刻反应
非交互式shell:不需要用户参与
是否登录
shell登陆环境:需要用户名和密码
shell非登录环境:不需要用户名和密码
加载系统环境变量的顺序不同
在这里插入图片描述

识别shell环境

shell登陆环境执行脚本文件

语法: sh/bash -l/–login 脚本文件

shell非登陆环境执行脚本文件

语法:
bash #加载shell非登录环境
sh/bash 脚本文件 #直接执行脚本文件

不同环境加载的变量不同
识别登录环境

echo $0 输出bash 非登录环境 输出-bash 登陆环境

切换shell环境

1、直接登录加载shell环境:shell登录环境
2、su切换用户加载shell登录与非登录环境
shell登录环境:切换到指定用户的登录环境
语法:su 用户名 --login
su 用户名 -l
shell非登录环境:切换到指定用户的非登陆环境
语法:su 用户名
3、bash 加载shell登录与非登录环境

shell字符串变量

字符串的三种格式

1、单引号 :原样输出,字符串拼接无效,转义字符无效,不解析变量
2、双引号 :可以使用转义字符,可以字符串拼接,可以包含子双引号 推荐
3、不用引号 :与双引号类似,但是字符串不能包含空格

获取字符串长度

语法:${#字符串变量名}

字符串拼接

1、无符号拼接
2、双引号拼接 推荐
3、混合拼接

字符串截取

在这里插入图片描述

shell数组

数组定义

shell只支持一维的数组
语法:方式一 array=(v1 v2 v3…)
方式二 array=([index1]=v1 [index2]=v2…) #指定下标

数组的获取

1、通过下标获取元素值,index从0开始
${arr[index]}
2、获取值并赋给其他变量
3、获取数组中的所有元素
${arr[@]}
${arr[]}
4、获取数组的长度或个数
${#arr[@]}
${#arr[
]}
5、获取指定元素的长度
${#arr[index]}

数组的拼接

arr3=(${arr1[@]} ${arr2[@]})

数组的删除

unset arr[index] 删除指定索引元素,删除后该位置元素为空
unset arr 删除数组

shell 内置命令

判断是内置命令还是脚本命令

type 命令
在这里插入图片描述
内置命令在内存中,执行快

alias

语义:设置别名
语法:alias 展示所有别名
alias 别名=“命令”
unalias 别名 ======>删除别名
unalias -a ======>删除当前shell的所有别名

echo

语义:输出字符串,默认在最后添加换行
语法:echo 字符串
echo -n 字符串 不换行
echo -e 字符串 解析字符串的转义字符 ,如 \n \c->清楚默认的换行符

read

语义:读取控制台输入
语法:read [-options] [var1 var2 var3…] option和var可选,当省略时读入的值赋值给环境变量 REPLY中
-options
在这里插入图片描述

exit

语义:退出当前shell环境,结束运行,并返回状态码
语法:exit 返回0,表示正确退出
exit 非零数字 返回设置的数字,表示错误状态退出

declear

用法

1、声明shell变量,并设置变量属性
2、显示shell 函数
3、设置关联数组

参数

在这里插入图片描述

关联数组

语义:key-value 相当于java中的map
语法:
定义 declear -A arrname=([“key”]=value…)
获取 ${arr[“key”]}

test

语义:可以对整数、字符、和文件进行检测,功能与 [ ]一样
语法:
if test n1 option n2
then

option 参见 [ ]中使用的比较运算符

shell 运算符

算数运算符
expr

语法:expr 算数运算符表达式
result=·expr 表达式· *反引号包裹 表达式要有空格 ,不能算小数,括号要转义
在这里插入图片描述
在这里插入图片描述

比较运算符
整数比较

两侧有空格
在这里插入图片描述
在这里插入图片描述

字符串比较

介绍:比较两个变量,可以为整数、小数、字符串,注意两侧空格
语法
1、[[ ]]
2、[ ]

在这里插入图片描述
单括号和双括号的区别 :
双方括号 大于小于号不用转义
双方括号不会分割字符串

布尔运算符

逻辑运算符常常和test命令一起使用,布尔运算符在单括号中才生效
在这里插入图片描述

逻辑运算符

支持双括号,方括号和圆括号都可
在这里插入图片描述

! 逻辑非 [[ ! 表达式 ]]

文件测试运算符

在这里插入图片描述
在这里插入图片描述

shell计算命令

expr

1、整数计算
2、字符串操作

expr对字符串的操作

语法:
expr length string 获取长度
expr substr string start end 截取字符串
expr index 主串 子串 获取字串位置,返回字串第一个字符出现的位置
expr match string 正则表达式 匹配正则表达式
expr string : 正则表达式 匹配正则表达式

((表达式))

对整数进行操作

在这里插入图片描述

let

let只用于赋值计算,不能直接输出,不能条件判断.
最简洁的整数运算赋值方法
let 表达式1 空格 表达式2
在这里插入图片描述

$[]

于let、(())类似,但是只能对单个表达式求值输出
用法: $[表达式] ,表达式内部不能赋值
在这里插入图片描述

整数计算小结

在这里插入图片描述

bc(计算器工具)

介绍

在这里插入图片描述

语法

在这里插入图片描述
参数可以为包含表达式的文件
在这里插入图片描述
在这里插入图片描述

内置变量

在这里插入图片描述
在这里插入图片描述

内置函数

在这里插入图片描述
在这里插入图片描述

使用bc

1、互动式
在这里插入图片描述

2、非互动式的管道计算
shell脚本中使用管道使用bc
直接进行表达式计算
echo " expression" | bc [option]
expression:
要符合bc要求的格式
可以使用shell变量
在这里插入图片描述
给变量赋值的两种方法
在这里插入图片描述

3、非互动式输入重定向运算
将表达式输出给bc执行
反引号和$()都可以
在这里插入图片描述

流程控制

if

语法:
1、if
if 条件
then
命令
fi
一行写法
if 条件;then 命令;fi
2、if else
if 条件
then
命令
else
命令
fi
3、if elif else
if 条件1
then
命令
elif 条件2
then 命令
elif 条件3
then
命令

else
命令
fi

case

cash value in
匹配模式1) ===>匹配模式支持简单的正则 这四种 * [abc] [m-r] |
命令1
命令2
……
;; =====>注意结尾的冒号
匹配模式2)
命令1
命令2
……
;;



匹配模式*) ===>都不匹配时,默认执行
命令1
命令2
……
;;
esac

while

while 条件
do
	command1
	command2
	...
	continue;
	break;
done

until

条件为false进入循环,条件为true停止循环

#语法
until condition
do
	command
done

for

三种循环方式
方式一

for var in item1 item2 ...itemN
do
	command1
	command2
	...
done
#可以写为一行

方式二

#在范围 start到end中循环
for var in {start..end}
do
	command
	...
done

方式三

#与其他语言写法类似
for((i=start;i<=end;i++ ))
do
	command
	...
done

select

shell独有的语法,可以增强交互性,显示出带编号的菜单,输入不同编号就可以选择不同菜单,执行不同的功能
select 是无限死循环,遇到break语句或者 ctrl+d 才会结束循环
执行过程中终端会输出 #? 代表可以输入的菜单编号
常与case in 配合使用

select var in emnu1 emnu2...
do
	command
done

shell函数

系统函数

basename 获取文件名函数

basename [string/pathname] [suffix]
#suffix:去掉指定后缀

dirname 从指定的文件绝对路径去除文件名,返回剩下的前缀目录路径

dirname 文件绝对路径

自定义函数

语法

#定义函数
[function] funname(){
 command
 [return  返回值]     #指定返回值,则可以用$? 获取返回值,不指定返回值,则自动返回执行状态
}
#调用
funname 参数1  参数2 ....   #参数的使用和shell使用参数相同 $n

在这里插入图片描述
在这里插入图片描述

shell程序和函数区别

函数会在当前shell中运行
shell程序会打开一个子shell

shell 重定向输入/输出

标准输入 键盘
标准输出 屏幕
默认输入输出文件 stdin 0 stdout 1 stderr 2 ==>临时文件
重定向:改变标准输入和标准输出的位置

重定向语法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

wc命令

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值