您的位置:首页 > 运维架构 > Shell

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

2020-12-24 14:31 1291 查看

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 $test
1
[root@test65-1 ~]#

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

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

[root@test65-1 ~]# test1=access
[root@test65-1 ~]# echo test1
test1
[root@test65-1 ~]# echo $test1
access
[root@test65-1 ~]# echo $test1.log
access.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 ~]# date
Mon 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 $test
1
[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/bash
echo $test
[root@test65-1 home]# sh 1.sh 
 
[root@test65-1 home]# echo $test
1

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

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

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

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

[root@test65-1 ~]# export test=1
[root@test65-1 ~]# echo $test
1
[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/bash
echo "本 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/bash
echo "$* 表示这个程序的所有参数"
echo "$# 表示这个程序的参数个数"
echo "$$ 表示程序的进程 ID"
touch /tmp/b.txt &
echo "$! 执行上一个后台指令的 PID"
echo "$$ 表示程序的进程 ID"
echo "$? 表示上一个程序执行返回结果 "
 
[root@test65-1 ~]# sh test.sh  test
test 表示这个程序的所有参数
1 表示这个程序的参数个数
1684 表示程序的进程 ID
1685 执行上一个后台指令的 PID
1684 表示程序的进程 ID
0 表示上一个程序执行返回结果
[root@test65-1 ~]#

个人公众号:


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: