首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

最全shell变量全教程附带视频!

学神IT教育

公众号ID:XueGod-IT

关注

“学神IT教育”小程序正式上线啦!小伙伴们可以通过小程序进入课堂听直播课提升自己的超能力哦!

shell变量

变量是shell 传递数据的一种方法。变量是用来代表每个值的符号名。我们可以把变量当成一个容器,通过变量,可以在内存中存储数据。也可以在脚本执行中进行修改和访问存储的数据。

变量的设置规则

1、 变量名称通常是大写字母,它可以由数字、字母(大小写)和下划线_组成。变量名区分大小写;但是大家要注意变量名称不能以数字开头

2、 等号 = 用于为变量分配值,在使用过程中等号两边不能有空格

3、 变量存储的数据类型是整数值和字符串值

4、 在对变量赋于字符串值时,建议大家用引号将其括起来。因为如果字符串中存在空格隔符号。需要使用单引号或双引号

5、 要对变量进行调用,可以在变量名称前加美元符号$

6、 如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含“$变量名”或用$包含变量的分类。

变量的分类

1、用户自定义变量

2、环境变量:这种变量中主要保存的是和系统操作环境相关的数据。

3u位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的。

4、预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。

按照变量作用域可以分成2类:全局变量和局部变量。

局部变量是shell 程序内部定义的,其使用范围仅限于定义它的程序,对其它程序不可见。包括:用户自定义变量、位置变量和预定义变量。

§ 全局变量是环境变量,其值不随shell 脚本的执行结束而消失。

用户定义变量

变量名命名规则:由字母或下划线打头,不允许数字开头,后面由字母、数字或下划线组成,并且大小写字母意义不同。在使用变量时,在变量名前加$

例1:给变量VAR1赋值

[root@xuegod63 ~]# VAR1=123

[root@xuegod63 ~]# echo $VAR1

123

variable [ˈveəriəbl] 变量

例2:错误的赋值方式,不允许数字开头,等号两边不能有空格

[root@xuegod63 ~]# VAR2 =456

bash: VAR2: 未找到命令...

[root@xuegod63 ~]# VAR2= 456

bash: 456: 未找到命令...

[root@xuegod63 ~]# VAR2 = 456

bash: VAR2: 未找到命令...

[root@xuegod63 ~]# 3VAR2 = 456

bash: 3VAR2: 未找到命令...

命令的替换,使用$()或反引号

例1:在命令就调用date命令

扩展:date命令是显示或设置系统时间与日期。

-s:根据字符串来设置日期与时间。字符串前后必须加上双引号;

:指定显示时,使用特定的日期时间格式。

例:格式化输出:

[root@xuegod63 ~]# date +"%Y-%m-%d" #今天时间,一般备份数据需要用这个

2018-05-25

[root@xuegod63 ~]# date +"%Y-%m" #只显示年月

2018-05

[root@xuegod63 ~]# date +"%Y-%m-%d %H:%M.%S" #日期加时间

2018-05-25 17:51.36

[root@xuegod63 ~]# date +"%Y/%m/%d %H/%M/%S" #使用/做分隔符

2018-05-25 17-51-43

[root@xuegod63 ~]# date +"%Y-%m-%d-%H-%M-%S" #使用-做分隔符,一般备份数据需要用这个

注: %y 年份只显示2位, %Y年份显示4位

date命令加减操作:

date +%Y%m%d #显示当天年月日

date -d "+1 day" +%Y%m%d #显示明天的日期

date -d "-1 day" +%Y%m%d #显示昨天的日期

date -d "-1 month" +%Y%m%d #显示上一月的日期

date -d "+1 month" +%Y%m%d #显示下一月的日期

date -d "-1 year" +%Y%m%d #显示前一年的日期

date -d "+1 year" +%Y%m%d #显示下一年的日期

设定时间:

date -s 20180523 #设置成20120523,这样会把具体时间设置成空00:00:00

