Linux Shell 脚本编程基础知识篇(一)
ℹ️大家好,我是练小杰,从今天开始是Linux shell脚本编程的基础知识内容,后续我会不断补充~~
更多Linux 相关内容请点击👉“Linux专栏”~
假面驾驭,时王,假面骑士时王~~
文章目录
- 什么是 Linux Shell
- 主要功能
- 常见SHELL类型
- Shell 的优势
- 文件编译器
- Vim
- Nano
- Emacs
- Gedit
- Kate
- Sublime Text
- Atom
- Micro
- Helix
- Midnight Commander (mcedit)
- 运行Shell脚本命令
- 脚本需要有可执行权限,若没有X权限时,有以下两种办法
- 编写Shell脚本并运行(新手)
- 温馨提醒
- Shell变量
- shell变量类型
- 自定义变量
- 举个例子:
- 环境变量
- 相关配置文件
- 位置变量
- 实例:
- 预定义变量
- 变量的数值计算
- 举例:
- 逻辑运算符
- **算数运算符**
- 双小括号 `(( ))`
- 实例:
- Shell 中的 ‘ | ’ 符号
什么是 Linux Shell
Shell本身是一个用C语言编写的程序, 它是用户使用Linux的桥梁。Shell既是一种命令语言, 又是一种程序设计语言。
所有的Linux
命令都是Shell
脚本语言。
其中shell
文件命名以.sh
为后缀,例如:lxj.sh
⚠️Linux中的三大查询命令都能结合起来用,也就是awk、sed、grep
都能用管道“ |
”结合用
主要功能
- 命令的解释:
读取用户输入的命令,解释并执行这些命令 - 脚本编写:
允许用户编写脚本(批处理文件),自动化执行一系列命令。 - 环境配置:
管理用户的环境变量,如PATH、HOME
等。 - 输入输出重定向:
将命令的输入和输出重定向到文件或其他设备。 - 管道“
|
”:
将一个命令的输出作为另一个命令的输入,实现命令的组合使用 - 作业控制:
管理后台和前台作业,允许用户暂停、恢复和终止作业。
常见SHELL类型
- Bash (Bourne Again Shell):
最常用的 Shell,广泛应用于大多数Linux
发行版本。 - Sh (Bourne Shell):
由 Stephen Bourne 开发的原始 Shell,广泛用于Unix
系统。 - Csh (C Shell):
语法类似于 C 语言,适合习惯于C 语言
的程序员。 - Tcsh (TENEX C Shell):
Csh 的增强版本,提供了命令行编辑和拼写检查等功能。 - Ksh (Korn Shell):
由 David Korn 开发,兼容于Bourne Shell
,并增加了许多新特性。 - Zsh (Z Shell):
现代的、功能丰富的 Shell,结合了Bash、Ksh
和Tcsh
的特性
Shell 的优势
- Shell 提供了与操作系统交互的便捷方式,适合日常的系统管理任务
- 通过编写 Shell 脚本,用户可以自动化执行重复性任务,提高效率
- 同时,Shell 也提供了变量、循环、条件判断等命令,使得脚本编写更加灵活
文件编译器
Linux Shell 中,有多种文本编辑器可供选择,涵盖了从命令行到图形界面的各种工具
Vim
- 支持语法高亮、插件扩展、宏录制等功能,适合高级用户使用
- 安装命令:
sudo apt install vim
- 使用
vim
编辑脚本
打开文件:
vim 文件名
进入插入模式:按i
退出插入模式:键盘按Esc
保存并退出:输入:wq
并按Enter
退出编辑
Nano
-
基本的文本编辑功能,并且界面底部显示了常用的快捷键
-
安装命令:
sudo apt install nano
-
使用nano编辑脚本
打开文件:
nano 文件名
保存文件:按Ctrl + O
退出编辑器:按Ctrl + X
Emacs
- 具有丰富的插件和自定义选项,适合需要高度定制化环境的用户
- 安装命令:
sudo apt install emacs
- 使用方式:
打开文件:
emacs 文件名
保存文件:按Ctrl + X
然后按Ctrl + S
退出编辑器:按Ctrl + X
然后按Ctrl + C
Gedit
- GNOME 桌面环境的默认文本编辑器,提供图形用户界面,适合需要图形界面的用户
- 安装命令:
sudo apt install gedit
- 使用方式:
打开文件:
gedit 文件名
保存文件:点击“保存
”按钮
退出编辑器:点击“关闭
”按钮
Kate
- KDE 桌面环境的文本编辑器,支持多文档编辑、语法高亮等功能,适合需要高级编辑功能的用户。
- 安装命令:
sudo apt install kate
- 使用方式:
打开文件:
kate 文件名
保存文件:点击“保存
”按钮
退出编辑器:点击“关闭
”按钮
Sublime Text
- 跨平台文本编辑器,具有快速启动、强大的搜索和替换功能,适合需要高效编辑环境的用户。
- 安装命令:
sudo snap install sublime-text --classic
- 使用方式:
打开文件:
sublime-text 文件名
保存文件:按Ctrl + S
退出编辑器:点击“关闭
”按钮
Atom
-
由 GitHub 开发的免费开源文本编辑器,支持多种编程语言和插件扩展
-
具有高度可定制性,适合需要自定义编辑环境的用户。
-
安装命令:
sudo snap install atom --classic
-
使用方式:
打开文件:
atom 文件名
保存文件:按Ctrl + S
退出编辑器:点击“关闭
”按钮
Micro
- 易于使用且高度可定制的文本编辑器,支持通用复制/粘贴/保存快捷键。
- 安装命令:
sudo apt install micro
- 使用方式:
打开文件:
micro 文件名
保存文件:按Ctrl + S
退出编辑器:按Ctrl + Q
Helix
- 基于 Rust 的终端文本编辑器,快速且高效,使用
Tree-Sitter
进行语法高亮,适合需要现代编辑功能的用户。 - 安装命令:
git clone https://github.com/helix-editor/helix
cd helix
cargo install --path helix-term
- 使用方式:
打开文件:
helix 文件名
保存文件:按Ctrl + S
退出编辑器:按Ctrl + Q
Midnight Commander (mcedit)
- 一个命令行文件管理器,其内部文件编辑器
mcedit
也是一个功能强大的文本编辑器,适合需要文件管理和编辑功能的用户。 - 安装命令:
sudo apt install mc
- 使用方式:
打开文件:
mcedit 文件名
保存文件:按F2
退出编辑器:按F10
运行Shell脚本命令
- 一般形式:
./filename.sh 或者 source filename.sh
#使用“ ./ ” 执行脚本需要增加X执行权限。
⚠️ 一般运行脚本之前都需要先给
.sh
脚本增加可执行(x
)权限。
- 输入重定向到Shell脚本
Shell从指定文件中读入命令行,并进行相应处理
bash < filename.sh
脚本需要有可执行权限,若没有X权限时,有以下两种办法
- 给文件增加可执行权限
chmod 744 filename.sh 或者 chmod a+x filename.sh
- 强制执行脚本文件,则不需要在脚本文件开头加Bash 解释器
#!/bin/bash
或者 Shell解释器#!/bin/sh
sh [选项] filename.sh 或者 bash [选项] filename.sh
-v
选项:允许用户查看Shell程序的读入和执行,会打印出命令行的原始内容
x
选项: 允许用户查看Shell程序的执行,会打印出经过替换后的命令行的内容
编写Shell脚本并运行(新手)
- 利用
vim
编辑器
vim lxj.sh
- 编辑
lxj.sh
文件,保存并退出
#!/bin/bash
echo "Wellcome to lxj"
- 增加可执行权限并运行
chmod 744 lxj.sh
./lxj.sh
运行结果:
Wellcome to lxj
温馨提醒
source filename
与sh filename
及./filename
执行脚本的区别
-
当shell脚本具有可执行权限(
X
)时,用sh filename
与./filename
执行脚本是没有区别的。./filename
是因为当前目录没有在PATH
中,所有“.
”是用来表示当前目录的。 -
sh filename
重新建立一个子shell,在子shell中执行脚本里面的语句,该子shell继承父shell的环境变量,但子shell新建的、改变的变量不会被带回父shell。 -
source filename
:这个命令其实只是简单地读取脚本里面的语句依次在当前shell里面执行,没有建立新的子shell。那么脚本里面所有新建、改变变量的语句都会保存在当前shell里。
Shell变量
shell变量类型
四类: 自定义变量、环境变量,位置变量和预定义变量
自定义变量
-
定义:变量名=变量值 ,变量名必须以字母或下画线开头,区分大小写,如
a=192.168.16.11
(储存数据) -
变量名的命名规则:
首个字符必须为字母(
a-z,A-Z
)
中间不能有空格,可以使用下划线(_
)
不能使用标点符号
不能使用Shell中的关键字
- 使用变量:
$变量名 (一个值)
变量名还可以加上花括号“{}
”
- 查看变量:
echo $变量名
#查看某个变量echo $变量名 set
#所有变量: 包含自定义变量和环境变量
- 只读变量
使用readonly
或者declare -r
命令可以将变量定义为只读变量,只读变量的值不能被改变
readonly $变量名= 变量值
declare -r $变量名= 变量值
- 取消变量:
unset 变量名
- 作用范围:仅对当前Shell脚本有效
举个例子:
#!/bin/bash
a=lxj #等号左右不能有空格
echo "I am $a"
结果:
I am lxj
环境变量
作为系统环境的一部分,不必去定义它们,可以在Shell程序中使用它们,某些变量(如PATH)可以在Shell中修改并将它看作全局变量。
- 定义:
export 命令声明 ,比如:
export HISTSIZE=100
#暂时修改为查看最近100条的操作痕迹
- 用法:
$变量名 或 ${变量名}
- 查看环境变量:
查看某个环境变量,例如
echo $PATH
查看当前环境的所有环境变量
env
- 作用范围:对当前Shell 和子shell 都有效果
相关配置文件
全局文件: /etc/profile (所有用户都有效)
用户文件: /.bash_profile (对指定用户有效, 进入目录 /home 找到你的用户目录才能用)
永久性改变环境变量置目录:/etc/bashrc
⚠️修改变量后不会立刻生效,必须要刷新文件
source /etc/profile #文件路径,立刻生效
位置变量
-
作用:在命令行、函数或者脚本中传递参数,变量不用定义。
-
命令详解:
$0
获取当前的Shell脚本的文件名
$1-$9
接收的第1~9个参数
${10}
从第10个参数开始,必须用大括号括起来
实例:
-运用vim编辑器
vim lxj.sh
- 编写脚本
#!/bin/bash
echo $1
echo $2
- 运行脚本
./lxj.sh 1 2
结果:
1
2
预定义变量
- 命令定义解释:
$0
脚本名
$*
显示所有参数
$@
显示所有参数
$#
当前参数的个数
$$
当前进程PID号
$!
上一个后台进程的PID号
$?
上一个命令的返回值,返回0表示成功、返回非0数表示运行错误
变量的数值计算
- 数值计算的优先级:
()>!>算术运算符 > 关系运算符> 逻辑运算符>赋值运算符
举例:
#!/bin/bash
a=10
b=5# 加法
sum=$((a + b))
echo "a + b = $sum"# 减法
diff=$((a - b))
echo "a - b = $diff"# 乘法
prod=$((a * b))
echo "a * b = $prod"# 除法
quot=$((a / b))
echo "a / b = $quot"# 取模
mod=$((a % b))
echo "a % b = $mod"# 幂运算
power=$((a ** b))
echo "a ** b = $power"
结果:
a + b = 15
a - b = 5
a * b = 50
a / b = 2
a % b = 0
a ** b = 100000
逻辑运算符
-f
判断文件是否存在 例如:if [ -f filename ]
-d
判断目录是否存在 例如:if [ -d dir ]
-a
与运算(and) 例如: 逻辑表达式 –a 逻辑表达式
-o
或运算(or) 例如: 逻辑表达式 –o 逻辑表达式
-z
空字符串
算数运算符
-eq
#等于 应用于:整型比较 equal
-ne
#不等于 应用于:整型比较 not equal
-gt
#大于 应用于:整型比较 greate
-lt
# 小于 应用于:整型比较 letter
-ge
#大于或等于 应用于:整型比较 greate equal
-le
#小于或等于 应用于:整型比较 letter equal
双小括号 (( ))
-
作用:进行数值运算与数值进行比较
-
语法要求:
((i=i+1))
称为运算后赋值法,把i+1
的运算后结果赋值给变量i
#!/bin/bash
i=1
echo $((i=i+1)) #输出结果为2
i=$((i+1))
在(( ))
前加$
符,表示将表达式运算后赋值给i
#!/bin/bash
i=1
echo i=$((i+1)) #输出结果i=2
- 加入逻辑运算
((8>7&&5==5))
#!/bin/bash
echo $((8>7 && 5==5)) #输出结果为1
⚠️注意:上面涉及的数字及变量必须为整数(整型),不能是小数(浮点数)或字符串。
实例:
[root@master home]# a=5
[root@master home]# b=10
[root@master home]# echo $((a>(b-1)&&2-b))
0
[root@master home]# echo $(($a>($b-1)&&2-$b))
0
Shell 中的 ‘ | ’ 符号
利用管道二次筛选数据:
awk "{print }" /etc/passwd
#输出该目录文件的内容awk "{print }" /etc/passwd | grep lian
#上面内容基础下进行筛选有字符串lian的部分
想要了解更多内容点击👉“练小杰的CSDN”!!!
今天星期三,明天星期四,再坚持3天就是冬至了!!!
明天见,各位大佬!!😄