Linux里 Shell脚本基础及变量
一 Shell 脚本概述
1.1 shell 脚本的概念
- 将要执行的命令按顺序保存到一个文本文件
- 要给该文件可执行权限
- 可以结合各种Shell 控制语句以完成更复杂的操作
1.2 Shell 脚本应用场景
- 重复性操作
- 交互性任务
- 批量事务处理
- 服务运行状态监控
- 定时任务执行
- ......
1.3 Shell 的作用
Shell ——命令解释器,介于系统内核与用户之间,一种被称为解释性语言或者脚本语言的计算机语言。充当"翻译官"的作用
Linux 系统中运行的 一种特殊程序,用户登录Linux 系统时,自动加载一个Shell 程序
Linux 系统棕默认使用的Shell程序是 Bash ,文件位于 /bin/bash
不同Shell 的内部指令,运行环境会有区别
1.4 Shell 基本的构成
- 脚本声明
- 注释信息
- 可执行语句
[root@host102 ~]# vim test.sh
复制[root@host102 ~]# chmod +x test.sh
[root@host102 ~]# ll test.sh
-rwxr-xr-x 1 root root 42 7月 5 14:07 test.sh
1.5 脚本的执行
- bash 加 脚本
- 文件名直接执行(直接脚本的绝对路径或者相对路径执行)
- source 或者 点 "." 加脚本执行
1.6 脚本执行方法的区别
bash +脚本 : 新开了一个bash 环境,然后在这个新的bash 环境中运行脚本内程序
文件名直接执行: 这个方法是将脚本作为一个可执行程序,所以,要写脚本的绝对路径或者相对路径。由于脚本本身作为可执行程序,所以,会创建名为脚本名(test.sh) 的子进程
source或者点 " . ": 这两个命令都是在当前 shell 环境下,使用当前的解释器读取并执行命令,不会新开一个shell 环境或者 其他的子进程。由于这两个命令都是将 脚本作为参数,所以,不需要脚本有 执行权限x
将之前的脚本内容修改,加上 'sleep 1000'
复制[root@host102 ~]# vim test.sh
#!/bin/bash
#This a test file
sleep 1000
echo "hello world"
先psree 查看进程树
[root@host102 ~]# pstree
然后运行脚本,再打开另一个终端 查看进程树
(1)[root@host102 ~]# bash test.sh
(2) [root@host102 ~]# ./test.sh
(3) [root@host102 ~]# source test.sh
使用type 命令查看 source
和 " . "
[root@host102 ~]# type source .
1.7 重定向操作
1.7.1 交互式硬件设备
- 标椎输入: 从该设备接收用户输入的数据
- 标椎输出:通过该设备向用户输出数据
- 标椎错误输出:通过该设备报告执行出错信息
类型 | 设备文件 | 文件描述编号 | 默认设备 |
---|---|---|---|
标椎输入 | /dev/stdin | 0 | 键盘 |
标椎输出 | /dev/stdou | 1 | 显示器 |
标椎错误输出 | /dev/stderr | 2 | 显示器 |
1.7.2 重定向操作
类型 | 操作符 | 用途 |
---|---|---|
重定向输入 | < | 从指定的文件读取,而不是从键盘输入 |
覆盖重定向输出 | > 或者 1> | 将正确的输出的结果保存到指定文件(覆盖原有内容) |
追加重定向输出 | >> 或者 1>> | 将正确的输出的结果保存到指定文件(追加在文件尾部) |
覆盖标椎错误输出 | 2> | 将错误的输出的结果保存到指定文件(覆盖原有内容) |
追加标椎错误输出 | 2>> | 将错误的输出的结果保存到指定文件(追加在文件尾部) |
覆盖混合输出 | &> | 将标准输出,标准错误的内容保存到同一文件(覆盖原有内容) |
追加混合输出 | &>> | 将标准输出,标准错误的内容保存到同一文件(追加在文件尾部) |
补充:
操作符 | 用途 |
---|---|
>&2 或者 1>&2 | 将标准输出重定向到标准错误(即,让正确输出可以被 2> 收集) |
2>&1 | 将标准错误输出重定向到标椎输出(即,让错误的输出可以被 > 收集) |
1,重定向输入
[root@host102 opt]# cat < a abc
虽然 cat < a 和 cat a 结果是一样的,但是其表示意义不一样
2,标准重定向输出
如果前面命令返回值为0(即,命令正确),则将结果重定向输出到指定文件
返回值: 命令运行正确,则返回值为0 .命令运行错误,则返回非 0 值。可以用echo $?
查看上一条命令的返回值
3,标椎错误输出
接收错误输出的信息(命令返回值为 非0 值),重定向到指定文件
4.混合输出
将所有输出信息重定向到指定文件
5 , 1>&2 和 2>&1
2>&1 把标准错误输出重定向到标准输出
1>&2 把标准输出重定向到标准错误
1.8 管道操作符号
管道操作符号 " | " ,将左侧命令输出结果,作为右侧命令的处理对象
cmd 1 | cmd 2 [.....| cmdn]
复制[root@host102 opt]# cat /etc/passwd | wc -l
40
管道符号 加上 xargs ,可以将前面的结果作为参数传递给后面
复制[root@host102 opt]# ls | rm -rf
[root@host102 opt]# ls
123.txt abc rh
[root@host102 opt]# ls | xargs rm -rf
[root@host102 opt]# ls
二:Shell 脚本变量
2.1 变量概述
2.1.1 变量的定义:
变量就是会变的量。可以通过变量名得到变量值。在内存上开辟一个记录数据的空间,给它起个名字,如name,num 等,这些就是变量名。而存放在该空间的数据就是变量的值。
2.1.2 变量的格式
变量名=变量值
2.1.3 变量名命名规则:
- 变量名必须是以字母或下划线开头,名字中间只能由字母,数字,下划线"_" 组成,不能有小数点,特殊字符,空格,标点符号等。
- 变量名的长度不得超过255 个字符
- 变量名在有效范围内必须是唯一的。
- 变量名不能和系统命令,系统变量等冲突
- 变量名可以将开头字母打下,以防和系统命令等冲突
2.1.4 查看变量名
可以用echo $变量名 ,查看变量的值
复制[root@host102 opt]# name=lisi
[root@host102 opt]# echo $name
lisi
使用set 查看当前shell 里所有的变量
复制[root@localhost ~]# set
[root@localhost ~]# set | grep '^a'
a=1234
2.2 自定义变量
设置变量格式:
变量名=变量值
取消变量设置格式:
set 变量名
复制[root@localhost ~]# a=1234
[root@localhost ~]# echo $a
1234
[root@localhost ~]# unset a
[root@localhost ~]# echo $a
[root@localhost ~]#
引号的使用:
双引号 "":允许通过$ 符号引用其他变量值,不取消特殊符号的释义
单引号 '':禁止引用其他变量值,$视为普通字符,取消特殊符号的释义
反撇号``:命令替换,提取命令执行后的输出结果。作用与$() 相同
双引号:
复制[root@host102 opt]# myname=zhangsan
[root@host102 opt]# yourname=lisi
[root@host102 opt]# name="$myname,$yourname"
[root@host102 opt]# echo $name
zhangsan,lisi
单引号:
复制[root@host102 opt]# myhost=nanjing
[root@host102 opt]# youhost=beijing
[root@host102 opt]# host='$myhost,$yourhost'
[root@host102 opt]# echo $host
$myhost,$yourhost
反撇号:
复制[root@host102 opt]# myhostname=`hostname`
[root@host102 opt]# echo myhostname
myhostname
2.3 从键盘输入内容为变量赋值
read [-p “提示信息”] 变量名
复制[root@host102 opt]# read -p "input your name:" name
input your name:zhangsan
[root@host102 opt]# echo $name
zhangsan
2.4 设置变量的作用范围
格式:
export 变量名
export 变量名=变量值
局部变量:
直接设置的变量是局部变量,只在当前shell 环境生效,如果重开终端,或者开启一个新的shell 环境,或者登陆其他用户账号,则变量失效
复制[root@host102 opt]# name=lisi
[root@host102 opt]# echo $name
lisi
[root@host102 opt]# bash
[root@host102 opt]# echo $name
[root@host102 opt]#
全局变量:
可以在全局都有效的变量,不管是新的bash环境,还是其他用户账号,都会有效
格式1:
复制[root@host102 opt]# myhost=nanjing
[root@host102 opt]# echo $myhost
nanjing
[root@host102 opt]# export myhost
[root@host102 opt]# bash
[root@host102 opt]# echo $myhost
nanjing
[root@host102 opt]#
格式2:
复制[root@host102 opt]# export yourname=lisi
[root@host102 opt]# echo $yourname
lisi
[root@host102 opt]# bash
[root@host102 opt]# echo $yourname
lisi
[root@host102 opt]#
2.5 整数变量的运算
2.5.1 expr 进行运算
expr 变量1 运算符 变量2 [运算符 变量3]....
- 常用运算符
- 加法运算: +
- 减法运算: -
- 乘法运算: *
- 除法运算: /
- 求模(取余)运算 : %
复制[root@host102 opt]# expr 10 + 10 / 2
15
[root@host102 opt]# expr 10 + 10 % 3
11
复制[root@host102 opt]# a=10
[root@host102 opt]# b=20
[root@host102 opt]# c=5
[root@host102 opt]# expr $a + $b - $c
25
2.5.2 echo 加$[]
复制[root@host102 opt]# echo $[ 10 - 2 ]
8
[root@host102 opt]# a=10
[root@host102 opt]# b=20
[root@host102 opt]# echo $[a+b]
30
[root@host102 opt]#
2.5.3 echo $(( ))
复制[root@host102 opt]# echo $((10+10))
20
[root@host102 opt]# a=10
[root@host102 opt]# b=20
[root@host102 opt]# echo $((a+b))
30
[root@host102 opt]# echo $((a++))
10
2.6 环境变量
定义: 由系统提前创建,用来设置用户的工作环境
2.6.1设置环境变量
配置文件: /etc/profile , ~/bash_profile
/etc/profile : 针对全局的设置
~/bash_profile : 只对该用户生效
常见的环境变量:
环境变量 | 释义 |
---|---|
PATH | 指定命令的搜索路径(linux 根据PATH 的值搜索命令) |
HOME | 当前用户的家目录 |
HISTSIZE | 历史命令最大条数 |
LOGNAME | 当前登录用户名 |
USER | 当前用户名 |
SHELL | 当前用户使用的shell环境 |
HOSTNAME | 当前主机名 |
PWD | 当前所在目录名 |
查看环境变量:
env #显示当前shell 的所有环境变量
[root@host103 ~]# env
2.7 只读变量
该变量只能使用,无法修改其变量值,放在内存的只读区域。
适用于变量值不允许修改的情况
格式:
readonly 变量名
复制[root@host103 ~]# name=zhangsan
[root@host103 ~]# readonly name
[root@host103 ~]# echo $name
zhangsan
[root@host103 ~]# name=lisi
-bash: name: 只读变量
[root@host103 ~]# unset name
-bash: unset: name: 无法反设定: 只读 variable
[root@host103 ~]#
2.8 位置变量
2.8.1 位置变量有哪些
位置变量有:$0 , $n (n为正整数),$#,$*,$@,$?,$$
变量 | 含义 |
---|---|
$0 | 当前脚本文件名 |
$n | 第n个参数。用来传递给脚本或者函数 |
$# | 传递给脚本或者函数的所有参数 |
$* | 传递给脚本或函数的所有参数 |
$@ | 传递给脚本或者函数的所有参数 |
$? | 上个命令,函数,的返回值。0为真,非0位假 |
$$ | 当前shell 进程,脚本进程的PID |
复制[root@host103 opt]# vim test.sh
#!/bin/bash
cd /opt/
echo "\$0 is $0" # "\" 反斜杠取消转义
echo "\$1 is $1"
echo "\$2 is $2"
echo "\$# is $#"
echo "\$? is $?"
echo "\$\$ is $$"
:wq
[root@host103 opt]# chmod +x test.sh
[root@host103 opt]# ./test.sh
2.8.2 $* 与 $@ 区别
" **$ *** " 与 " $@" 都是表示传递给函数或者脚本的所有参数。
当 $* 和 $@ 没有 加 双引号 " " 时,都是将接受到每一个参数,看成独立的数据
当 $* 和 $@ 加 双引号 " " 时 , $* 将所有的参数看成一个数据, $@ 依然将每个参数看成独立的参数
复制[root@host103 opt]# vim example.sh
#!/bin/bash
echo "This is \"\$*\" :"
for a in "$*"
do
echo "$*"
done
echo "This is \"\$@\" :"
for b in "$@"
do
echo "$@"
done
:wq
[root@host103 opt]# source example.sh 1 2 3
This is "$*" :
1 2 3
This is "$@" :
1 2 3
1 2 3
1 2 3
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现