date -s 01:01:01 #设置具体时间,不会对日期做更改

date -s "2018-05-23 01:01:01" #这样可以设置全部时间

例: 在命令中调用date命令输出值

[root@xuegod63 ~]# echo `date`

2018年 05月 25日 星期五 17:41:29 CST

[root@xuegod63 ~]# echo $(date)

2018年 05月 25日 星期五 17:41:42 CST

[root@xuegod63 ~]# echo `date +"%Y-%m-%d"`

2012-05-23

命令的嵌套使用,使用$( $( ))

[root@xuegod63 ~]# find /root/ -name *.txt

[root@xuegod63 ~]# VAR6=$(tar zcvf root.tar.gz $(find /root/ -name *.txt))

tar: 从成员名中删除开头的“/”

[root@xuegod63 ~]# echo $VAR6 #查看值, VAR6中存储着tar的标准输出

/root/.cache/tracker/db-version.txt /root/.cache/tracker/db-locale.txt /root/.cache/tracker/parser-sha1.txt /root/.cache/tracker/locale-for-miner-user-guides.txt /root/.cache/tracker/locale-for-miner-apps.txt /root/.cache/tracker/last-crawl.txt

实战:分享一个系统时间错误,引起tar报警告

[root@xuegod63 ~]# date -s "2012-03-03 21:25:00"

[root@xuegod63 ~]# tar zxvf root.tar.gz -C /opt/

root/.cache/tracker/db-version.txt

tar: root/.cache/tracker/db-version.txt:时间戳 2017-09-19 13:05:18 是未来的 168094624.438537189 秒之后

注:如果弹出这个消息,是因为咱们的当前系统的时间不对。 比如:当前系统的时间晚于文件的mtime时间

[root@xuegod63 ~]# ls /opt/root/.mozilla/firefox/wggimqlt.default/ -a #解压成功

shell中单引号和双引号区别

