AI智能
改变未来

shell study-3day–shell变量及实例


1、SHELL 变量及运用

(1)shell变量

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

(2)变量设置规则

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

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

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

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

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

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

(3)变量分类

按照变量的作用可以分成4类:

A、用户自定义变量;

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

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

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

按照变量作用范围分为2类:

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

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

(4)用户自定义变量

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

Eg1:给变量test赋值

[root@test65-1 ~]# test=1 [root@test65-1 ~]# echo $test1[root@test65-1 ~]#

Eg2:变量值叠加,使用${}

$name 是${name}的简化版本,但是在某些情况下,还必须使用花括号引起的方式来消除歧义并避免意外的结果。

[root@test65-1 ~]# test1=access[root@test65-1 ~]# echo test1test1[root@test65-1 ~]# echo $test1access[root@test65-1 ~]# echo $test1.logaccess.log[root@test65-1 ~]#

(5)命令替换

Date命令:

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

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

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

实例:

A、显示当前时间年、月、日

[root@test65-1 ~]# date +\"%Y-%m-%d\"2020-10-12

B、显示当前时间年、月

[root@test65-1 ~]# date +\"%Y-%m\"2020-10

#显示日期及时间

date +\"%Y-%m-%d %H:%M.%S\"

#显示日期及时间,使用/分割

date +\"%Y/%m/%d %H/%M/%S\"

#显示日期及时间,使用-进行分割(备份一般使用该方式)

date +\"%Y-%m-%d-%H-%M-%S\"

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

设定时间:

#设置成20201020,这样会把具体时间设置成空 00:00:00

date -s 20201020

#设置具体时间,不会对日期做更改

date -s 15:10:20

#设置全部时间

date -s \"2020-10-20 15:10:20\"

A、命令中调用date命令

[root@test65-1 ~]# echo date  #只显示date值date[root@test65-1 ~]# echo $date #date变量未赋值 [root@test65-1 ~]# echo `date` #调用date命令成功Mon Oct 12 09:59:18 CST 2020[root@test65-1 ~]# echo $(date) #调用date命令成功Mon Oct 12 09:59:39 CST 2020[root@test65-1 ~]# dateMon Oct 12 10:02:10 CST 2020

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

[root@test65-1 ~]# find /home/ -name *.log[root@test65-1 ~]# testtar=$(tar -zcvf home.tar.gz $(find /root/ -name *.txt))[root@test65-1 ~]# echo $testtar

(7)shell 中单引号和双引号区别

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

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

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

Eg:\\转义符作用

[root@test65-1 home]# test=1[root@test65-1 home]# echo $test1[root@test65-1 home]# echo \\#test#test[root@test65-1 home]# echo \\$test$test[root@test65-1 home]#

A、双引号与单引号区别

[root@test65-1 home]# test=1[root@test65-1 home]# test1=2[root@test65-1 home]# echo \'$test+$test1\'$test+$test1[root@test65-1 home]# echo \"$test+$test1\"1+2[root@test65-1 home]#

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

删除变量:

[root@test65-1 home]# unset test[root@test65-1 home]# echo $test [root@test65-1 home]#

(8)环境变量

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

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

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

A、局部变量

[root@test65-1 home]# test=1 [root@test65-1 home]# vi 1.sh#!/bin/bashecho $test[root@test65-1 home]# sh 1.sh  [root@test65-1 home]# echo $test1

#执行1.sh 时,会使用另一个bash去执行,就访问不到$test的值

B、env 命令查看所全局变量

[root@test65-1 ~]# env[root@test65-1 ~]# env | grep PATHPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

C、使用 export 把这个局部变量输出为全局变量

[root@test65-1 ~]# export test=1[root@test65-1 ~]# echo $test1[root@test65-1 ~]# sh 1.sh 1[root@test65-1 ~]#

D、让变量永久生效,可以把定义好的变量写入配置文件

当登录系统或新开启一个 ssh 连接启动 bash 进程时,一定会加载这 4 个配置文件:

#系统全局环境和登录系统的一些配置

[root@test65-1 ~]# vim /etc/profile

#shell 全局自义配置文件,用于自定义 shell

[root@test65-1 ~]# vim /etc/bashrc

#用于单独自定义某个用户的 bash

[root@test65-1 ~]# vim /root/.bashrc

#用户单独自定义某个用户的系统环境

[root@test65-1 ~]# vim /root/.bash_profile

(9)shell位置变量

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

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

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

Eg:

[root@test65-1 ~]# vim test.sh#!/bin/bashecho \"本 shell 脚本的文件名: $0\"echo \"第 1 个参数: $1\"echo \"第 2 个参数: $2\"echo \"第 3 个参数: $3\"echo \"第 4 个参数: $4\"[root@test65-1 ~]# chmod +x print.sh[root@test65-1 ~]# ./test.sh 1 2 3 4本 shell 脚本的文件名: ./test.sh第 1 个参数: 1第 2 个参数: 2第 3 个参数: 3第 4 个参数: 4[root@test65-1 ~]#

(10)特殊变量

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

$* 以一个单字符串显示所有向脚本传递的参数;如\"$*\"用双引号括起来的情况、以\"$1 $2 … $n\"的形式输出所有参数$n  第n个参数值,n=1..9$#  传递到脚本的参数个数$$  当前进程的进程号 PID$?  显示最后命令的退出状态;0 表示没有错误,其他任何值表明有错误$!  后台运行的最后一个进程的进程号 pid

Eg:

[root@test65-1 ~] vim  test.sh#!/bin/bashecho \"$* 表示这个程序的所有参数\"echo \"$# 表示这个程序的参数个数\"echo \"$$ 表示程序的进程 ID\"touch /tmp/b.txt &echo \"$! 执行上一个后台指令的 PID\"echo \"$$ 表示程序的进程 ID\"echo \"$? 表示上一个程序执行返回结果 \" [root@test65-1 ~]# sh test.sh  testtest 表示这个程序的所有参数1 表示这个程序的参数个数1684 表示程序的进程 ID1685 执行上一个后台指令的 PID1684 表示程序的进程 ID0 表示上一个程序执行返回结果[root@test65-1 ~]#

个人公众号:

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » shell study-3day–shell变量及实例