本篇讲解:Shell编程规范与变量:Shell概述、Shell脚本详解和执行
Shell概述
Shell
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
Shell是一个特殊的应用程序,介于操作系统内核与用户之间,充当命令解释器的角色。
Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。
Shell功能:接收用户输入的命令,将其传递给内核执行,并将执行结果返回给用户。
Shell脚本
Shell 脚本(shell script),是一种为 shell 编写的脚本程序。
业界所说的 shell 通常都是指 shell 脚本,但我们要知道,shell 和 shell script 是两个不同的概念。
所以,一般习惯而言,“shell编程” 都是指 shell 脚本编程,不是指开发 shell 自身。
因此Shell脚本(文件)是将一系列命令按顺序保存到一个文本文件中,然后通过赋予该文件可执行权限来执行这些命令。脚本可以结合各种Shell控制语句,以完成更复杂的操作。
Shell环境
Shell 环境是一个用户与操作系统内核交互的命令解释器,允许用户执行命令、运行脚本、管理文件系统等。
Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。
Linux 的 Shell 种类众多,常见的有:
- Bourne Shell(/usr/bin/sh或/bin/sh)
- Bourne Again Shell(/bin/bash)
- C Shell(/usr/bin/csh)
- K Shell(/usr/bin/ksh)
- Shell for Root(/sbin/sh)
- ……
其中 Bash 在日常工作中被广泛使用。同时,Bash 也是大多数Linux 系统默认的 Shell。
在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改为 #!/bin/bash。
Shell的作用
Shell的作用—命令解释器
Shell充当用户与操作系统内核之间的“翻译官”,负责解释用户输入的命令并将其传递给内核执行。
用户的登录Shell
-
登录Shell:是用户登录系统后默认使用的Shell程序,通常为
/bin/bash
。 -
禁止登录Shell:
/bin/nologin
,但它是一个独立程序,不是Shell环境。功能主要是阻止用户登录,不提供命令解释功能,也不允许用户交互式地使用系统。因此,尽管它被放在类似Shell的路径中(如/bin/bash
或/bin/sh
),但它并不具备Shell的特点。 -
Shell类型:不同Shell有不同的内部指令和运行环境,常见的Shell有
bash
、sh
、tcsh
、csh
等。查看系统支持的Shell:
cat /etc/shells
该文件列出了系统支持的Shell程序,例如:
/bin/sh /bin/bash /usr/bin/sh /usr/bin/bash
存放系统的Shell路径-/etc/shells文件
/etc/shells
文件用于列出系统中所有合法的Shell程序路径。一些系统服务在运行时需要检查用户可用的Shell,通过查询 /etc/shells
文件来确定这些Shell的合法性和可用性。
只有在该文件中列出的Shell才被视为合法Shell,用户才可以在登录或其他操作中使用它们。
用户获取Shell
当用户登录系统时,系统会自动为该用户分配一个默认的Shell环境。这个Shell环境的信息被记录在 /etc/passwd
文件中,该文件包含了用户的账号信息,包括用户的默认Shell路径。这个默认Shell是用户登录后与系统交互的命令解释器。
Shell脚本
Shell脚本的应用场景
- 重复性操作:自动化处理常规任务,减少人工操作。
- 交互性任务:用于执行需要与用户交互的任务。
- 批量事务处理:执行需要处理大量数据或文件的任务。
- 服务运行状态监控:定期检查和监控系统服务的状态。
- 定时任务执行:配合定时任务调度器(如
cron
)执行周期性任务。
Shell脚本的作用
- 自动化运维:通过脚本自动执行复杂和重复的操作。
- 批量化操作:处理大批量文件或数据,减少人为错误。
- 减轻管理员工作量:通过脚本执行重复任务,提升效率。
- 处理文本文件:通过脚本快速、批量处理文本文件。
- 避免配置错误:使用脚本配置系统,减少手动操作导致的错误。
Shell脚本的构成
-
脚本声明(解释器):
- 声明格式:脚本的第一行(Shebang
#!
)通常为#!/bin/bash
,表示该脚本由/bin/bash
程序解释执行。
- 声明格式:脚本的第一行(Shebang
-
注释信息:
- 注释格式:以
#
开头的行表示注释,注释内容不会在脚本执行时被运行。
- 注释格式:以
-
可执行语句:
- 语句示例:如
echo
命令用于输出字符串内容。
#!/bin/bash # This is a sample script. echo "Hello, World!"
- 语句示例:如
-
拓展:Shebang 与 shell 的区别:
Shebang:是指定解释器的机制,用于脚本文件头。
Shell:是操作系统中的命令行解释器,如 Bash、Zsh,它解释和执行用户输入的命令或脚本。
常见符号的含义与用法
双引号("
)
-
含义和用途:双引号用于定义字符串。当字符串被双引号包围时,其中的大多数特殊字符(如
$
、\\
和"
)会被特殊处理,而其他字符则按字面意义处理。 -
示例:
echo "The value of variable is: $VARIABLE"
单引号('
)
-
含义和用途:单引号用于定义字符串,但不同于双引号,单引号包围的字符串中的所有字符都按字面意义处理,不会进行变量扩展或替换。
-
示例:
echo 'The value of $VARIABLE will not be expanded'
感叹号(!
)
-
含义和用途:在Shell脚本中,感叹号通常用于表示历史命令替换。
例如,
!!
表示上一个命令,!n
(其中n为数字)表示历史中的第n个命令。 -
示例:
!!
小括号(()
)
-
含义和用途:在正则表达式中,小括号用于捕获组可以匹配并记住匹配的子串,以便后面引用。例如,在正则表达式中,(abc) 会匹配并记住"abc"。
在Shell脚本中,小括号用于创建子Shell或定义数组。
-
示例:
(cd /tmp && ls)
中括号([]
)
-
含义和用途:在正则表达式中,中括号用于定义字符集,匹配括号内的任意一个字符。例如,在正则表达式中,[abc]会匹配"a°、"b"或"c"中的任意一个字符。
在Shell脚本中,中括号用于数组索引和条件测试。
-
示例:
[ $a -lt $b ]
双小括号((())
)
-
含义和用途:双小括号用于Shell脚本中的算术扩展和算数运算。
-
示例:
echo $((2 + 3)) # 输出:5
双中括号([[ ]]
)
-
含义和用途:在bash中,双中括号用于条件测试,提供比单中括号更强大的功能。
-
示例:
if [[ $string == "hello" ]]; then echo "Match!"; fi
大括号({}
)
-
含义和用途:大括号用于扩展字符串或序列,也用于定义代码块。在正则表达式中,它们通常用于表示数量的范围。
-
示例:
echo {1..5} # 输出:12345
Shell脚本的执行
方法一:指定路径执行(文件必须有x可执行权限)
-
为脚本文件添加可执行权限:
- 直接在当前目录中执行脚本,需要使用
./
来指定路径。./
表示当前目录。 - 脚本会在一个新的子Shell中执行,使用的是脚本文件的shebang行中指定的解释器(如
#!/bin/bash
)。
chmod +x /root/first.sh
- 直接在当前目录中执行脚本,需要使用
-
通过指定路径执行脚本:
- 绝对路径:
/root/first.sh
- 相对路径:
./first.sh
- 绝对路径:
方法二:指定Shell解释脚本(文件无需x可执行权限)
-
使用
sh
命令执行:- 在一个新的子Shell中执行,并且会强制使用
sh
解释器来执行脚本,即使脚本的shebang行指定了其他解释器。 - 使用
sh
命令显式调用脚本,不需要指定脚本的执行权限。
sh /root/first.sh # 或者bash也可以 bash /root/first.sh
- 在一个新的子Shell中执行,并且会强制使用
-
使用
source
或.
命令执行:- 在当前Shell中执行,不创建子Shell。
- 脚本中的变量和环境设置会直接影响当前Shell。
source /root/first.sh # 等同于 . /root/first.sh
source 命令的含义与功能
-
定义:
source
命令,也称为“点命令”(.),是bash的内部命令。 -
功能:
source
命令通常用于重新加载刚修改的初始化文件,使其立即生效,而不必注销并重新登录。(不能用于所有文件)
-
与
sh
命令的区别:- 使用
sh
命令会在子Shell中执行脚本,子Shell的环境变量不会影响父Shell。 - 使用
source
命令会在当前Shell中执行脚本,所有变量和环境的改变会保留在当前Shell中。
- 使用
三个命令的区别(source file、sh file 和 ./file)
- 当shell脚本具有可执行权限时,用 sh filename 与 ./filename 是没有区别的。
./filename是因为当前目录没有在PATH中,所以"."是用来表示当前目录的。 - sh 会重新建立一个子shell,在子shell中执行脚本里面的语句,该子shell继承父shell的环境变量,但子shell是新建的,其改变的变量不会被带回父shell,除非使用export。
- source 读取脚本里面的语句依次在当前shell里面执行,没有建立新的子shell。
脚本里面所有新建、改变变量的语句都会保存在当前shell里面。
示例:编写一个简单的Shell脚本
vim /root/first.sh
#!/bin/bash
# This is my first Shell-Script.
cd /boot
echo "当前的目录位于:"
pwd
echo "以 vml 开头的文件包括:"
ls -lh vml*
解释:首先切换到/boot
目录,打印当前目录路径,并列出以vml
开头的文件。
注:图片来源于网络,侵删。