一、什么是变量?
shell在定义变量的时候,变量名与变量之间不能存在空格,这个大多数的语言的这个不同还是蛮大的,不过定义的规则就其他的语言定义的规则大致相同了。
1) 局部变量
局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
2) 环境变量
所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
3) shell变量
shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
二、变量的分类
1、环境级变量
[root@localhost ~]# export a=1 ##export声明,相当于把变量放到公共部分,让子进程可以读到
[root@localhost ~]# echo $a
[root@localhost ~]# bash
[root@localhost ~]# ps f
[root@localhost ~]# echo $a
2、用户级变量
[root@localhost ~]# vim .bash_profile
在最后一行加入:export a=1
[root@localhost ~]# source .bash_profile ##刷新用户变量
[root@localhost ~]# echo $a
[root@localhost ~]# exit ##退出
[kiosk@foundation28 Desktop]$ ssh root@172.25.254.128
[root@localhost ~]# echo $a ##再次查看a=1依然生效
3、系统级变量
[root@localhost ~]# vim /etc/profile
在最后一行加入:export a=2
[root@localhost ~]# source /etc/profile ##刷新系统级变量
[root@localhost ~]# echo $a
[root@localhost ~]# exit
[kiosk@foundation28 Desktop]$ ssh root@172.25.254.128
[root@localhost ~]# echo $a
[root@localhost mnt]# install_apache.sh
[root@localhost mnt]# echo $PATH
[root@localhost mnt]# chmod +x /mnt/*
[root@localhost mnt]# PATH=$PATH:/mnt
[root@localhost mnt]# echo $PATH
[root@localhost mnt]# install_apache.sh 8989
[root@localhost mnt]# exit
[kiosk@foundation28 Desktop]$ ssh root@172.25.254.128
[root@localhost ~]# install_apache.sh 8989
[root@localhost ~]# vim /etc/profile ##写入系统变量文件
在最后一行加入:export PATH=$PATH:/mnt
[root@localhost ~]# source /etc/profile ##刷新
[root@localhost ~]# exit
[kiosk@foundation28 Desktop]$ ssh root@172.25.254.128
[root@localhost ~]# install_apache.sh 8989
三、字符转译及变量声明
1、“\“ 转译单个字符
[root@localhost ~]# a=\$1
[root@localhost ~]# echo $a
2、” ” 弱引用,批量转译”“中出现的字符
[root@localhost ~]# echo "####`hostname`####"
3、’ ’ 强引用,批量转译”中出现的字符
[root@localhost ~]# echo '####`hostname`####'
4、’ ’ 与 ” ” 区别在于 ” “不能转译”\”,”`”,”!”,”$”
[root@localhost ~]# a="$1"
[root@localhost ~]# echo $a
[root@localhost ~]# a='$1'
[root@localhost ~]# echo $a
5、${ } 变量声明
[root@localhost ~]# a=1
[root@localhost ~]# echo $ab
[root@localhost ~]# echo ${a}b
6、$[ ] 作运算
$( )相当于` `
[root@localhost ~]# echo $[1+1]
四、变量值传递
$1 脚本后的第一串字符串
$2 脚本后的第二串字符串
$3 脚本后的第三串字符串
$# 脚本后所跟字符串的个数
$* 脚本后根的所有字符串,模式为“1 2 3”
$@ 脚本后根的所有字符串,模式为"1" "2" "3"
命令内容:
[root@localhost mnt]# echo $$ ##显示当前所在的进程
[root@localhost mnt]# vim test.sh
[root@localhost mnt]# sh test.sh
[root@localhost mnt]# sh test.sh westos
[root@localhost mnt]# sh test.sh westos linux
[root@localhost mnt]# sh test.sh westos linux redhat
区别:
$*和$@区别: $*后面是一串字符,$@后面是三串字符
证明:
[root@localhost ~]# cd /mnt
[root@localhost mnt]# vim for.sh
[root@localhost mnt]# sh -x for.sh westos linux redhat
##执行脚本,并查看过程
[root@localhost mnt]# vim for.sh
[root@localhost mnt]# sh -x for.sh westos linux redhat
编写脚本:当输入的文件少于两个时提示错误,用脚本建立文件中用户及密码
[root@localhost mnt]# vim create_user.sh
[root@localhost mnt]# sh create_user.sh
[root@localhost mnt]# cat userfile
[root@localhost mnt]# cat passfile
[root@localhost mnt]# sh create_user.sh userfile passfile
五、用read实现变量传递
read WESTOS
read -s WESTOS ##-s表示加密
read -p “input:” WESTOS ##-p表示提示
测试IP的交互式传参:
[root@localhost mnt]# vim text.sh
[root@localhost mnt]# sh text.sh
在登录用户和密码时使用交互式传参:
[root@localhost mnt]# vim create_user.sh ##编写脚本
[root@localhost mnt]# chmod +x create_user.sh ##给脚本可执行权限
[root@localhost mnt]# ./create_user.sh ##执行脚本
六、linux系统中命令别名的设定
临时更改:
[root@localhost ~]# alias xie='vim' ##将vim定义为xie
[root@localhost ~]# xie
[root@localhost ~]# alias
在用户和系统里写入:永久更改
[root@localhost ~]# vim .bashrc
alias xie='vim'
[root@localhost ~]# source .bashrc
[root@localhost ~]# su - student
[student@localhost ~]$ xie
[student@localhost ~]$ exit
[root@localhost ~]# vim /etc/bashrc
alias xie='vim'
[root@localhost ~]# source /etc/bashrc ##刷新系统变量
[root@localhost ~]# su - student
[student@localhost ~]$ xie
[student@localhost ~]$ exit
删除:
[root@localhost ~]# vim /etc/bashrc ##删除alias xie='vim'
[root@localhost ~]# vim .bashrc ##删除alias xie='vim'
[root@localhost ~]# source /etc/bashrc
[root@localhost ~]# alias
[root@localhost ~]# unalias xie ##删除alias
[root@localhost ~]# alias
七、利用命令执行结果设定变量
Hostname=$(hostname)
Hostname=`hostname`
$?是命令在执行完成之后产生的退出值
范围是[0~255]
当$0=0时标示命令执行没![这里写图片描述](https://img-blog.csdn.net/20180621234422291?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0FyZ3VlZF9E/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)有错误输出
这个值可以用exit命令执行
脚本编写:显示IP的状态用退出值执行退出
[root@localhost mnt]# vim ip_check.sh
[root@localhost mnt]# sh ip_check.sh
八、脚本中的函数
编写脚本:利用函数循环检测文件类型
[root@localhost mnt]# vim file_check.sh
[root@localhost mnt]# sh file_check.sh /etc/system-release
[root@localhost mnt]# sh file_check.sh /etc/passwd
利用脚本根据函数建立用户删除用户,并设置密码
[root@localhost mnt]# vim user_ctl.sh
[root@localhost mnt]# sh user_ctl.sh ##调用脚本