SHELL中的变量介绍

首先了解一下什么是变量

  • 变量
    简单的说,变量就是让某一个特定字串代表不固定的内容。举个数学例子,那就是:“ y = ax + b”这东西,在等号左边的 (y) 就是变量,在等号右边的 (ax+b) 就是变量内容。要注意的是,左边是未知数,右边是已知数。讲的更简单一点,我们可以“用一个简单的 “字眼” 来取代另一个比较复杂或者是容易变动的数据。这样做最大的好处就是“方便”!
    简而言之:“变量就是以一组文字或符号等,来取代一些设置或者是一串保留的数据”,例如:设置了“myname”就是“Buster”,所以当你读取 myname 这个变量的时候,系统自然就会知道,那就是 Buster。可以通过 echo 来显示变量。

变量的定义:

  • 变量即在程序运行过程中它的值是允许改变的量
  • 变量是用一串固定的字符来标示不固定的值的一种方法
  • 变量是一种使用方便的占位符,用于引用计算机内存地址,该地址可以存储Script运行时可更改的程序信息
  • 在shell中变量是不能永久保存在系统中的,必须在文件中声明
变量的种类
  • 在shell中变量分为环境级变量,用户级变量,系统级变量。
  • 环境级变量只在当前shell中生效,shell关闭变量丢失
  • 用户级变量写在用户的骨文件中,只针对当前用户生效
  • 系统级变量被写在系统的配置文件/etc/profile或者/etc/profile.d/中,对于所有用户都生效

1. 变量的设置规则

  • 变量与变量内容以一个等号“=”来链接,如下所示:“myname=Buster”等号两边不能直接接空白字符,如下所示为错误:“myname = Buster”或“myname=Buster Zr”
  • 变量名称只能是英文字母与数字,但是开头字符不能是数字,如下为错误:“2myname=Buster”
  • 变量字符的转译
 \       # 转译单个字符e
 " "     # 若引用,批量转译" " 中出现的字符
 ' '     # 强引用,批量转译" " 中出现的字符    
         # " "' ' 的区别在于," " 不能转译“\”,“`”,“!”,“$”
 ${}     # 变量声明

示例如下:
变量内容若有空白字符可使用双引号或单引号将变量内容结合起来,但双引号内的特殊字符如 $ 等,可以保有原本的特性
双引号
这里写图片描述
单引号
这里写图片描述
变量声明
这里写图片描述

2. 环境变量

环境变量:一般是指系统和当前用户可以对操作环境的运行进行相应设置的字符串。
环境变量分为用户变量和系统变量。
一般情况下,用户变量只对某个用户有效,而系统变量则对所有用户均有效。

2.1环境变量的设置(export)
  • 当你登陆 Linux 并取得一个 bash 之后,你的 bash 就是一个独立的程序,这个程序的识别使用的一个 PID。接下来你在这个 bash 下面所下达的任何指令都是由这个 bash 所衍生出来的,那些被下达的指令就被称为子程序了。我们在原本的 bash 下面执行另一个 bash,结果操作的环境会跑到第二个 bash 去(就是子程序),那原本的 bash 就会在暂停的情况(就是 sleep)。整个指令运行的环境是实线的部分!若要回到原本的 bash 去,就只有将第二个 bash 结束掉(下达 exit 或 logout) 才行。
  • 因为子程序仅会继承父程序的环境变量,子程序不会继承父程序的自订变量。所以在原本 bash 的自订变量在进入了子程序后就会消失不见,一直到你离开子程序并回到原本的父程序后,此变量才会又出现。
  • 可通过 export 将自订变量转成环境变量。

即当你在 shell 中直接执行 a=1,设定变量 a=1 ,但是当你在此 shell 下重新开启一个 shell 此变量将不会被识别,此时可通过 执行 export a=1 来将此变量转化为环境变量。
自定义变量:
这里写图片描述
设置环境变量
这里写图片描述

2.2 用户级变量

用户级变量在用户家目录下的 .bash_profile文件中设置,只对指定用户有效

示例如下:
为 student 用户设定用户级别的变量 myname=student,作为示例
编辑用户家目录 .bash_profile
这里写图片描述
执行 source + 文件的绝对目录,让系统识别
这里写图片描述
调用变量,sudent 可执行,root 用户无法识别对应变量
这里写图片描述

2.3 系统级环境变量 /etc/profile

系统级变量在 /etc/profile文件中设置,对系统环境有效

示例如下:
在 /etc/profile文件中设置,对系统环境设置变量 test=222
这里写图片描述
测试如下:
这里写图片描述

3. 系统中一些基本变量

$ (关于本 shell 的 PID)

$ (关于本 shell 的 PID)
钱字号本身也是个变!这个代表的是“目前这个 Shell 的线程代号”,亦即是所谓的
PID (Process ID)。 PID,就可以用:“echo $$”即可!出现的数字就是你的 PID 号码。

这里写图片描述
PS1:(提示字符的设置)

