Shell学习笔记

一、认识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的长度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值