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

Linux Bash Shell编程(四):变量(上) 变量分类与相关操作

2020-08-09 21:50 726 查看

Linux Bash Shell编程(四):变量(上) 变量分类与相关操作

上一节,我们了解了Bash中的重定向以及特殊符号,从本节开始我们来一起探索Bash中变量的奥秘。本节我们先来了解下Bash中变量的基本知识以及对变量处理的操作方法。本节的部分内容(特殊符号等)在上一节中有叙述,不清楚的同学可以参阅上一节内容。

变量概述

  变量是计算机内存单元,其中存放的值可以变化,Shell脚本将信息存放在变量中,变量有一个名字,可以方便地引用,可以保存设置,也可以保存临时信息

 Bash变量设置规则

  • Bash中的变量可以由字母、数字、下划线构成,但不能以数字开头
  • Bash变量的默认类型是字符串型,如果要进行数值运算,则必须指定变量类型为数值型或使用特殊运算方法
  • 在对变量赋值时,若变量值字符串中有空格,需要将整个值用引号包括,类同上一节
  • 使用echo命令输出变量值时,Shell同样对变量值进行当场转义,若在其中使用转义符
    \
    请使用
    -e
    参数激活转义
  • 环境变量名通常为大写,用户声明环境变量时也建议大写,以便于区分

 变量分类

  • 用户自定义变量
  • 环境变量:主要保存和系统操作环境相关变量,环境变量不能改名,但能新建
  • 位置参数变量:主要用来向脚本中传递参数或数据,变量名不能自定义,变量作用是固定的
  • 预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也固定(位置参数变量也是预定义变量的一种)

变量分类介绍与操作

  不同种类的变量操作大体相同,相同部分在用户自定义变量操作中写出,后面不再赘述

 用户自定义变量

  • 用户自定义变量由用户自由定义修改,一般变量名可以修改,也可删除,在不违反Bash变量设置规则的前提下可以任意创建

  • 用户自定义变量仅在当前Shell中有效

  • 声明变量(定义变量), 语法:

    变量名
    =
    变量值
    注意,等号两边均没有空格,否则会被Shell识别为命令而报错,例如

    test1="Hello" #定义了test1变量并赋值为"Hello"
    test2='Hello World!\nI am Zheng' #定义了test2变量并赋值为一个字符串,并含有转义符
    1test="Hello" #不能这样定义!!!变量不能以数字开头,见“变量设置规则”节

    注意,第三行声明的变量名称非法,变量名不能以数字开头第二行的变量值以’'单引号包含,因为其中有!特殊字符,若用双引号会报错,单引号消除

    !
    的特殊含义,详见上一节

  • 调用变量,语法:$

    变量名
    ,例如,用
    echo
    命令将上面定义的两个变量输出

    zheng@Kali:~$ echo $test1
    Hello
    zheng@Kali:~$ echo $test2
    Hello World!\nI am Zheng
    zheng@Kali:~$ echo -e $test2 #test2变量值中包含转义符,需要用-e选项激活转义符
    Hello World!
    I am Zheng
  • 变量叠加:在变量后追加一部分内容而前面部分不变,用括号与引号包含原变量并在后面写入追加内容,注意括号与引号的位置不同

#语法:追加内容以123为例
test="$test"123
test=${test}123
#示例:在变量test1上追加内容
zheng@Kali:~$ test1="$test1"" World" #追加的内容含有空格,故用引号包含
zheng@Kali:~$ echo $test1
Hello World
  • 另外,使用

    set
    命令可以查看当前定义的所有变量(不只是用户自定义变量)

  • 删除变量:

    unset
    命令以删除变量

    #语法:unset 变量名	只需要变量名即可
    #示例,以删除test1为例:
    unset test1

 环境变量

  • 一部分为系统环境变量,无法修改名称,只能修改值,作用固定,用户可以另行添加环境变量
  • 环境变量会在当前Shell和这个Shell的所有子Shell中生效(子Shell是由Shell创建的Shell,可通过命令
    pstree
    查看进程树以查看Shell关系)
  • 将环境变量写入配置文件,则在所有shell中都永久生效(不写入配置文件不能永久生效),环境变量配置文件在下一节讲到
  • 环境变量定义:语法

    export
    变量名
    =
    ;将变量声明为环境变量
    export
    变量名

    export test="Hello" #新定义一个环境变量
    export test #将定义的test变量声明为环境变量
  • 查询环境变量:命令

    env
    查询当前的环境变量

  • 调用、删除同用户自定义变量。

  • 问题:子Shell能否

    unset
    父Shell声明的环境变量?

    可以,但只是删除子Shell环境中的环境变量,父Shell中依然存在

 常用环境变量

  • $PATH
    是系统查找命令的路径(变量只增加不能覆盖)。内容为以冒号分割的路径,Shell中的命令补全以及执行都按照
    PATH
    环境变量中所指定的目录寻找
  • $PS1
    其实
    PS1
    变量是环境变量中的子分支,不能用
    env
    命令查看,只能用
    set
    ,定义了当前命令提示符样式
