文章目录
一、认识shell
Shell是一种计算机程序,充当操作系统与用户之间的接口,允许用户通过命令行界面与操作系统进行交互。 Shell接收用户输入的命令,将其解释并传递给操作系统执行,从而控制计算机执行各种任务,如文件管理、系统配置和软件安装等。
Shell有多种类型,常见的包括Bash、Zsh(在Linux中使用)和PowerShell(在Windows中使用)。Bash是大多数Linux系统的默认Shell,因其易用性和免费而广泛使用。Zsh则以其美观的界面和强大的功能著称,支持回显、自动补齐等功能。
Shell不仅是一个命令解释器,还支持编程,用户可以通过Shell脚本编写程序。Shell脚本通常用于批量执行命令,提高了工作效率。Shell脚本中可以包含条件判断、循环控制等编程元素,使得自动化任务变得更加便捷。
二、编写第一个Shell脚本01_helwod.sh
xsw@WIN-OI1IDFUF0V9 01_shell % ll [0]
total 0
1.使用ll
命令查看01_shell
目录,这个目录是空的。
xsw@WIN-OI1IDFUF0V9 01_shell % cat<<a>01_helwod.sh
heredoc> #!/bin/bash
heredoc> echo "Hello world!"
heredoc> a
2.使用cat<<a>01_helwod.sh
命令创建第一个Shell脚本01_helwod.sh
,并在该脚本中写入两行内容,第一行是#!/bin/bash
,第二行是echo "Hello world!"
。
xsw@WIN-OI1IDFUF0V9 01_shell % cat 01_helwod.sh
#!/bin/zsh
echo "Hello world!"
3.使用cat
命令查看脚本01_helwod.sh
的内容。经核对,没有问题。
xsw@WIN-OI1IDFUF0V9 01_shell % ll
total 4.0K
-rw-rw-r-- 1 xsw xsw 31 Dec 7 10:49 01_helwod.sh
4.再次使用ll
命令查看01_shell
目录,这个目录下存在脚本文件01_helwod.sh
,但是这个脚本文件缺乏可执行权限。
xsw@WIN-OI1IDFUF0V9 01_shell % chmod +x 01_helwod.sh
xsw@WIN-OI1IDFUF0V9 01_shell % ll total 4.0K
-rwxrwxr-x 1 xsw xsw 31 Dec 7 10:49 01_helwod.sh
5.使用chmod +x
命令赋予脚本01_helwod.sh
可执行权限,并使用ll
命令查看01_shell
目录。经核对,脚本01_helwod.sh
已具备可执行权限。
xsw@WIN-OI1IDFUF0V9 01_shell % ./01_helwod.sh
Hello world!
6.使用./
执行脚本01_helwod.sh
,成功输出Hello world!
。
三、shell变量
(一)使用set命令查看所有变量
Shell 中的变量分为系统变量和用户自定义变量。系统变量顾名思义就是系统已经设置好的变量,诸如$HOME
、$PWD
、$USER
、$SHELL
等都是系统变量。我们常用较多的是自定义变量。
使用指令set
可以查看所有的变量。
xsw@LAPTOP-SCSO3NBG ~ % set [0]
'!'=1590
'#'=0
'$'=1579
'*'=( )
-=569JNRXZghiklms
0=-zsh
'?'=0
@=( )
ARGC=0
(二)定义变量var然后输出变量var
xsw@LAPTOP-SCSO3NBG 01_shell % var=150
1.使用命令var=150
定义变量var
的值为150.
xsw@LAPTOP-SCSO3NBG 01_shell % echo var=$var
var=150
xsw@LAPTOP-SCSO3NBG 01_shell % echo "var=$var"
var=150
2.使用命令$var
获取var
的值,使用命令echo
输出变量var
及其值,其值为150。
xsw@LAPTOP-SCSO3NBG 01_shell % unset var
xsw@LAPTOP-SCSO3NBG 01_shell %
(二)撤销变量var然后再次输出变量var
xsw@LAPTOP-SCSO3NBG 01_shell % unset var
xsw@LAPTOP-SCSO3NBG 01_shell % echo var=$var
var=
xsw@LAPTOP-SCSO3NBG 01_shell % echo "var=$var"
var=
xsw@LAPTOP-SCSO3NBG 01_shell %
使用unset
命令撤销变量var
。再次使用命令$var
获取var
的值,使用命令echo
输出变量var
及其值,其值为空。这说明原先定义的值为150的变量var
的已成功撤销。
(三)变量的基本规则
变量名称可以由字母
、数字
和下划线
组成,但不能以数字开头
;等号的两侧不能有空格
;变量名称一般为大写。
(四)变量的基本类型
根据变量的作用域和生命周期,我们可以将Shell变量大致分为以下几类:
1. 局部变量
局部变量是在脚本或函数内部
定义的,它们的作用域仅限于定义它们的Shell进程或函数内部
。 局部变量在其创建的上下文中可见,对于函数来说,局部变量仅在函数执行期间存在。
xsw@LAPTOP-SCSO3NBG 01_shell % cat 02_my_function [0]
#!/bin/bash
my_function() {
local my_var="I'm local."
echo $my_var
}
my_function
xsw@LAPTOP-SCSO3NBG 01_shell % ./02_my_function [0]
I'm local.
2. 全局变量
全局变量是在脚本的顶层
定义的,它们在整个脚本执行期间都是可见的。全局变量在脚本及其派生的子进程中都有效
,但它们不 会影响其他Shell进程。
xsw@LAPTOP-SCSO3NBG 01_shell % cat 03_my_function [0]
#!/bin/bash
my_var="I'm global."
my_function() {
echo $my_var
}
my_function
xsw@LAPTOP-SCSO3NBG 01_shell % ./03_my_function [0]
I'm global.
3. 环境变量
环境变量是全局变量的一种特殊形式,它们不仅在当前Shell进程中有效,还会传递给任何子进程
。通过使用export
命令,可以将全局变量提升为环境变量,使其在子进程中也可访问。
xsw@LAPTOP-SCSO3NBG 01_shell % cat 02_my_function
#!/bin/bash
my_function() {
local my_var="I'm local."
echo $my_var
}
my_function
xsw@LAPTOP-SCSO3NBG 01_shell % cat 03_my_function
#!/bin/bash
my_var="I'm global."
my_function() {
echo $my_var
}
my_function
xsw@LAPTOP-SCSO3NBG 01_shell % cat 04_my_environment_variable
#!/bin/bash
export my_var="I'm an environment variable."
echo $my_var
./02_my_function
./03_my_function
echo $my_var
xsw@LAPTOP-SCSO3NBG 01_shell % ./04_my_environment_variable
I'm an environment variable.
I'm local.
I'm global.
I'm an environment variable.
xsw@LAPTOP-SCSO3NBG 01_shell % echo $my_var
xsw@LAPTOP-SCSO3NBG 01_shell %
4. 内置变量
内置变量是Shell本身
提供的变量,用于存储特定的系统信息
或控制脚本的行为
。内置变量通常以特殊字符(如$
)开头,它们提供了对系统状态和脚本执行环境的访问。
(1)$PATH
:包含了一系列用冒号分隔的目录路径,Shell会在这些目录中查找可执行文件。
xsw@LAPTOP-SCSO3NBG 01_shell % echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
(2)$HOME
:当前用户的主目录路径。
xsw@LAPTOP-SCSO3NBG 01_shell % echo $HOME
/home/xsw
(3)$USER
:当前登录的用户名。
xsw@LAPTOP-SCSO3NBG 01_shell % echo $USER
xsw
5. 特殊变量
这些变量具有特殊的含义和用途,通常用于控制脚本的执行流程
或处理参数
。特殊变量通常由Shell自动设置和管理
,用户可以直接
使用它们来获取脚本执行的状态信息。
(1)$#
:传递给脚本的参数数量。
xsw@LAPTOP-SCSO3NBG 01_shell % cat 05_my_jbcshshl.sh
#!/bin/bash
A=$#
echo 刚才传递给脚本的参数有$A个。
xsw@LAPTOP-SCSO3NBG 01_shell % ./05_my_jbcshshl.sh 456 789 12 a5 8b
刚才传递给脚本的参数有5个。
(2)$?
:上一个命令的退出状态码。可用于判断上一个命令是否执行成功,0表示成功,非0表示失败。
xsw@LAPTOP-SCSO3NBG 01_shell % echo $?
0
(3)$0
:当前脚本的名称。
xsw@LAPTOP-SCSO3NBG 01_shell % cat 06_my_jbmc.sh
#!/bin/bash
A=$0
echo 当前脚本的名称是$A。
xsw@LAPTOP-SCSO3NBG 01_shell % ./06_my_jbmc.sh
当前脚本的名称是./06_my_jbmc.sh。
(4)$n
:当前脚本的第n个参数。
xsw@LAPTOP-SCSO3NBG 01_shell % cat 07_my_jbdngcs.sh
#!/bin/bash
A=$1
echo 刚才传递给脚本的第1个参数是$A。
A=$2
echo 刚才传递给脚本的第2个参数是$A。
A=$3
echo 刚才传递给脚本的第3个参数是$A。
A=$4
echo 刚才传递给脚本的第4个参数是$A。
A=$5
echo 刚才传递给脚本的第5个参数是$A。
xsw@LAPTOP-SCSO3NBG 01_shell % ./07_my_jbdngcs.sh 456 789 12 a5 8b
刚才传递给脚本的第1个参数是456。
刚才传递给脚本的第2个参数是789。
刚才传递给脚本的第3个参数是12。
刚才传递给脚本的第4个参数是a5。
刚才传递给脚本的第5个参数是8b。
(5)$*
和$@
:所有传递给脚本的参数。
xsw@LAPTOP-SCSO3NBG 01_shell % cat 08_my_jbsycs.sh
#!/bin/bash
A=$*
echo 刚才传递给脚本的所有参数:$A。
A=$@
echo 刚才传递给脚本的所有参数:$A。
xsw@LAPTOP-SCSO3NBG 01_shell % ./08_my_jbsycs.sh 456 789 12 a5 8b
刚才传递给脚本的所有参数:456 789 12 a5 8b。
刚才传递给脚本的所有参数:456 789 12 a5 8b。
四、shell特殊字符
在Shell编程中,特殊字符具有特定的含义和用途。以下是一些常见的Shell特殊字符:
1.$
(美元符)
用于表示变量或命令替换。例如,$VAR
表示变量VAR的值,而$(command)
表示执行command并返回其输出。
eveloper@developer:/$ ABC=同一个世界,同一个梦想!
developer@developer:/$ echo $ABC
同一个世界,同一个梦想!
developer@developer:~$ echo $(pwd)
/home/developer
2. \
(反斜杠)
用于转义特殊字符,使其失去特殊含义。例如,\$
表示一个美元符,而不是一个变量。
developer@developer:~$ ABC=12480
developer@developer:~$ echo $ABC
12480
developer@developer:~$ echo \$ABC
$ABC
3.''
(单引号)
用于创建一个包含文本的字符串,其中所有的特殊字符都被视为普通字符,不会被Shell解释器解释或执行。
developer@developer:~$ ABC=12480
developer@developer:~$ echo '$ABC`pwd`'
$ABC`pwd`
4. ""
(双引号)
类似于单引号,但是双引号内的某些特殊字符(如$、`和!)仍然会被Shell解释器解释和执行。
developer@developer:~$ ABC=12480
developer@developer:~$ echo "$ABC`pwd`"
12480/home/developer
5.``
(反引号)
用于命令替换,将反引号中的字符串作为命令来执行,然后将命令的输出作为字符串返回。
developer@developer:~$ echo ls
ls
developer@developer:~$ echo `ls`
01_shell CodeArtsProjects DeployHuaweiCloudSession Desktop Documents Downloads gitcode_knowledge HuaweiCloudSession icon Music node_modules package.json package-lock.json Pictures Public run.log snap Templates thinclient_drives Videos
6.;
(分号)
用于在同一行内分隔多个命令。
developer@developer:~$ echo $(pwd);echo 'Hello!';echo $(cat package.json)
/home/developer
Hello!
{ "dependencies": { "keystar": "^0.1.15", "keytar": "^7.9.0" } }
7.&
(和号)
用于在后台运行命令。
8.|
(管道符)
用于将一个命令的输出作为下一个命令的输入。
9.>
(大于号)
用于将命令的输出重定向到一个文件。
10.<
(小于号)
用于将一个文件的内容作为命令的输入。
11.>>
(双大于号)
用于将命令的输出追加到一个文件。
12.*
(星号)
作为一个通配符,可以匹配任何字符串。
13.?
(问号)
作为一个通配符,只能匹配一个字符。
14.[]
(方括号)
用于表示字符集,例如[abc]
表示匹配’a’、‘b’或’c’。
15.~
(波浪号)
用于表示用户的主目录。
16.!
(感叹号)
用于表示否定,例如! -e file
表示如果文件不存在,则返回真。
17.()
(圆括号)
用于创建子Shell或子进程。
18.{}
(花括号)
用于创建一个代码块,或者用于变量扩展,例如${VAR}
。
19.@
(at符号)
在Shell脚本中,$@
表示所有传递给脚本或函数的参数。
20.#
(井号)
用于表示注释,或者用于获取字符串的长度,例如${#VAR}
表示变量VAR的长度。