shell中的变量

一、什么是shell变量?
变量:变量即在程序运行过程中它的值是允许改变的量。变量是用一串固定的字符来标示不固定的值的一种方法。变量是一种使用方便的占位符,用于引用计算机内存地址,该地址可以存储 Script 运行时可更改的程序信息,在 shell 中变量是不能永久保存在系统中的,必须在文件中声明。
二、shell变量的分类
shell变量分为三类,分别为环境级变量,用户级变量,系统级变量;
(1)环境级变量只在当前shell中生效,shell关闭变量丢失,
(2)用户级变量写在用户的骨文件中,只针对当前用户有效,
(3)系统级变量被写在系统的配置文件/etc/profile中
变量即在程序运行时保存在内存中。
硬盘永久,内存临时的。

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

例子1:环境级变量

[root@localhost mnt]# a=1
#设置a的值为1
[root@localhost mnt]# echo $a
#显示a的值
1
[root@localhost mnt]# bash
#重新执行bash
[root@localhost mnt]# ps f
#查看子级进程
  PID TTY      STAT   TIME COMMAND
 3926 pts/1    Ss     0:02 -bash
 8413 pts/1    S      0:00  \_ bash
 8451 pts/1    R+     0:00      \_ ps f
 2065 pts/0    Ss+    0:00 /bin/bash
  578 tty1     Ss+    0:10 /usr/bin/Xorg :0 -background
 8440 pts/1    S      0:00 dbus-launch --autolaunch=946
[root@localhost mnt]# echo $a
#显示a的值

环境级变量

[root@localhost mnt]# export a=1
#临时修改环境级变量,父级进程做一个声明,子进程也有值
[root@localhost mnt]# echo $a
#显示a的值
1
[root@localhost mnt]# bash
#重新执行一次bash
[root@localhost mnt]# echo $a
#显示a的值
1
然后退出当前用户,登陆系统时,a值不能显示
[kiosk@foundation60 Desktop]$ ssh root@172.25.254.218
root@172.25.254.218's password: 
Last login: Thu Jun 21 22:23:46 2018 from 172.25.254.60
[root@localhost ~]# echo $a

例子2:用户级变量

用户级变量只对当前用户有效,对其他用户没有效;

[root@localhost ~]# vim .bash_profile 
#编辑.bash_profile文件
export a=5
[root@localhost ~]# source .bash_profile
#重新执行.bash_profile文件
[root@localhost ~]# echo $a
#显示a的值
5
[root@localhost ~]# su - student
#切换到student用户
[student@localhost ~]$ echo $a
#显示a的值,此时不能显示,因为只对当前用户有效
[kiosk@foundation60 Desktop]$ ssh root@172.25.254.218
root@172.25.254.218's password: 
Last login: Fri Jun 22 01:38:56 2018 from 172.25.254.60
[root@localhost ~]# echo $a
#显示a的值
5

例子3:系统级变量

[root@localhost ~]# vim /etc/profile
#编辑/etc/profile文件
export a=5
[root@localhost ~]# source /etc/profile
#重新刷新配置文件
[root@localhost ~]# echo $a
#显示a的值
5
[root@localhost ~]# su - student
#切换到student用户
Last login: Sun Jun 17 04:56:52 EDT 2018 on pts/1
[student@localhost ~]$ echo $a
#显示a的值
5 

变量名称的规范

1.变量名称中通常包含大小写字字母,数字,下划线(不是必须)。
2.变量名称格式:
WESTOS_LINUX
Westos_Linux
westoS_Linux

三、字符的转译及变量的声明

