1.变量的定义
变量即在程序运行过程中它的值是允许改变的量
变量是用一串固定的字符来标示不固定的值的一种方法
变量是一种使用方便的占位符,用于引用计算机内存地址,该地址可以存储Script运行时可更改的程序信息
在shell中变量是不能永久保存在系统中的,必须在文件中声明
2.变量的种类
·在shell中变量分为环境级变量,用户级变量,系统级变量。
·环境级变量只在当前shell中生效,shell关闭变量丢失
·用户级变量写在用户的骨文件中,只针对当前用户生效
·系统级变量被写在系统的配置文件/etc/profile或者/etc/profile.d/中,对于所有用户都生效
3.变量的定义方法
1)环境级
如果直接定义a=1,在当前shell里直接执行echo $a,执行结果为1
但是把echo $a写进脚本里,执行脚本的时候,执行结果是空的
因为执行脚本的时候会重新开启一个shell,在新的shell没有定义a=1的值
所以要环境级变量export a=1
[root@localhost ~]# export a=1
关闭当前shell重新打开后变量丢失
2)用户级
[root@localhost ~]# vim ~/.bash_profile
export a=1
[root@localhost ~]# source ~/.bash_profile #刷新
切换用户变量丢失
3)系统级
[root@localhost ~]# vim /etc/profile
export a=1
切换用户变量仍然生效
4.变量名称的规范
变量名称中通常包含大小写字母,数字,下划线
变量名称格式
LINUX_CSDN
Linux_Csdn
linuX_Csdn
5.字符的转译和变量的声明
1)\ #转译单个字符
2)"" #弱引用,批量转译
3)'' #强引用,批量转译
""与''的区别在于""不能转译"\","`","!","$"
4)${} #变量声明
例子:
1)\ 转译单个字符
2)双引号与单引号的区别
[root@localhost ~]# echo '#########`hostname`#########'
#########`hostname`#########
[root@localhost ~]# echo "#########`hostname`#########"
#########localhost#########
单引号将`符号转译为普通字符和hostname一起输出,双引号没有转译这个符号的功能,所以执行了hostname这个命令然后输出了主机名
5.变量值传递
$1 脚本后的第一串字符串
$2 脚本后的第二串字符串
$3 脚本后的第三串字符串
$# 脚本后的字符串的个数
$* 脚本后的所有字符串,模式为“1 2 3”
$@ 脚本后的所有字符串,模式为“1”“2”“3”
例如:
[root@localhost mnt]# vim file.sh
#!/bin/bash
echo \$1 is $1
echo \$2 is $2
echo \$3 is $3
echo \$# is $#
echo \$* is $*
echo \$@ is $@
[root@localhost mnt]# sh file.sh
[root@localhost mnt]# sh file.sh linux
[root@localhost mnt]# sh file.sh linux lin
[root@localhost mnt]# sh file.sh linux lin li
$*与$@的区别举例:
[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=`wc -l $USERFILE|cut -d " " -f 1`
for LINE_NUM in `seq 1 $MAX_LINE`
do
USERNAME=`sed -n "${LINE_NUM}P" $USERFILE`
PASSWORD=`sed -n "${LINE_NUM}P" $PASSFILE`
useradd $USERNAME
echo $PASSWORD | passwd --stdin $USERNAME
done
脚本内容:
6.read实现变量传递
例1:判断输入的ip主机是否开启
[root@localhost mnt]# vim ip_check.sh
#!/bin/bash
read -p "Please input a number: " IP #如果不想显示输入的IP地址,可以加-s
ping -c1 -w1 $IP &> /dev/null && echo $IP is up || echo $IP is down
[root@localhost mnt]# sh ip_check.sh
Please input a number: 172.25.254.140
172.25.254.140 is down
[root@localhost mnt]# sh ip_check.sh
Please input a number: 172.25.254.152
172.25.254.152 is up
脚本内容:
例2:根据所输入用户名文件和密码文件建立用户,并判断输入的文件是否存在
[root@localhost mnt]# vim user_create.sh
#!/bin/bash
read -p "Please input a userfile: " USERFILE
[ -e $USERFILE ]||{
echo -e "\033[31m$USERFILE is not exist!!\033[0m"
exit 1
}
read -p "Please input a passwordfile: " PASSWORDFILE
[ -e $PASSWORDFILE ]||{
echo -e "\033[31m$PASSWORDFILE is not exist!!\033[0m"
exit 1
}
MAX_LINE=`awk 'BEGIN{N=0}{N++}END{print N}' $USERFILE`
for LINE_NUM in `seq 1 $MAX_LINE`
do
USERNAME=`sed -n "${LINE_NUM}p" $USERFILE`
PASSWORD=`sed -n "${LINE_NUM}p" $PASSWORDFILE`
useradd $USERNAME
echo $PASSWORD | passwd --stdin $USERNAME
done
脚本内容:
7.别名设定
1) alias xie=’vim’ 关闭当前shell则失效
[root@localhost mnt]# alias xie=vim
[root@localhost mnt]# xie
[root@localhost mnt]# alias
alias xie='vim'
2) vim .bashrc 切换用户则失效
[root@localhost ~]# vim .bashrc
[root@localhost ~]# source .bashrc
[root@localhost ~]# alias
alias xie='vim'
切换用户失效
3) vim /etc/bashrc 切换用户仍然有效
[root@localhost ~]# vim /etc/bashrc
[root@localhost ~]# source /etc/bashrc
[root@localhost ~]# alias
alias xie='vim'
切换用户仍然有效
4)撤销设定:unalias xie
把文件里的别名设置删掉然后执行unalias
8.exit退出值
0 # 以一个真实值退出,表示正常退出
1 # 带假值退出
2 #用法不当
126 # 找到了要执行的文件,但它不是可执行的实用程序
127 # 未找到要执行的实用程序.
128 # 一个命令被一个信号打断了
例子:编写脚本利用exit退出值检测所输入ip的主机是否打开
[root@localhost mnt]# vim ip_check.sh
read -p "please input an IP: " IP
ping -c1 -w1 $IP &> /dev/null
num=`echo $?`
[ "$num" = 0 ] &&{
echo $IP is up
}||{
echo $IP is down
}
[root@localhost mnt]# sh ip_check.sh
please input a IP: 172.25.254.222
172.25.254.222 is down
[root@localhost mnt]# sh ip_check.sh
please input a IP: 172.25.254.140
172.25.254.140 is up
脚本内容:
9.脚本中的函数
把一个复杂语句块定义成一个字符串的方法,可以让一个命令循环执行
例如:
[root@localhost mnt]# vim ip_check.sh
#!/bin/bash
PING()
{
read -p "Please input a number: " IP
[ "$IP" = exit ]&&{
echo bye
exit 0
}
ping -c1 -w1 $IP &> /dev/null &&{
echo $IP is up
}||{
echo $IP is down
}
PING
}
PING
[root@localhost mnt]# sh ip_check.sh
Please input a number: 172.25.254.155
172.25.254.155 is up
Please input a number: 172.25.254.111
172.25.254.111 is down
Please input a number: exit
bye
执行如下:
脚本内容: