shell脚本基础及相关变量

目录

一、shell基本介绍    

 1.1构成shell的基本元素

1.2 脚本的执行方式

二、变量 

 2.1变量的作用范围

2.1.1 局部变量

2.1.2 全局变量

2.3 变量的类型

2.3.1 自定义变量

 如何查看变量

 使用declare来定义变量

通过交互定义变量

 2.3.2环境变量

2.3.3 只读变量

2.3.4 位置变量

特殊变量

$*和$@的区别

$? 执行结果状态

特殊状态变量

2.4变量的特殊用法 

2.5 扩展变量 


一、shell基本介绍    

Shell不仅仅是充当用户与UNIX或者localhost交互的角色,还可以作为一种程序设计语言来使用。通过Shell编程,可以实现许多非常实用的功能,提高系统管理的自动化水平。
如果有一系列经常需要使用的命令,把它存储在一个文件里,shell可以读取这个文件并顺序执 行其中的命令,我们把这样的文件就叫shell脚本。shell脚本按行解释文件里的命令。

 1.1构成shell的基本元素

1.声明:声明用哪个命令解释器来解释并执行当前脚本文件中的语句,一般写的解释器为#!/bin/bash
2. 命令:可执行语句,实现程序的功能。
3.注释:说明某些代码的功能,通过在代码中增加注释可以提高程序的可读性。分为单行注释和多行注释(使用:<<BLOCK .......BLOCK多行注释)。
4. 赋予 rx 的权限

1.2 脚本的执行方式

  1. bash for_test.sh 命令来执行,它会产生一个子 Shell,然后在子 Shell 中运行脚本,执行完后回去父Shell。

  2. sh for_test.sh 命令来执行,它也会产生一个子 Shell,然后在子 Shell 中运行脚本,执行完后回去父Shell。

  3. ./for_test.sh 命令来执行,它也会产生一个子Shell,不同点在于它需要有 x 权限。

  4. . for_test.sh 命令来执行,使用是文件中定义的解释器,不会产生子 Shell,它是在当前的环境中执行的。

  5. source for_test.sh命令来执行,它的作用与 . 执行一样

二、变量 

变量就是程序设计中一个可以变化的量。它会在内存中开辟一个空间,变量的名称引用是这个空间对应的地址,而这个地址中存储的就是变量的值。

在 Shell 中变量的名称可以由字母、数字和下划线组成,但是数字不能开头。

 2.1变量的作用范围

在 Shell 中命令的作用范围分为全局变量和局部变量,全局变量也叫系统变量,它在整个系统都可以用。而局部变量是需要在特定的环境中才可以使用的。

2.1.1 局部变量

局部变量也叫用户变量,或者叫临时变量。它只能在当前用户所在的环境中使用,或者在当前的会话中使用。

[root@openEuler ~]# name=lisi
[root@openEuler ~]# echo $name
lisi
[root@openEuler ~]# echo ${name}
lisi
# 产生一个子Shell环境
[root@openEuler ~]# bash
[root@openEuler ~]# echo $name
# 退出到父Shell环境
[root@openEuler ~]# exit
exit
[root@openEuler ~]# echo ${name}
lisi

2.1.2 全局变量

全局变量也叫系统变量,也可以称为永久变量。它是不区分用户环境的,对整个系统都有效。它需要定义在 /etc/profile 或者 /etc/bashrc 文件中通过 export 来导出。

[root@openEuler ~]# vim /etc/profile
export MyPath=/root

[root@openEuler ~]# echo $MyPath
[root@openEuler ~]# . /etc/profile
[root@openEuler ~]# echo $MyPath
/root

我们可以使用unset删除变量。

2.3 变量的类型

Shell 是一种动态类型语言,也是一种弱类型的语言。所以在定义变量时,我们无须指定具体存放的值是什么类型(如:整数、小数、字符串等)。

但是可以将其分为几种类型,自定义变量,环境变量,只读变量,位置变量,预定义变量。

2.3.1 自定义变量

变量名=变量值

注意 

  1. 等号两边不能有空格

  2. 变量值如果是数字一般不加引号,如果是字符串推荐加引号;如果值包含有特殊字符或空格就必须要有引号

  3. 引号可以是以下几种:

    1. 单引号:被单引号包含的内容会原样输出

    2. 双引号:被双引号包含的内容会把变量的值替换后再输出

    3. 反引号:被反引号包含的命令执行的结果赋值给变量

 如何查看变量

在 Shell 中查看变量的值有以下几种:

  • echo $变量名

  • echo ${变量名}

  • set 查看系统中所有变量

  • env 来查看系统环境变量

  • declare 来查看输出的所有变量、函数等。

 使用declare来定义变量

declare attribute variable

attribute 它可以是 +/- 来定义,如果是 - 表示为这个属性设置值,如果是 + 表示取消此属性
有以下属性:
-p:表示所有变量的值
-i:将变量定义为整数,如果不能转换为整数则为 0
-r:将变量声明为只读变量
-a:将变量声明为数组

