一、什么是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 将自订变量转成环境变量。
[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
用户级变量只对当前用户有效,对其他用户没有效;
[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
[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
” “#代表弱引用,第一个\代表转义字符,第二格\代表字符
‘ ‘如果是强引用的话,直接输出\
” “#代表强引用
‘‘#代表弱引用
变量声名
()代表先执行
echo $a:默认显示第一个值
$1 脚本后的第一串字符
$2 脚本后的第一串字符
$# 脚本后字符串的个数
$* 脚本后所有字符串"1 2 3 4 ..."
$@ 脚本后所有字符串"1" "2" "3" "..."
编辑用户文件
]
编辑密码文件
、
编辑脚本:首先判断文件个数是否不等于2,如果是,执行建立用户,如果不是,请输入一个文件名和密码
执行脚本sh user.sh userfile passwdfile
用 read 实现变量传递
read -p " " 变量
read -p " " -s 加密变量
编辑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 + 文件名进行刷新。
编辑/etc/bashrc文件设置别名
刷新/etc/bashrc文件
切换到student用户下
当我们在student用户下,执行haha时调出了vim 的界面
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