1、变量的作用
为灵活管理Linux系统提供特定参数,有两层意思:
变量名:使用固定的名称,由系统预设或用户定义
变量值:能够根据用户设置、系统环境的变化而变化
2、变量的类型
自定义变量:由用户自己定义、修改和使用
环境变量:由系统维护,用于设置工作环境
位置变量:通过命令行给脚本程序传递参数
预定义变量:Bash中内置的一类变量,不能直接修改
定义一个新的变量
格式:变量名=变量值
变量名以字母或下划线开头,区分大小写,建议全大写
查看变量的值
格式:echo $变量名
Product=PPT
Version=3.0
echo $Product
echo $Product $Version
赋值时可以使用引号,它们将有如下意义:
双引号:允许通过$符号引用其他变量值
如NEW=“WORD$Version”,将引用上面的变量,结果是WORD3.0
单引号:禁止引用其他变量值,$视为普通字符
当需要用$符号时。如CASH=‘US$IS’
反撇号:命令替换,提取命令执行后的输出结果
如EX=`pgrep –U root | wc –l`,把命令结果赋给EX
从键盘输入内容为变量赋值
格式: read [-p “提示信息”] 变量名
如read –p “请输入循环次数:” CISHU
NEW=“WORD$Version”
echo $NEW
CASH='US$IS'
echo $CASH
EX='pgrep -U root | wc -l'
echo $EX
设置变量的作用范围
格式1:export 变量名 ... (已有的变量)
格式2: export 变量名=变量值 ...(新定义的变量)
—— 两种格式可以混合使用
echo $Product $Version
export Product Version
bash
echo $Product $Version
echo $EX $CISHU
exit
echo $EX $CISHU
整数变量的运算(赋值时必须用反撇号`)
格式:expr 变量1 运算符 变量2 [运算符 变量3] ...
常用运算符
加法运算:+
减法运算: -
乘法运算: \*
除法运算: /
求模(取余)运算: %
例:echo $EX $CISHU
AK=`expr $EX + $CISHU` (假定read 时输入15)
echo $AK
例AK=`expr $EX - $CISHU`
echo $AK
例AK=`expr $EX \* $CISHU`
echo $AK
例AK=`expr $EX / $CISHU`
echo $AK
例AK=`expr $EX % $CISHU`
echo $AK
echo $EX $CISHU
AK=`expr $EX + $CISHU`
echo $AK
AK=`expr $EX - $CISHU`
echo $AK
AK=`expr $EX \* $CISHU`
echo $AK
AK=`expr $EX / $CISHU`
echo $AK
AK=`expr $EX % $CISHU`
echo $AK
环境变量
由系统提前创建,用来设置用户的工作环境
配置文件: /etc/profile、~/.bash_profile
常见的环境变量:
echo $PATH
PATH=“$PATH:/root” (添加一下新路径/root)
echo $PATH
位置变量
表示为 $n,n为1~9之间的数字,超过9则用${n}
cat myprog.sh
echo “字母表第5个字母是:” $5
echo “字母表第18个字母是:” ${18}
sh myprog.sh {a..z}
字母表第5个字母是:e
字母表第18个字母是:r
预定义变量
cat mybak.sh
#!/bin/bash
TARFILE=beifen-`date +%Y%m%d`.tgz
tar zcf $TARFILE $* &> /dev/null
echo "已执行 $0 脚本,"
echo "共完成 $# 个对象的备份"
echo “具体内容包括: $*”
sh mybak.sh /etc/passwd /etc/shadow
ls *.tgz
test命令
测试特定的表达式是否成立,当条件成立时,测试语句的返回值为0,否则为其他数值
格式1:test 条件表达式
格式2:[ 条件表达式 ] (至少应有一个空格)
文件测试 格式:[ 操作符 文件或目录 ]
常用的测试操作符(先clear)
-d:测试是否为目录(Directory)
-e:测试目录或文件是否存在(Exist)
-f:测试是否为文件(File)
-r:测试当前用户是否有权限读取(Read)
-w:测试当前用户是否有权限写入(Write)
-x:测试当前用户是否有权限执行(eXcute)
[ -d /etc/ssh ]
echo $?
[ -d /etc/hosts ]
echo $?
[ -e /dev/cdrom ] && echo "YES"
[ -e /dev/usb ] && echo "YES"
整数值比较 格式:[ 整数1 操作符 整数2 ]
常用的测试操作符(先clear,假定虚拟机内存为1024M)
-eq:等于(Equal)
-ne:不等于(Not Equal)
-gt:大于(Greater Than)
-lt:小于(Lesser Than)
-le:小于或等于(Lesser or Equal)
-ge:大于或等于(Greater or Equal)
who | wc -l
[ $(who | wc -l) -gt 1 ] && echo "Too many."
[ $(who | wc -l) -ge 2 ] && echo "> = 2."
FreeCC=$(free -m | grep "Mem" | awk '{print $4}')
[ $FreeCC -lt 1024 ] && echo ${FreeCC}MB
字符串比较
格式1:[ 字符串1 = 字符串2 ]
[ 字符串1 != 字符串2 ]
格式2:[ -z 字符串 ]
常用的测试操作符(先clear)
=:字符串内容相同
!=:字符串内容不同,! 号表示相反的意思
-z:字符串内容为空
逻辑测试
格式1:[ 表达式1 ] 操作符 [ 表达式2 ] ...
格式2:命令1 操作符 命令2 ...
常用的测试操作符
-a或&&:逻辑与,“而且”的意思
-o或||:逻辑或,“或者”的意思
!:逻辑否
echo $LANG
[ $LANG != "en.US" ] && echo "Not en.US"
read -p "是否覆盖现有文件(yes/no)?" ACK
[ $ACK = "yes" ] && echo "覆盖"
echo $USER
[ $USER != "teacher" ] && echo "Not teacher"
3、单分支if语句
判断挂载点目录,若不存在则自动创建
vi chkmountdir.sh
#!/bin/bash
MOUNT_DIR="/media/cdrom/"
if [ ! -d $MOUNT_DIR ]
then
mkdir -p $MOUNT_DIR
fi
ls -ld /media/cdrom/
sh chkmountdir.sh
ls -ld /media/cdrom/
4、双分支if语句
判断目标主机是否存活,显示检测结果
vi pinghost.sh
#!/bin/bash
ping -c 3 -i 0.2 -W 3 $1 &> /dev/null
if [ $? -eq 0 ]
then
echo "Host $1 is up."
else
echo "Host $1 is down."
5、多分支if语句
判断分数范围,分出优秀、合格、不合格三档
vi gradediv.sh
#!/bin/bash
read -p "请输入您的分数(0-100):" GRADE
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ] ; then
echo "$GRADE 分!优秀"
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ] ; then
echo "$GRADE 分,合格"
else
echo "$GRADE 分?不合格"
fi