PS1:(提示字符的设置)
这是 PS1  (数字 1 不是英文字母),这就是我们的“命令提示字符”。当我们每次按下[Enter] 按键去执行某个指令后,最后要再次出现提示字符时,就会主动去读取这个变量
值
各提示符的含义如下:
\d :可显示出“星期、月、日”的日期格式,如:"Mon,Feb,2"
\H :完整的主机名称。如我的主机名为“client.example.com”
\h :仅取主机名称在第一个小数点之前的名字,我的主机为“client”后面省略
\t :显示时间,为 24 小时格式的“HH:MM:SS”
\T :显示时间,为 12 小时格式的“HH:MM:SS”
\A :显示时间,为 24 小时格式的“HH:MM”
\@ :显示时间,为 12 小时格式的“am/pm”样式
\u :目前使用者的帐号名称,如“root”;
\v :BASH 的版本信息,我的主机版本为 4.2.45(1)-release,仅取“4.2”显示
\w :完整的工作目录名称,由根目录写起的目录名称。但主文件夹会以 ~ 取代;
\W :利用 basename 函数取得工作目录名称,所以仅会列出最后一个目录名。
# :下达的第几个指令。
$ :提示字符,如果是 root 时,提示字符为 # ,否则就是 $

示例如下:
将命令提示符设定为[\u@ \v \w \t]$
这里写图片描述
? 命令退出值 (0-255)

? 命令退出值 (0-255)
这个变量是:“上一个执行的指令所回传的值”,上面这句话的重点是“上一个指令”与“回传值”两个地方。
当我们执行某些指令时,这些指令都会回传一个执行后的代码。一般来说,如果成功的执行该指令,
则会回传一个 0 值,如果执行过程发生错误,就会回传“错误代码”才对!一般就是以非为 0 的数值来取代。
常见的提示值
0     # 以一个真实值退出
1     # 带假值退出
126   # 找到了要执行的文件,但它不是可执行的实用程序
127   # 未找到要执行的实用程序.
>128  # 一个命令被一个信号打断了

示例如下:
这里写图片描述
linux中命令别名的设定

alias    # 命令别名设定
unalias  # 撤销命令别名

alias    # 在当前shell下的定别名(退出后自动消失)
编辑如下:
alias x='vim'

/用户家目录下/.bashrc  #别名设定:用户级 
/etc/bashrc  #别名设定:系统级
编辑完成,执行 source + 文件名进行刷新。

示例如下:
这里写图片描述

4.变量在脚本中的应用

4.1 变量的值传递
$0   # 执行的脚本文件名
$1   # 脚本后跟的第一串字符
$2   # 脚本后跟的第二串字符
$3   # 脚本后跟的第二串字符
$#   # 脚本后所跟字符数
$@   # 所跟默认字符为单个,模式为“1 2 3”
$*   # 所跟字符,默认为一串,模式为 “1” "2" "3"

示例如下:
编辑脚本
这里写图片描述
执行结果如下:
这里写图片描述

这里写图片描述

$*与$@的区别举例:
[root@localhost mnt]# vim file1.sh
#!/bin/bash
for name in "$*"
do
   echo $name
done
[root@localhost mnt]# vim file2.sh
#!/bin/bash
for name in "$@"
do
   echo $name
done
[root@localhost mnt]# sh -x file2.sh linux lin li   --->执行了三次
[root@localhost mnt]# sh -x file1.sh linux lin li   --->执行了一次

这里写图片描述
例子:
建立用户,用户名为userfile文件的内容,密码为passwordfile文件里的内容并判断脚本后字符串的个数是否为两个

[root@localhost mnt]# vim user_create.sh 
#!/bin/bash
[ "$#" -eq 2 ]||{
         echo please input userfile and passwordfile!!
         exit 1
}
MAX_LINE=`awk 'BEGIN{N=0}{N++}END{print N}' $1`
for LINE_NUM in `seq 1 $MAX_LINE`
do
    USERNAME=`sed -n "${LINE_NUM}P" $1`
    PASSWORD=`sed -n "${LINE_NUM}P" $2`
    useradd $USERNAME
    echo $PASSWORD | passwd --stdin $USERNAME
done

这里写图片描述
测试如下:
这里写图片描述

4.2 交互式传参


read
read -s 隐藏输入内容
read -p "input" 提示交互式传参输入内容
例子:user_create.sh

示例如下
编辑脚本,交互式实现对指定 ip 的 Ping 命令,且输入的 ip 为隐藏的

#!/bin/bash
read -p "Please input a ip address: " -s IP
echo
ping -c1 -w1 $IP &>/dev/null && {
    echo $IP up
} || {
    echo $IP down
}

这里写图片描述
测试如下:
这里写图片描述

4.3 脚本中的函数

脚本中的函数可简化脚本内容,使脚本内容可循环执行

语法是这样的:
function fname() {
            程序段
}
fname 是我们的自订的执行指令名称,而程序段就是我们要他执行的内容。
要注意的是,因为 shell script 的执行方式是由上而下,由左而右,
因此在 shell script 当中的 function 的设置一定要在程序的最前面,
这样才能够在执行时被找到可用的程序段

示例:
编辑 test.sh 脚本,内容如下
  1 #!/bin/bash
  2 Host_Message()             # 函数名称
  3 {
  4         read -p "Please input your action: " action
  5                            # 交互式输入动作
  6         [ "$action" = "exit" ] && exit 0
  7                            # 若指令为 exit 则正常退出循环
  8         [ "$action" = "user" ] && echo You are $USER
  9                            # 若动作为 user 则显示用户名
 10         [ "$action" = "hostname" ] && echo $HOSTNAME
 11                            # 若动作为 hostname 则显示 主机名
 12         Host_Message       # 持续调用函数(不执行 exit 不退出循环) 
 13 }
 14 Host_Message

这里写图片描述
测试如下:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/mys_sunshine/article/details/80802159