[root@openEuler ~]# declare -i n
[root@openEuler ~]# n=5
[root@openEuler ~]# declare -r name
[root@openEuler ~]# name=wangwu
[root@openEuler ~]# declare -a arr
[root@openEuler ~]# arr[0]="hello"
通过交互定义变量
read -p "输入提示信息" 变量名称

[root@openEuler ~]# read -p 'please input your number:' num
please input your number:18

 2.3.2环境变量

在 Shell 中环境变量分为系统环境变量和用户环境变量。系统变量的定义参数前变量范围中的内容。而用户环境变量我们可以用户的家目录下的 ~/.bash_profile 文件或 ~/.bashrc 文件中定义的变量。

# 执行命令时搜索的路径,以冒号进行分隔
[root@openEuler ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/

# 当前登录的用户名
[root@openEuler ~]# echo $USER
root

# 当前登录用户的家目录
[root@openEuler ~]# echo $HOME
/root

# 定义在命令模式下可以使用的命令行的长度
[root@openEuler ~]# echo $COLUMNS
156

# 命令存放的历史文件
[root@openEuler ~]# echo $HISTFILE
/root/.bash_history

2.3.3 只读变量

两种声明方式:

  • declare -r 变量名称

  • readonly 变量名称  

[root@openEuler ~]# readonly m=5

#对于只读变量来说不能用unset删除

2.3.4 位置变量

特殊变量

$#:表示参数的个数
$n:其中n表示大于0的数字,表示第 n 个参数
$0:表示这个被执行的脚本名称
$*:表示获取所有的参数列表
$@:表示获取所有的参数列表

 

# 编写一个脚本
[root@openEuler ~]# vim t1.sh
# 查看脚本内容
[root@openEuler ~]# cat t1.sh
#!/bin/bash

echo "total parameters: $#"
echo "first parameter: $1"
echo "second parameter: $2"
echo "filename is: $0"
echo "all arguments: $*"
echo "all arguments: $@"

# 运行脚本
[root@openEuler ~]# bash t1.sh python shell golang html
total parameters: 4
first parameter: python
second parameter: shell
filename is: t1.sh
all arguments: python shell golang html
all arguments: python shell golang html
$*$@的区别
[root@openEuler ~]# set -- "hello" "world" "shell"
[root@openEuler ~]# echo $*
hello world shell
[root@openEuler ~]# echo $@
hello world shell
[root@openEuler ~]# for fname in "$@"; do echo $fname; done
hello
world
shell
[root@openEuler ~]# for fname in "$*"; do echo $fname; done
hello world shell
$? 执行结果状态

当脚本命令执行后,会有一个执行后的状态值,如果这个值为 0 则表示前一条命令执行成功,否则表示执行不成功,即有错误。  

特殊状态变量

$$:返回脚本进程的PID
$!:获取上一个在后台的工作进程的PID
$_:保存的是之前所执行命令的最后一个参数

2.4变量的特殊用法 

${变量}                    获取变量的值
${#变量}                    返回变量的长度,即字符串的长度
${变量:start}                返回变量从start开始截取到变量最后,它是从 0 开始
${变量:start:length}        截取变量的值中从 start 开始,到 length 长度的内容
${变量#word}                将变量开头删除最短匹配的 word 子串
${变量##word}                将变量开头删除最长匹配的 word 子串
${变量%word}                从变量结尾删除最短的 word
${变量%%word}                从变量结尾删除最长的 word
${变量/parttern/string}    使用string代替第一个匹配的 parttern
${变量//parttern/string}    使用string代替所有匹配的 parttern

2.5 扩展变量 

${变量:-word}        如果变量值为空,则返回 word 字符串,如果不为空则返回变量本身的值
${变量:=word}        如果变量值为空,则将word替换变量后并返回
${变量:?word}        如果变量值为空,则word将当作stderr输出,否则输出变量的值
${变量:+word}        如果变量值为空,则什么都不做,否则返回 word

相关推荐

  1. shell脚本基础相关变量

    2024-04-14 01:40:03       34 阅读
  2. shell脚本规范变量类型、置换

    2024-04-14 01:40:03       38 阅读
  3. Shell脚本基础 以及 变量和引用

    2024-04-14 01:40:03       37 阅读
  4. shell脚本变量

    2024-04-14 01:40:03       30 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-14 01:40:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-14 01:40:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-14 01:40:03       82 阅读
  4. Python语言-面向对象

    2024-04-14 01:40:03       91 阅读

热门阅读

  1. 【13137】质量管理(一)2024年4月串讲题组一

    2024-04-14 01:40:03       37 阅读
  2. redisson实现的分布式锁是可重入的吗?

    2024-04-14 01:40:03       30 阅读
  3. (78)删除有序数组中的重复项(79)排序矩阵查找

    2024-04-14 01:40:03       36 阅读
  4. CV最新论文|4月10日 arXiv更新论文合集

    2024-04-14 01:40:03       30 阅读
  5. 【Webpack】TreeShaking与静态分析

    2024-04-14 01:40:03       33 阅读
  6. 二分查找总结(十八天)

    2024-04-14 01:40:03       35 阅读