Shell
Shell 可以看作是一个命令解释器,为我们提供了交互式的文本控制台界面。我们可以通过终端控制台来输入命令,由shell进行解释并最终交给内核执行。
Shell教程基础
1. 基础操作与命令
-
文件和目录操作:
-
创建目录:
mkdir directory_name
-
更改工作目录:
cd path/to/directory
-
列出目录内容:
ls
-
删除空目录:
rmdir directory_name
-
删除文件或目录(递归删除):
rm -rf file_or_directory
-
-
执行命令与输出重定向:
-
执行命令:如
echo "Hello, World!"
输出文本 -
管道符(|):将一个命令的输出作为另一个命令的输入,如
ls -l | grep ".txt"
查找所有.txt文件 -
输出重定向:
command > output_file
将命令输出写入文件;command >> output_file
追加输出到文件
-
-
变量与字符串操作:
-
定义变量:
var="value"
-
使用变量:
${var}
-
字符串连接:
echo "${var} is my variable"
-
2. Shell脚本编写
-
创建脚本:在文本编辑器中创建一个
.sh
文件,例如script.sh
,并在开头添加执行权限声明#!/bin/bash
-
脚本示例:
#!/bin/bash # 创建目录 mkdir /usr/directory cd /usr/directory || exit 1 # 创建子目录 mkdir code util test
-
条件判断与流程控制:
-
if
条件语句:if [ condition ]; then commands fi
-
case
语句用于多分支选择:case $variable in pattern1) commands;; pattern2) commands;; *) default_commands;; esac
-
-
循环结构:
-
for
循环:for var in item1 item2 item3; do echo "$var" done
-
while
循环:while [ condition ]; do commands done
-
3. 函数定义与调用
-
定义函数:
function my_function() { # 函数体 }
-
调用函数:
my_function arg1 arg2
使用场景
场景一:自动化任务
-
自动备份特定目录下的文件。
-
每天定时检查服务器状态并发送报告邮件。
场景二:系统管理
-
在多个服务器上批量安装软件或更新配置。
-
清理临时文件、日志滚动、资源监控等维护任务。
场景三:数据处理
-
处理大批量的日志文件,从中提取有用信息。
-
对数据库查询结果进行格式化输出或进一步分析。
场景四:构建工具
-
编写自动化构建脚本,如编译源代码、运行测试套件、打包部署等。
场景五:批处理作业
-
批量转换文件格式,如图片转换、文本编码转换等。
可执行文件
在Unix/Linux系统中,如果一个文件具有可执行权限,并且位于系统的PATH环境变量所包含的路径下,那么这个文件就可以作为命令来直接运行。当你在终端输入该文件名并按回车时,Shell会查找PATH中的目录找到该文件并执行它。
例如,假设你有一个名为mycommand
的可执行文件,存放在 /usr/local/bin
目录下(而此目录通常包含在PATH环境变量中),你可以像运行内置或外部命令一样,在终端直接输入 mycommand
来执行它。
要使一个文件成为可执行文件,你需要给它添加执行权限,可以使用 chmod
命令:
chmod +x /path/to/mycommand
然后,无需指定完整路径,只需输入文件名即可运行它:
mycommand
这种机制使得用户可以根据需要编写自己的程序或脚本,并将其设置为可执行文件,从而扩展系统的功能。
其中有哪些目录包含在PATH中?
在Unix/Linux系统中,PATH
是一个环境变量,它定义了一个目录列表,当你在命令行输入一个命令时,Shell会按照这个列表中的顺序依次查找该命令对应的可执行文件。
PATH
环境变量的内容是一系列路径名,用冒号(:)分隔。例如:
echo $PATH
输出可能是这样的:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
这里 /usr
目录并不是 PATH
的一部分,而是 PATH
中包含的一些路径下的子目录。比如 /usr/bin
和 /usr/sbin
这两个目录通常包含在 PATH
里,它们用于存放系统级的用户和管理员可执行程序。
以下是在Linux系统中常见的放置可执行文件的目录:
-
/bin
: 存放对所有用户都重要的、基本的可执行文件,这些程序是启动系统和运行shell所必需的。 -
/sbin
: 同样包含重要系统程序,但主要是面向系统管理员的工具,如启动脚本、服务管理命令等。 -
/usr/bin
: 放置大部分用户使用的可执行文件,包括各种应用软件的命令行工具。 -
/usr/local/bin
: 用户自行安装或编译的软件通常被放在这一目录下,这里的程序对所有用户可用。 -
/usr/sbin
: 类似于/sbin
,但是针对的是非核心的系统级别的管理命令。 -
/usr/local/sbin
: 同样为本地安装的系统管理命令,但使用频率相对较低或仅限超级用户使用。
当需要运行一个命令时,Shell会首先检查当前工作目录(.
),然后按照 PATH
环境变量列出的目录顺序搜索指定的可执行文件。如果找到多个同名的可执行文件,那么最先出现在 PATH
路径中的那个将被执行。
内置命令(Built-in Commands): 内置命令是Shell程序本身的一部分,它们不需要外部程序或文件来执行。当你在Shell中输入一个内置命令时,Shell直接在其内部处理这个命令,无需创建新的进程。内置命令通常用于管理Shell自身的环境和功能,例如:
-
cd
改变当前工作目录 -
echo
输出文本到终端 -
export
设置或显示环境变量 -
history
显示命令历史记录 -
exit
退出当前Shell
外部命令(External Commands): 外部命令则是指独立于Shell程序之外的、存储在磁盘上的可执行文件。当在Shell中输入一个外部命令时,Shell需要查找该命令对应的文件(通常是通过PATH环境变量指定的路径列表进行搜索),然后创建一个新的子进程来执行这个文件。外部命令可以完成各种系统级别的操作,例如:
-
ls
列出目录内容 -
mkdir
创建新目录 -
grep
在文件中搜索匹配模式 -
cat
查看或合并文件内容
总结起来,Shell就像是一个控制台工具箱,内置命令相当于工具箱内自带的小工具,可以直接使用;而外部命令则是工具箱外额外挂载的各种专业工具,需要从磁盘加载后才能使用。通过Shell,用户能够方便地管理和操控整个操作系统。
常用快捷键
快捷键 | 功能 |
---|---|
ctrl + c | 停止进行 |
ctrl + l | 清屏,等同于 clear(往上翻能看到记录);彻底清屏:reset |
tab | 提示(防止敲错,高效) |
上下键 | 查看执行过的命令 |
帮助命令
man
、help
和 --help
是在Unix/Linux系统中用于获取命令或程序帮助信息的不同方法,它们的区别如下:
-
man (manual)
-
功能:
man
命令是用来查看系统手册页(Manual Pages)的工具,手册页包含了几乎所有Linux命令、系统调用、库函数、设备文件等详细说明和使用方法。 -
范围:
man
提供的信息通常更为详尽且结构化,它会显示多章节的手册内容,每个命令可能有多个部分(例如,1表示用户命令,2表示系统调用,3表示库函数等)。 -
示例:
man ls
会打开ls命令的手册页。
-
-
help
-
功能:对于Bash Shell或其他shell内置命令,可以使用
help
来获取简要的帮助信息。这主要用于Shell本身的内部命令。 -
范围:
help
的适用范围限于当前Shell环境下的内置命令,不适用于外部命令或系统级别的命令。 -
示例:
help cd
会显示关于cd内置命令的简单帮助信息。
-
-
--help
-
功能:许多GNU工具及现代软件遵循的一个约定是提供一个
--help
参数选项,通过运行命令加上--help
可以直接从命令行获得该命令的基本使用方法和参数选项列表。 -
范围:
--help
主要针对的是具体的可执行程序,尤其是GNU项目以及其他遵循这一规范的程序,无论它们是否是shell内置命令还是外部命令。 -
示例:
ls --help
或者gcc --help
将分别显示ls命令和gcc编译器的简洁帮助信息。
-
总结来说,如果你想要详细了解一个命令的所有细节和选项,首选 man
;如果你只需要查看shell内置命令的基本帮助,使用 help
;而如果一个命令提供了 --help
选项,则可以通过该命令直接获取快速参考指南。