Linux shell脚本-概述、语法定义、自定义变量、环境变量、预设变量、变量的特殊用法(转义字符、单双引号、大小括号)的验证

目录

1.shell概述

1.1作为应用程序:

[1.2 shell 作为一门语言](#1.2 shell 作为一门语言)

[2.shell 语法](#2.shell 语法)

[2.1 shell脚本的定义与执行](#2.1 shell脚本的定义与执行)

(1)新建文件

[(2)程序开头第一行 必须写shell的类型](#(2)程序开头第一行 必须写shell的类型)

(3)程序编写完后,修改文件权限

(4)执行脚本文件

[2.2 shell变量](#2.2 shell变量)

2.2.1自定义变量

[2.2.2 环境变量](#2.2.2 环境变量)

2.2.2.1临时设置环境变量

2.2.2.2永久设置环境变量

2.2.2.3多个常用环境变量调用

2.2.3预设变量

[2.2.4 变量的特殊用法:" " ` ` ' ' \ () {}](#2.2.4 变量的特殊用法:" " ' ' \ () {})


1.shell概述

shell 的两层含义:
既是一种应用程序 , 又是一种程序设计语言

1.1作为应用程序:

交互式地解释、执行用户输入的命令,将用户的操作翻译成机器可以识别的语言,完成相应功能
称之为 shell 命令解析器。
shell 是用户和 Linux 内核之间的接口程序 , 用户在提示符下输入的命令都由 shell 先解释然后传给 Linux 核心,它调用了系统核心的大部分功能来执行程序、并以并行的方式协调各个程序的运行
Linux 系统中提供了好几种不同的 shell 命令解释器, 如 sh 、 ash 、 bash 等 。一般默认使用 bash 作为默认的解 释器。 编写的 shell 脚本,都是由上述 shell 命令解释器解释执行的。
shell本质是对内核起到保护作用,只有shell能够识别的命令才能够直接操作内核来控制硬件。
调用执行过程:用户输入shell命令-》shell解析命令-》内核响应-》硬件响应
shell的调用框图如下所示:

1.2 shell 作为一门语言

它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支
完成类似于windows下批处理操作,简化我们对系统的管理与应用程序的部署 称之为shell
脚本。shell脚本是shell命令的有序集合。
shell脚本是一种脚本语言 ,我们只需使用任意文本编辑器,按照语法编写相应程序,增加
可执行权限,即可在安装shell命令解释器的环境下执行shell脚本。

2.shell 语法

2.1 shell脚本的定义与执行

(1)新建文件

指定shell脚本文件,一般以.sh作为后缀名,也可以不加,例如:test.sh

(2)程序开头第一行 必须写shell的类型

bash 复制代码
#!/bin/bash  

#  #!用于指定当前脚本文件的shell解释器的类型 (必须放在第一行),
#  如果不写,则用默认的shell
#  这是一个注释       # 注释以 `#` 开头

#shell脚本是shell命令的有序集合,代码的构成就是命令

(3)程序编写完后,修改文件权限

chmod +x test.sh # 给test.sh加上可执行权限

chmod 777 test.sh # test.sh可读可写可执行

(4)执行脚本文件

法1:
./test.sh # 赋予执行权限后运行
法2:
bash test.sh (这种方式不需要修改文件权限)

2.2 shell变量

2.2.1自定义变量

(1)定义变量: num=1 #注意:变量等号两端不能有空格

#变量名只能包含英文字母下划线,不能以数字开头

(2)引用变量:num1=num # 新变量=旧变量名 注意:变量等号两端不能有空格

(3)输出变量:echo $num # 输出num变量的值

echo "Hello World" # 输出文本
等号两边不能直接接空格符,若变量中本身就包含了空格,则 整个字符串都要用双引号 、或单引号括起来;双 引号内的特殊字符可以保有变量特性,但是单引号内的特殊字符则仅为一般字符。

(4)清除变量:unset num #清除变量

(5)变量的其它用法:
read string
从键盘输入一个字符串付给变量 string
readonly var=100
定义一个只读变量 , 只能在定义时初始化 , 以后不能改变 , 不能被清除。
export var=300
使用 export 说明的变量,会被导出为环境变量,其它 shell 均可使用
程序:

bash 复制代码
#!/bin/bash  # 指定shell解释器(必须放在第一行)

#定义变量
#shell脚本中没有数据类型可言,所以定义变量时不需要加数据类型
#shell脚本中,赋值操作时不能在等号两边加空格
#NUM = 1 #错误
NUM=6

#引用变量
# $变量名 取一个变量的值
i=$NUM

#输出变量
echo "NUM:"
echo $NUM
echo "i:"
echo $i

#清除变量
unset NUM
echo "*************"
echo $NUM

echo "开始 输入 str"
#使用read从终端读取数据保存在变量中
read str
echo "str = $str"

#使用readonly创建一个只读的变量
readonly n=888
echo "n = $n"

#指定变量初始化后不能再次修改变量的值,只能使用
#n=666
#echo "n = $n"

运行结果: 注意该shell程序执行,需要有可执行权限。

程序改权限:chmod 777 xx.sh # xx.sh可读可写可执行

2.2.2 环境变量

shell在开始执行时就已经定义了一些和系统的工作环境有关的变量,我们在shell中可以直
接使用name引用。 定义: 一般在\~/.bashrc或/etc/profile文件中(系统自动调用的脚本)使用 export设置 ,允许 **用户后来更改。** 传统上,所有环境变量均为大写。 **显示环境变量** 使用 env 命令可以查看所有的环境变量。 **清除环境变量** 使用 unset 命令清除环境变量 **常见环境变量:** HOME :用于保存注册目录的完全路径名。 PATH :用于保存用冒号分隔的目录路径名, shell 将按 PATH 变量中给出的顺序搜索这些目录,找到的第一个与命令名称一致的可执行文件将被执行。 PATH=HOME/bin:/bin:/usr/bin;export PATH
HOSTNAME :主机名
SHELL :默认的 shell 命令解析器
LOGNAME :此变量保存登录名
PWD :当前工作目录的绝对路径名

2.2.2.1临时设置环境变量

在终端执行命令
MY_SHELL_NUM=999
export MY_SHELL_NUM
运行结果:
(1) 使用 env 命令可以查看所有的环境变量

(2)使用echo输出该变量结果

2.2.2.2永久设置环境变量

需要在配置文件(~/.bashrc或/etc/profile)中进行设置即可,设置完毕后需要通过
source 命令配置文件 立即生效 或 重新打开系统。
一般环境变量类似c语言中的全局变量,可以在shell脚本文件中任意使用。
以 ~/.bashrc 为例:
(1)打开文件: vi ~/.bashrc
(2)末尾加入环境变量:
MY_SHELL_NUM1=888
export MY_SHELL_NUM1

(3)保存退出,在终端执行:source ~/.bashrc
(4)执行 env 命令,查看结果,或执行 echo $ MY_SHELL_NUM1

2.2.2.3多个常用环境变量调用

程序:

bash 复制代码
#!/bin/bash

#PATH=$HOME/bin:/bin:/usr/bin;export PATH

echo "You are welcome to use bash"
echo "Current work dirctory is $PWD"
echo "the host name is  $HOSTNAME"
echo "your home dir  $HOME"
echo "Your shell is  $SHELL"
echo "user env val is $MY_SHELL_NUM1"
echo "系统路径: $PATH"
echo "---系统路径:--- "
echo $PATH | tr ':' '\n'  # 按行显示,更易读

运行结果:

2.2.3预设变量

# :传给 shell 脚本参数的数量 * :传给 shell 脚本参数的内容
1 、 2 、 3 、 ... 、 9 :运行脚本时传递给其的参数, 用空格隔开
? :命令执行后返回的状态 "?" 用于检查上一个命令执行是否正确 ( 在 Linux 中,命令退出状态为 0 表示该命令正确 执行,任何非 0 值表示命
令出错 ) 。
$0:当前执行的进程名 # xx.sh

:当前进程的进程号 "$$" 变量最常见的用途是用作临时文件的名字以保证临时文件不会重复 程序: ```bash #! /bin/bash # 其中\为转义字符,让$0输入为字符,而不作为变量 #位置变量$0 - $9 保存从终端输入的每一个参数 echo "\$0 = $0" echo "\$1 = $1" echo "\$2 = $2" echo "\$3 = $3" echo "\$4 = $4" echo "\$5 = $5" echo "\$6 = $6" echo "\$7 = $7" echo "\$8 = $8" echo "\$9 = $9" #如果超过9,需要加大括号 echo "\$10 = ${10}" echo "\$11 = ${11}" echo " 传入的参数的个数,不包括\$0" #$#:保存命令行传入的参数的个数,不包括$0 echo "\$# = $#" echo " 传入的参数的原内容,不包括\$0" #$@或者$*:保存所有的命令行传入的参数,但是不包括$0 echo "\$@ = $@" echo "\$* = $*" echo " 当前进程的进程号" #$$:获取当前进程的进程号 echo "\$$ = $$" #read NUM # 加入这个为了,再开一个终端验证进程号是否正确 echo "执行ls获取当前目录下的内容,执行成功,则\$?的值为0,执行失败,则为非0" # $? 返回上一个命令执行的结果,如果执行成功,则$?的值为0,执行失败,则为非0 ls echo "\$? = $?" ls ABC echo "\$? = $?" ``` 运行结果: ![](https://i-blog.csdnimg.cn/direct/2d67c7e1eb5d4a7983fbea4d8e1e6a29.jpeg) #### **2.2.4 变量的特殊用法:****" " \` \` ' ' \\ () {}** (1)""(双引号):包含的 变量输出变量值 (2)''(单引号):包含的变量会当做字符串解释,保持原样输出。 (3)\`\`(数字键1左面的反引号): 反引号中的内容作为系统命令,并执行其内容 ,可以替换输出为 一个变量。 (4)\\ 转义字符: 同c语言 \\n \\t \\r \\a等 echo命令需加 -e转义 (5)(命令序列): 由子shell来完成, 不影响当前shell中的变量 { 命令序列 }: 在当前shell中执行, 会影响当前变量 程序: ```bash #!/bin/bash name="ASD" #双引号里面的特殊字符,会使用其特殊含义 string1="good moring $name" #单引号里面的特殊字符,都会失去特殊含义,保持原样输出 string2='good moring $name' echo $string1 echo $string2 echo " pwd 引号 测试 " #反引号:获取一个shell命令的输出结果,一般对有输出结果的命令经常去使用, #也可以使用$()与反引号等价 echo "My dir is pwd" echo "My dir is `pwd`" echo 'My dir is `pwd`' echo "My dir is $(pwd)" # 与echo "My dir is `pwd`" 等价 echo " 转义字符 测试 " #转义字符:使用时,需要在echo后面加上-e选项 echo "this \n is\ta\ntest" #保持原样输出 echo -e "this \n is\ta\ntest" echo " () {} 测试 " num=333 #由 子shell 来完成,不影响当前shell中的变量 ( num=999;echo "num1 $num" ) echo num1:$num #在 当前shell 中执行,会影响当前变量 { num=666; echo "num2 $num"; } echo num2:$num ``` 运行结果: ![](https://i-blog.csdnimg.cn/direct/9138a90eacb84695acc3ff5840666b30.jpeg)

相关推荐
望舒_23310 分钟前
【网络层协议】NAT技术&&内网穿透
linux·服务器·网络
玩电脑的辣条哥24 分钟前
Ubuntu如何部署AI-Sphere-Butler(metahuman-stream)
linux·ubuntu·数字人·aispherebutler·livetalking·metahumastream·ai全能管家
喵帕栞1 小时前
C语言贪吃蛇实现
c语言·笔记·链表
SG.xf1 小时前
k8s的控制应用Helm
linux·运维开发
Loving_enjoy2 小时前
Linux信号处理:从“死亡快递“到系统级心跳的奇幻漂流
linux
爱尔兰的楠小楠3 小时前
ROS多机通信(四)——Ubuntu 网卡 Mesh 模式配置指南
linux·分布式·ubuntu·机器人·去中心化
要下雨了吗4 小时前
C语言三大程序结构 & 单分支语句
c语言·c++·visual studio
White の algo4 小时前
【Linux系统】Linux权限讲解!!!超详细!!!
linux·运维·服务器
pianmian15 小时前
python每日十题(6)
linux·运维·服务器
clear code5 小时前
C语言-桥接模式详解与实践
c语言·桥接模式