侧边栏壁纸
博主头像
丛庆

没事儿写代码,有事写代码。email:1024@cong.zone

  • 累计撰写 116 篇文章
  • 累计创建 97 个标签
  • 累计收到 4 条评论

【Shell】shell笔记

丛庆
2022-07-02 / 0 评论 / 4 点赞 / 727 阅读 / 1,587 字 / 正在检测是否收录...
温馨提示:
部分资料和图片来源于网络,如有危害到您的利益请与我联系删除,1024@cong.zone。

Shell概述

Shell是命令行解释器,可以接收应用程序或用户的命令,然后调用操作系统内核。同时Shell也是一门强大的编程语言,易编写、易调试、灵活性强。

image

查看系统支持的解析器

shell的解析器存放在/etc/shells目录

cat /etc/shells

下图为centos的shell解析器
image-1656737887964
下图为macos的shell解析器
image-1656694525881

Redha 通常使用bash
Debian系linux发行版通常使用dash

查看当前系统使用的默认shell实现

echo $SHELL

centos的默认shell为bash
image-1656738010317

macos的默认shell为zsh
image-1656694824504

使用环境变量的软连接查看默认shell

ls -l /bin/ | grep bash

image-1656738101410

shell的后缀名

一般为.sh,实际上shell解析脚本是与后缀名无关的,只要文本内容符合脚本格式就可以被解析。

开始编写脚本

创建一个存放脚本的目录(我创建在了root目录下),并进入到该目录

 mkdir shell-demo
 cd shell-demo

image-1656739008912

使用vim创建并编辑脚本文件

vim hello.sh

i键盘进入编辑模式,输入如下内容

#!/bin/bash
echo "hello word"

image-1656739331233
保存
Esc->Shift+;(实际上是:)->wq->Enter

运行脚本

脚本的运行方式一(bash或sh执行脚本文件)

使用bash或sh + 脚本的相对路径或绝对路径(该方式无需给脚本授权+x)

sh+脚本的相对路径

sh ./hello.sh

image-1656739953009

sh+脚本的绝对路径

sh /root/shell-demo/hello.sh

image-1656739973896

bash + 脚本的相对路径

bash  ./hello.sh

image-1656739994177

bash + 脚本的绝对路径

bash  /root/shell-demo/hello.sh

image-1656740010925

脚本的运行方式二(直接运行脚本文件)

直接运行脚本文件需要给脚本文件赋予+x权限

授权

chmod +x hello.sh

image-1656740564956

脚本的相对路径执行脚本

./hello.sh

image-1656740603673

脚本的绝对路径执行脚本

/root/shell-demo/hello.sh

image-1656740617821

在脚本目录是否可以使用hello.sh执行脚本呢!
不可以,因为这样会将hello.sh解析成命令,但是如果将该脚本放入/bin或者/sbin(系统环境变量中)目录就可以被执行。

脚本的运行方式三(脚本路径前加 . 或者 source

source

source hello.sh

image-1656768084736

source /root/shell-demo/hello.sh

image-1656768223681

.

. hello.sh

image-1656768324785

. /root/shell-demo/hello.sh

image-1656768342837

几中方式使用的命令区别

使用type命令可以查询命令来源
image-1656768538790

关于父子shell

bash和sh都是在当前shell中打开一个子shell来执行脚本内容,当执行完毕后会关闭子shell。
source和.可以使脚本内容在当前shell里执行,当需要修改/etc/profile文件时,要使用source来执行才会生效。
打开子shell与不打开子shell的区别在于,环境变量的继承关系不同,如在子shell中设置的当前变量,父shell是不可见的。

image-1656772144130

变量

系统预定义变量

HOMEHOME、PWD、SHELLSHELL、USER等

使用echo命令输出
image-1656774466298

查看当前Shell中所有变量

set

image-1656774588504

查看系统中全局环境变量

env

image-1656774917608

自定义变量

基本语法

  • 定义变量 变量名=变量值注意:=的前后不能有空格
  • 撤销变量 unset 变量名
  • 声明静态变量 readonly 变量注意:静态变量不能unset

变量定义规则

  • 变量名称可以由字母数字、和下划线组成,但不可以以数字开头,同城环境变量名使用大写
  • 等号两侧不能有空格
  • 在bash中,变量默认类型都是字符串类型,无法直接进行数值运算
  • 变量的值如果有空格,需要使用双引号单引号包

export将局部变量转为系统全局变量

子shell可以取到变量值

特殊变量

$n

$n

变量描述:n是数字占位符,用具体的数字替换n。
$0代笔该脚本的名称
$1-$9代表第一到带九个参数
${10}代表十以上的参数

$#

变量描述:获取所有输入参数个数,常用于循环,判断参数的个数是否正确

$*

变量描述:代表命令行中所有参数,$*会将参数作为一个整体

$@

变量描述:代表命令行中所有参数,$@会把每一个参数都分开,相当于是所有参数的集合

$?

变量描述:最后一次执行命令的返回状态。如果这个变量的值为0,证明上一个命令执行正确;如果这个变量的值为非0(具体的值由上一个命令决定),说明上一个命令执行异常

练习

vim params.sh

单引号字符串不会将$解析为变量

#!/bin/bash
echo '$n练习'
echo 脚本名称: $0
echo 第一个参数 $1
echo 第二个参数 $2
echo '$#练习'
echo 参数的总数 $#
echo '$*练习'
echo $*
echo '$@练习'
echo $@

+x授权

chmod +x params.sh

运行脚本,不传参

./params.sh

image-1656867539178

运行脚本,传参

./params.sh p1 p2 p3

image-1656867565770

运算符

写法

$((运算表达式))$[运算表达式]

练习

计算(1 + 2) * 2

image-1656951653813

编写一个求两个数和的脚本

vim sun.sh
#!/bin/bash
echo $[$1 + $2 ]
chmod +x sum.sh
bash sum.sh 1 1

image-1656951947607

条件判断

语法一

test condition

使用 $?查询结果,如果结果为0则返回值为true

语法二

[ condition ]

注意:condition 的前后需要各有一个空格

常用的判断条件

两个数之间的比较

-eq等于(equal)
-ne不等于(not equal)
-lt小于(less than)
-le小于等于(less than)
-gt大于(greater than)
-ge大于等于(greater equal)

注意:如果是字符串之间的比较,用等号=判断是否相等;用!=判断是否不等。

判断文件是否有指定的权限

-r有读的权限(read)
-w有写的权限(write)
-x有执行的权限(execute)

判断指定路径的资源类型

-e资源是否存在(existence)
-f资源存在并且是一个文件(file)
-d资源存在并且是一个文件夹(directory)

4

评论区