目录
零. 简介
Shell 是一种命令解释器,在 Ubuntu 系统中,它负责接收用户在命令行中输入的命令,并将其解释后传输给 Linux 内核执行,然后把内核执行后的内容返回并展示在命令行中。
Ubuntu 中默认使用的是 Bash(Bourne Again Shell),它是 sh 的增强版,也是 Linux 标准默认的 Shell。
以下是一些关于 Ubuntu Shell 的常见操作和特点:
- 查看系统 Shell 类型:可以使用命令
echo $SHELL
(注意命令区分大小写)。- Shell 通配符:用于模糊匹配文件名。常见通配符包括
*
(匹配任意字符序列,包括空字符序列)、?
(匹配任意单个字符)等。- Shell 特殊字符:例如
|
(管道符,用于连接两个命令,将前一个命令的输出作为后一个命令的输入)、>
(输出重定向符,将命令的输出写入到指定文件中,覆盖原有内容)、>>
(输出重定向符,以追加的方式将输出添加到指定文件的现有内容之后)等。- 环境变量:常用的环境变量有
PATH
(可执行命令的搜索路径)、HOME
(用户主目录)、LOGNAME
(当前用户的登录名)、HOSTNAME
(主机名)、PS1
(当前命令提示符)、SHELL
(当前使用的 shell)等。可以使用env
命令查看所有的环境变量。如需引用环境变量,需要在变量名称前加$
符号,如要修改则不需要加$
符号。例如,查看当前用户主目录可以使用命令echo $HOME
。
Shell 是用户与 Linux 内核之间的交互接口,它接收用户输入的命令,并将其传递给内核执行,然后将执行结果返回给用户。
一、常见的 Shell 类型
- Bash(Bourne Again Shell):这是大多数 Linux 发行版默认使用的 Shell。它结合了 Bourne Shell 和 C Shell 的许多特性,功能强大且具有良好的兼容性。Bash 提供了丰富的命令行编辑功能、命令历史记录、别名设置等,支持脚本编程,语法灵活。
- Sh(Bourne Shell):是最早的 Unix Shell 之一,语法简单,执行效率高。但相对功能较为有限,在现代 Linux 系统中较少直接作为用户默认的 Shell 使用。
- Csh(C Shell):其语法类似于 C 语言,具有一些独特的特性,如命令别名、作业控制等。然而,由于其语法与其他常见 Shell 有所不同,可能会导致一定的学习难度。
- Ksh(Korn Shell):是对 Bourne Shell 的增强,具有更强大的功能和更好的编程特性。它在一些商业 Unix 系统中被广泛使用。
其中,Bash 是大多数 Linux 发行版默认使用的 Shell。
二、Shell 命令格式
一般命令格式为:命令名 [选项] [参数]
例如,ls -l /home
中,ls
是命令名,-l
是选项,/home
是参数。
以下是一些常用的快捷键:
Ctrl + C
:中断当前正在执行的命令。Ctrl + D
:在输入模式下,通常表示输入结束(例如退出终端或结束文件输入)。Ctrl + Z
:暂停当前正在运行的前台进程,并将其放入后台。Ctrl + A
:将光标移动到命令行的开头。Ctrl + E
:将光标移动到命令行的末尾。Ctrl + U
:删除从光标位置到命令行开头的所有字符。Ctrl + K
:删除从光标位置到命令行末尾的所有字符。Ctrl + L
:清屏,使屏幕显示内容向上滚动,效果类似于输入clear
命令。Ctrl + R
:用于搜索命令历史记录。输入部分关键字后,按Ctrl + R
可查找相关的历史命令。↑
和↓
方向键:浏览之前输入过的命令历史记录,向上箭头查看更早的命令,向下箭头则相反。
这些快捷键可以帮助您更高效地在 Shell 中操作和输入命令。
Tab 键具有自动补全和提示的功能,能极大地提高命令输入的效率和准确性。
当您输入命令、文件名、目录名等的一部分后按下 Tab 键,如果输入的部分足以唯一确定要输入的内容,Shell 会自动补全剩余部分。
如果输入的部分不足以唯一确定,再次按下 Tab 键,Shell 会列出所有可能的匹配项供您选择。
例如,如果您在当前目录中有文件 file1.txt
和 file2.txt
,当您输入 cat fi
后按下 Tab 键,Shell 会自动将其补全为 cat file
。如果您再按一次 Tab 键,会显示出 file1.txt
和 file2.txt
,提示您有这两个可能的选项。
对于命令和选项,Tab 键也有相同的作用。比如输入 ls -
后按 Tab 键,可能会补全为 ls -l
(如果 -l
是常见且唯一的选项),或者显示出以 -
开头的所有可能选项。
输入 reb + tab就会自动补全reboot
三、基本命令
-
ls
:用于列出目录中的文件和子目录。常见选项包括:-l
:以长格式显示,包括文件权限、所有者、大小、修改时间等详细信息。-a
:显示包括隐藏文件(以.
开头的文件)在内的所有文件。-h
:以人类可读的方式显示文件大小(例如以 K、M、G 为单位)。
-
cd
:用于切换当前工作目录。例如:cd /home/user
:切换到/home/user
目录。cd..
:切换到上一级目录。cd ~
:切换到用户的主目录。
-
mkdir
:创建新的目录。例如:mkdir new_directory
-
rmdir
:删除空目录。注意,只能删除空目录,如果目录不为空,需要使用其他命令如rm -r
。 -
touch
:- 创建一个新的空文件,如果文件已存在,则更新其访问和修改时间。
- 例如:
touch new_file.txt
-
cat
:- 查看文件的内容并将其输出到终端。
- 例如:
cat file.txt
-
more
和less
:- 用于分页查看大文件的内容。按空格键翻页,
more
只能向前翻页,less
还可以向后翻页。
- 用于分页查看大文件的内容。按空格键翻页,
-
head
:默认显示文件的开头 10 行内容。可以通过选项指定显示的行数,例如head -5 file.txt
显示前 5 行。 -
tail
:默认显示文件的末尾 10 行内容。与head
类似,可以通过选项指定显示的行数。常用于查看日志文件的最新内容。 -
cp
:复制文件或目录。例如:cp file.txt destination
,将file.txt
复制到指定的目的地。 -
mv
:移动或重命名文件或目录。例如:mv file.txt new_file.txt
重命名文件。 -
rm
:删除文件或目录。使用-r
选项递归删除目录及其内容,使用-f
选项强制删除而不提示确认。 -
grep
:在文件中搜索匹配指定模式的行。例如:grep "keyword" file.txt
在file.txt
中搜索包含 "keyword" 的行。 -
find
:在指定的目录及其子目录中查找符合条件的文件或目录。例如:find /path -name "file.txt"
在指定路径中查找名为file.txt
的文件。 -
chmod
:更改文件或目录的权限。权限可以用数字表示(如 755)或符号表示(如u+rwx
)。 -
chown
:更改文件或目录的所有者。
四、通配符
*
:匹配任意字符序列(包括空字符序列)。?
:匹配任意单个字符。
例如,假设当前目录下有文件 123.txt
、1abc.txt
、xabc.txt
、abc.txt
和 abcd.txt
,那么:
ls *abc
:将匹配任意 0 个或多个字符,然后以abc
结尾的文件,即会显示1abc.txt
、xabc.txt
、abc.txt
;ls?abc
:将匹配任意 1 个字符,然后以abc
结尾的文件,即会显示1abc.txt
;ls (0-9)*
:将匹配以数字开头的文件,即会显示123.txt
、1abc.txt
;ls (^0-9)*
:将匹配以非数字开头的文件,即会显示xabc.txt
、abc.txt
、abcd.txt
。
五、重定向
在 Shell 中,重定向用于改变命令的输入来源和输出去向。
输出重定向:
>
:将命令的输出覆盖重定向到一个文件。如果文件已存在,其原有内容将被覆盖;如果文件不存在,则会创建新文件。例如,执行
ls > file.txt
会将ls
命令的输出写入file.txt
中,如果file.txt
已存在,其原内容将被替换。
>>
:将命令的输出追加重定向到一个文件。如果文件不存在,则创建新文件;如果文件已存在,新的输出将添加到文件末尾。比如,
ls >> file.txt
会将ls
命令的输出追加到file.txt
的末尾。
输入重定向:
<
:将命令的输入来源重定向为一个文件,而不是默认的键盘输入。例如,
sort < file.txt
会从file.txt
读取数据进行排序,而不是等待用户在键盘输入数据。此外,还有一些特殊的重定向操作:
2>
:将错误输出重定向到一个文件。例如,
command 2> error.txt
会将命令command
产生的错误信息写入error.txt
。
2>>
:将错误输出追加重定向到一个文件。
&>
或&>>
:同时重定向标准输出和错误输出。例如,
command &> file.txt
会将command
的标准输出和错误输出都重定向到file.txt
。
重定向功能使得在 Shell 中对命令的输入输出进行灵活控制和处理成为可能,方便了数据的保存、处理和传递。
六、管道
在 Shell 中,管道(|
)用于将一个命令的输出作为另一个命令的输入,实现命令之间的数据传递和协同工作,从而构建更复杂和强大的操作。
例如,假设有一个命令 command1
产生了一些输出,而另一个命令 command2
需要对这些输出进行进一步的处理。通过管道,可以将 command1
的输出直接传递给 command2
,而无需将中间结果保存到文件或进行其他复杂的操作。
具体的语法是:command1 | command2
以下是一个简单的示例,假设我们有一个包含用户名和年龄的文件 users.txt
,内容如下:
找出年龄大于25岁的用户
cat users.txt | awk '$2 > 25'
七、变量
在 Shell 中,变量用于存储数据,以便在脚本或命令行中重复使用和操作。
Shell 变量主要分为以下两类:
环境变量:
环境变量是由系统预先定义好的,或者由用户在系统环境中自定义设置的变量。它们对整个系统或当前用户的所有进程都有效。常见的环境变量如 PATH
(指定系统查找可执行文件的路径)、HOME
(用户的主目录)、USER
(当前用户的用户名)等。可以使用 printenv
或 env
命令查看当前系统中的环境变量。
用户自定义变量:
用户可以根据自己的需求创建和使用自定义变量。自定义变量的命名规则通常遵循以下几点:
- 变量名由字母、数字和下划线组成。
- 变量名以字母或下划线开头。
定义变量的语法是:变量名=值
。例如:my_variable=10
。
引用变量的值时,需要在变量名前加上 $
符号。例如:echo $my_variable
将会输出变量 my_variable
的值。
变量的值可以是字符串、数字等。如果值中包含空格或特殊字符,建议用引号(单引号或双引号)括起来。
单引号和双引号在使用时有一些区别:
- 单引号:会严格按照原样输出,其中的变量和特殊字符不会被解析。
- 双引号:其中的变量会被解析和替换为其值。
另外,还可以对变量进行一些操作,如重新赋值、删除变量(使用 unset
命令)等。
总之,Shell 变量为在 Shell 中进行灵活的编程和操作提供了便利。
八、条件判断和流程控制
例如 if-else
语句、for
循环、while
循环等,用于编写更复杂的脚本。
条件判断
通常使用 if
语句来进行条件判断。基本语法如下:
if [ condition ]; then
# 当条件为真时执行的命令
fi
condition
可以是各种表达式,常见的有:
比较字符串:
string1 = string2
:判断两个字符串是否相等。string1!= string2
:判断两个字符串是否不相等。比较整数:
num1 -eq num2
:判断两个整数是否相等。num1 -ne num2
:判断两个整数是否不相等。num1 -gt num2
:判断num1
是否大于num2
。num1 -lt num2
:判断num1
是否小于num2
。num1 -ge num2
:判断num1
是否大于等于num2
。num1 -le num2
:判断num1
是否小于等于num2
。文件测试:
-f file
:判断文件是否存在且为普通文件。-d dir
:判断目录是否存在。-e file
:判断文件或目录是否存在。
还可以使用 elif
(相当于 else if)和 else
来实现多分支的条件判断:
if [ condition1 ]; then
# 条件 1 为真时执行的命令
elif [ condition2 ]; then
# 条件 1 为假,条件 2 为真时执行的命令
else
# 所有条件都为假时执行的命令
fi
流程控制
for
循环:- 遍历列表中的值:
for item in value1 value2 value3; do
# 对每个值执行的操作
done
- 遍历文件中的行:
for line in $(cat file.txt); do
# 对每一行执行的操作
done
while
循环:
while [ condition ]; do
# 条件为真时执行的操作
done
until
循环:
until [ condition ]; do
# 条件为假时执行的操作
done