‘’ 在单引号中所有的字符包括特殊字符($,'',`和\)都将解释成字符本身而成为普通字符。

“” 在双引号中,除了$, '', `和\以外所有的字符都解释成字符本身,拥有“调用变量的值”、“引用命令”和“转义符”的特殊含义

注:\转义符,跟在\之后的特殊符号将失去特殊含义,变为普通字符。如\$将输出“$”符号,而不当做是变量引用

例:

[root@xuegod63 ~]# echo $VAR1

123

[root@xuegod63 ~]# echo \$VAR1

$VAR1

例1:给变量值赋于多个单词,需要使用单引号和双引号

[root@xuegod63 ~]# VAR8='xuegdo mk'

[root@xuegod63 ~]# echo $VAR8

xuegdo mk

选中一个模板,出现的黑色方框标志着选中的范围

插入新模板、收藏、复制,都是针对黑色方框进行操作。

例2:赋值时单引号和双引号的区别

[root@xuegod63 ~]# VAR8='xuegod mk $VAR1'

[root@xuegod63 ~]# VAR9="xuegod mk $VAR1" #双引中$符号有作用

[root@xuegod63 ~]# echo $VAR8

xuegod mk $VAR1

[root@xuegod63 ~]# echo $VAR9

xuegod mk 123

注:单引号之间的内容原封不动赋值给变量, 双引号之间的内容如有特殊符号会保留它的特殊含义

删除变量

[root@xuegod63 ~]# unset VAR1

[root@xuegod63 ~]# echo $VAR1

环境变量

在bash shell中,环境变量分为两类:全局变量和局部变量

全局变量:对于shell会话和所有的子shell都是可见的

局部变量: 它只在自己的进程当中使用

例1:局部变量

[root@xuegod63 ~]# VAR1=123

[root@xuegod63 ~]# echo $VAR1

123

[root@xuegod63 ~]# vim a.sh

#!/bin/bash

echo $VAR1

[root@xuegod63 ~]# echo $VAR1

123

[root@xuegod63 ~]# bash a.sh #执行a.sh 时,会使用另一个bash去执行,就访问不到$VAR1的值

例2:env命令查看所全局变量

[root@xuegod63 ~]# env

[root@xuegod63 ~]# env | grep PATH

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

例3:使用export把这个局部变量输出为全局变量

[root@xuegod63 ~]# export VAR1=xuegod

[root@xuegod63 ~]# echo $VAR1

xuegod

[root@xuegod63 ~]# vim a.sh #写入以下内容

#!/bin/bash

echo $VAR1

[root@xuegod63 ~]# bash a.sh #引用全局变量成功

xuegod

设置PATH环境变量

SHELL要执行某一个程序,它要在系统中去搜索这个程序的路径,path变量是用来定义命令和查找命令的目录,当我们安装了第三方程序后,可以把第三方程序bin目录添加到这个path路径内,就可以在全局调用这个第三方程序的。

例:

[root@xuegod63 ~]# vim /opt/backup

#!/bin/bash

echo "Backup data is OK!"

[root@xuegod63 ~]# chmod +x /opt/backup

[root@xuegod63 ~]# /opt/backup

[root@xuegod63 ~]# backup

bash: backup: 未找到命令...

将backup命令添加PATH中

[root@xuegod63 ~]# PATH=/opt/:$PATH

[root@xuegod63 ~]# backup #发现命令可以直接执行了,不用写全路径了

[root@xuegod63 ~]# vim /etc/profile # 在文件最后追加以下内容,永久生效

export PATH=/opt/:$PATH

[root@xuegod63 ~]# source /etc/profile #重新加载配置文件,使用配置生效

shell位置变量

Shell解释执行用户的命令时,将命令行的第一个字符作为命令名,而其它字符作为参数。

$0 获取当前执行shell脚本的文件文件名,包括脚本路径,命令本身

$n 获取当前脚本的第n个参数 n=1,2.....n 当n大于9时 用$表示。

例子:

[root@xuegod63 ~]# vim print.sh

#!/bin/bash

echo "本shell脚本的文件名: $0"

echo "第1个参数: $1"

echo "第2个参数: $2"

echo "第3个参数: $3"

echo "第4个参数: $4"

[root@xuegod63 ~]# chmod +x print.sh

[root@xuegod63 ~]# ./print.sh 111 222 a.txt 444

本shell脚本的文件名: ./print.sh

第1个参数: 111

第2个参数: 222

第3个参数: a.txt

第4个参数: 444

使用场景:服务器启动传参数

[root@xuegod63 ~]# /etc/init.d/network restart

特殊变量

有些变量是一开始执行Script脚本时就会设定,且不能被修改,但我们不叫它只读的系统变量,而叫它特殊变量。这些变量当一执行程序时就有了,以下是一些特殊变量:

例1:

[root@xuegod63 ~]# vim special_variable.sh #写入以一下内容

#!/bin/bash

echo "$* 表示这个程序的所有参数 "

echo "$# 表示这个程序的参数个数"

echo "$$ 表示程序的进程ID "

touch /tmp/b.txt &

echo "$! 执行上一个后台指令的PID"

echo "$$ 表示程序的进程ID "

echo "$? 表示上一个程序执行返回结果 "

[root@xuegod63 ~]# bash special_variable.sh 11 22 33 44 55

11 22 33 44 55 表示这个程序的所有参数

11 22 33 44 55 表示这个程序的所有参数

5 表示这个程序的参数个数

45502 表程序的进程ID

45504 执行上一个后台指令的PID

45502 表程序的进程ID

0 表示上一个程序执行返回结果

例2:常用的环境变量

[root@xuegod63 opt]# cd /opt/

[root@xuegod63 opt]# vim env.sh

#!/bin/bash

echo $HOME

echo $PATH

echo $PWD

[root@xuegod63 opt]# bash env.sh

/root

/opt/:/opt/:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin

/opt

shell教程视频.jpg

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180822G1AQ3W00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券