转义符搭配 作用
\d 显示日期
\h 显示简写主机名
\t 显示24小时制时间"HH:MM:SS"
\T 显示12小时制时间"HH:MM:SS"
\A 显示24小时制时间"HH:MM"
\u 显示当前用户名
\w 显示当前所在工作目录的完整名称
\W 显示工作目录的最后一个目录
# 显示当前命令序号
$ 命令提示符,root#;普通用户$

先查看一下当前的

PS1
变量值

zheng@Kali:~$ echo $PS1
\u@\h:\w$

可以按照喜好对自己的命令提示符显示格式进行修改,如增加时间等

 位置参数变量

  • 位置参数变量是预定义变量中的一种,比较少所以单独讨论

  • 位置参数变量的变量名及作用是固定的,不能修改其变量名称,只能对其赋值(无需手动,只需要在命令行后按空格分开附加即可,同其他命令的参数)

  • 位置参数变量的分类及作用

位置参数变量 作用
$n n为数字,$0代表脚本本身,1−9代表第一到第九个参数,第十以上参数用大括号包含,第十个:1-9代表第一到第九个参数,第十以上参数用大括号包含,第十个:1−9代表第一到第九个参数,第十以上参数用大括号包含,第十个:{10}
$* 表示命令行中的所有参数,$*将所有参数看作一个整体
$@ 也表示命令行中的所有参数,$@将每个参数区分对待
$# 表示命令行中所有参数的个数
  • 其中
    $*
    $#
    的作用乍一看相同,其实略有区分,相当于一个为总和,而一个为遍历集合,在下面的实验三中直观地展示了它们的具体区别

实验:

  • 实验一:简单位置参数变量传入实验
#这是test1.sh脚本文件中的内容,有关脚本文件的创建和执行请移步我的另一篇博客 Bash Shell编程(一)
#!/bin/bash

#参数变量脚本测试程序

echo $0
echo $1
echo $2
echo $#

执行

test1.sh
并附加如下参数

zheng@Kali:~/Shell$ ./test1.sh Hello "I am Zheng"
./test1.sh # $0 脚本本身
Hello  # $1 第一个参数
I am Zheng # $2 第二个参数(包含空格的字符串)
2 # $# 一共输入了两个参数
  • 实验二:使用参数进行简单的加法运算

    加法运算的内容暂时超纲,在下一节中会讲到

#这是test2.sh脚本文件的内容
#!/bin/bash

#加法运算的具体语法在后面讲到,必须用两个括号包含
sum=$(($1 + $2))
echo$sum

  具体输出内容就不在这里呈现,如果输入两个数字,则会返回两个数字的和

  • 实验三:展示参数

    #@
    #*
    的区别

    #这是test3.sh中的内容
    #/bin/bash
    
    #区分$*与$@
    #其中for为循环语句,在后面会讲到,与其他编程语言中的循环语句相同,类似 Python
    #本例仅作为了解两参数区别使用
    
    x=1
    echo '$*'
    for i in "$*"
    do
    echo "The parameter$x is $i"
    x=$(($x+1))
    done
    
    x=1
    echo '$@'
    for i in "$@"
    do
    echo "The parameter$x is $i"
    x=$(($x+1))
    done

    以如下参数执行

    test3.sh
    脚本,得到输出如下,

    zheng@Kali:~/Shell$ ./test3.sh 123 456 789
    $*
    The parameter1 is 123 456 789
    $@
    The parameter1 is 123
    The parameter2 is 456
    The parameter3 is 789

    可以清楚区分,

    $*
    表示的是参数总和,只有一个;而
    $@
    表示的是各个独立参数组成的集合,可以遍历

 预定义变量

  • 预定义变量主要存放Shell执行状态相关的信息

    预定义变量 变量作用
    $? 最后一次执行的命令的返回状态,若正确运行则为0;错误退出,则由程序自己定义返回值(非0)
    $$ 当前进程的进程号(PID)
    $! 最后一个被放入后台执行的进程号
    预定义变量中的
    $?
    变量就是上一节多命令顺序逻辑符号中
    &&
    逻辑与和
    ||
    逻辑或中命令是否成功执行的判断依据
  • 在命令行后加
    &
    可以将命令放入后台执行,在后面会讲到

 接收键盘输入给变量赋值

主要用

read
命令实现

read [选项] [变量名]
选项 作用
-p “string” 显示提示信息
-t time (second) 指定等待时间(默认永久) ,等待时间结束自动结束输入
-n 字符数 接收指定的字符数后,程序就执行
-s 隐藏输入的数据,适合机密信息的输入

例如:

#以下为test4.sh文件中内容
#!/bin/bash

#read接收键盘输入示例

read -p "Please input your name: " -t 60 name
echo "Hello, $name!"

运行以下命令,提示输入姓名,输入后回车得到输出

zheng@Kali:~/Shell$ ./test4.sh
Please input your name: Zheng
Hello, Zheng!

结尾

  下一节,Linux Bash Shell编程(五):变量(下)变量运算、内容替换、环境变量配置文件
我们将继续探索Bash变量相关内容,学习变量的数值运算与运算符、变量测试与内容替换、环境变量配置文件相关知识

  上一节,Linux Bash Shell编程(三):重定向、多命令顺序、通配符、特殊符号

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