\      转译单个字符
""     弱引用,批量转译 "" 中出现的字符,
''     强引用,批量转译 '' 中出现的字符
''"" 两者的区别在于, ""弱引用不能转译 "\","`","!","$"
${}    变量声明
()     等于``   表示先执行

示例
” ” #代表弱引用, hostname#代表先执行hostname
这里写图片描述
” “#代表弱引用,第一个\代表转义字符,第二格\代表字符
‘ ‘如果是强引用的话,直接输出\
这里写图片描述
” “#代表强引用
‘‘#代表弱引用
这里写图片描述
变量声名
shell中的变量_第1张图片
()代表先执行
echo $a:默认显示第一个值

echo ${a[0]} :显示第一个值
shell中的变量_第2张图片
shell中的变量_第3张图片

四、 变量值传递

$1        脚本后的第一串字符
$2        脚本后的第一串字符
$#        脚本后字符串的个数
$*        脚本后所有字符串"1 2 3 4 ..."
$@        脚本后所有字符串"1" "2" "3" "..."

例子

这里写图片描述
shell中的变量_第4张图片
shell中的变量_第5张图片

例子2:建立用户

编辑用户文件

这里写图片描述]
这里写图片描述
编辑密码文件
这里写图片描述
这里写图片描述
编辑脚本:首先判断文件个数是否不等于2,如果是,执行建立用户,如果不是,请输入一个文件名和密码
这里写图片描述
shell中的变量_第6张图片
执行脚本sh user.sh userfile passwdfile
shell中的变量_第7张图片

read变量参数传递

read 实现变量传递
read -p " "      变量
read -p " " -s   加密变量

例子:检查网络是否通畅,如果通畅输出 IPisup, I P i s u p , 否 则 输 出 IP is down

编辑westos.sh文件
这里写图片描述
编写 的脚本
这里写图片描述
执行脚本后我们显示172.25.254.218这台主机的网络是通畅的,所以验证脚本正确
这里写图片描述

脚本示例二:

检测userfile文件是否存在,如果存在,继续检测passwdfile文件是否存在,如果不存在那么显示请输入用户文件;若passwdfile文件不存在,那么直接显示请输入密码文件,如果passwd文件存在的话,执行建立用户的操作

[root@localhost mnt]# vim user.sh 
#!/bin/bash
read -p "please input user file: " USERFILE
[ ! -e $USERFILE ]&&{
    echo -e "\033[31mERROR: $USERFILE is not exist!!\033[0m"
    exit 1
}

read -p "please input password file: " PASSWDFILE
[ ! -e $PASSWORD ]&&{
    echo -e "\033[31mERROR: $PASSWDFILE is not exist!!\033[0m"
    exit 1
}
MAX_LINE=`awk 'BEGIN{N=0}{N++}END{print N}' $USERFILE`
for NUM in `seq 1 $MAX_LINE`
do
     USERNAME=`sed -n ${NUM}p $USERFILE`
     PASSWORD=`sed -n ${NUM}p $PASSWDFILE`
     useradd  $USERNAME
     echo $PASSWORD| passwd --stdin $USERNAME
done
[root@localhost mnt]# sh user.sh 
please input user file: userfile
please input password file: passwdfile
Changing password for user user1.
passwd: all authentication tokens updated successfully.
Changing password for user user2.
passwd: all authentication tokens updated successfully.
Changing password for user user3.
passwd: all authentication tokens updated successfully.
[root@localhost mnt]# rm -fr userfile
#如果我们将用户文件删除;
[root@localhost mnt]# sh user.sh 
#执行脚本,我们可以看到用户文件不存在
please input user file: userfile
ERROR: userfile is not exist!!

五、命令别名的设置

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

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

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

用户级别名的设置

编辑用户家目录的文件(.bashrc),设置别名
例子
这里写图片描述
shell中的变量_第8张图片
这里写图片描述
这里写图片描述
shell中的变量_第9张图片

系统级别别名的设置

编辑/etc/bashrc文件设置别名
这里写图片描述
这里写图片描述
刷新/etc/bashrc文件
这里写图片描述
切换到student用户下
这里写图片描述
当我们在student用户下,执行haha时调出了vim 的界面
这里写图片描述
shell中的变量_第10张图片

六、函数

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

脚本示例一:

检查网络是否通畅,若通畅输出 IPisup; I P i s u p ; 若 不 通 畅 输 出 IP is down

[root@localhost mnt]# vim ip_check.sh 
#!/bin/bash
PING()
{       read -p "please input a ipaddress: " IP
        ping -c1 -w1 $IP &>/dev/null

        [ "$?" -eq "0" ] && {
             echo $IP is up
        } || {
             echo $IP is down
        }
}
PING
~  
 [root@localhost mnt]# sh ip_check.sh 
please input a ipaddress: 172.25.254.118
172.25.254.118 is down
[root@localhost mnt]# sh ip_check.sh 
please input a ipaddress: 172.25.254.218
172.25.254.218 is up               

脚本示例二:

检查教室里1到50台主机中,哪些主机的网络是通畅的,并输出这些主机
这里写图片描述
shell中的变量_第11张图片shell中的变量_第12张图片
shell中的变量_第13张图片

你可能感兴趣的:(shell中的变量)