变量类型: ①字符型
②数值型
③整数型
④浮点型
⑤布尔型
Shell属于弱类型编程语言——数据类型可以被忽略的语言。它与强类型定义语言相反, 一个变量可以赋不同数据类型的值。
Bash变量类型: ①环境变量
②本地变量
③位置变量
④特殊变量
本地变量:
引用本地变量${abc}时花括号有时可以省略。若变量后紧跟着其他字符,如${ABC}S,则不能省略。
变量的赋值方式:
本地变量:VAR=VALUE 作用域为整个bash进程
局部变量; local VAR=VALUE 作用域为当前代码段
环境变量: export VAR=VALUE 作用域为当前shell进程及其子进程
位置变量:$1,$2……
特殊变量:
$?:保存上一个命令的执行状态返回值,程序状态的返回码0—255之间,
0表示正确执行,1—255都表示错误执行,1、2、127为系统预留。
$#:参数的个数
$*:参数的列表
[email protected]:参数的列表
$$ :Shell本身的PID(ProcessID)
撤销变量:unsetVAR
查看当前shell中的变量: set
查看当前shell中的环境变量:printevn、evn、export
Shell编程——条件判断
条件测试类型: ①整数测试
②字符测试
③文件测试
表达式:[expression ] 、[[ expression ]] 、test expression
注:表达式和[ ]之间一定要有空格
整数比较:
-eq :测试两个整数是否相等,如[ $A –eq $B ],相等为真,不等为 假。
-ne : 测试两个整数是否不相等,不相等为真,相等为假。
-gt : 测试一个整数是否大于另一个,大于为真,小于等于为假。
-lt : 测试一个整数是否小于另一个,小于为真,大于等于为假。
-ge:测试一个整数是否大于等于另一个整数,大于等于为真,小 于为假。
-le:测试一个整数是否小于等于另一个整数,小于等于为真,大 于为假。
逻辑与:&&
逻辑或:||
例:如果用户user不存在,就添加用户。
# !id user && useradd user
或者id user || useradd user (注:逻辑与前面为真后面命令不执行)
变量命名规则:1只能包含字母、数字和下划线,并且不能以数字 开头;
2不应该和系统中已有的环境变量重名
3做到见名知意
例:如果/etc/inittab大于100行,则是大文件。
#!/bin/bash
LINES=`wc–l /etc/inittab`
#echo$LINES
FINLINES=`echo$LINES|cut –d ‘ ’ –f1`
#echo $FINLINES
[$FINLINES –gt 100 ] && echo “it is a big file !” || echo “it is a small file !”
例:如果用户不存在,添加用户并且设定密码;否则,显示用户已 存在。
!id user1 && useradd user1 && echo “user” |passwd –stdin user1 || echo “user1 is existing!”
脚本实现:
#!/bin/bash
read -p "Enter userID: "ID
! id $ID && useradd $ID&& echo $ID | passwd --stdin $ID ||echo "$ID is existing !"
可以加入/dev/null
自我练习:
#!/bin/bash
if [$# -ne 2 ];then
echo ‘参数错误!‘
exit 3
fi
if [$1 – eq $2 ];then
echo “$1 等于$2”
exit 4
fi
if [$1 –gt $2 ];then
echo “$1大于$2”
exit 5
fi
if [$1 –lt $2 ];then
echo “$1小于$2”
exit 6
fi
单分支if语句:
if 条件判断; then
statement1
statement2
……
fi
双分支的if语句:
if 判断条件;then
statement1
……
else
statement2
……
fi
例:如果用户UID为0,那么现实为管理员,否则,现实为普通用户。
#!/bin/bash
NAME=users #改为read –p “ID:”NAME 实现交互
If
[ `id –u $NMAE` -eq 0 ]
then
echo “Adminitrator!”
else
echo“Commonuser!”
fi
增加判断用户是否存在:
#!/bin/bash
read-p "ID:" NAME
if
[ `id -u $NAME` ] #注意要加反引号!或者直接写成 id –u $NAME
then
if
[ `id -u $NAME` -eq 0 ]
then
echo "Admin"
else
echo "Common user"
fi
else
echo " This user not exist!"
fi
shell中进行算术运算:1 let 如let C=$A+$B
2 $[ $A+$B ]
3 $(($A+$B))
4 expr如C=`expr $A+$B`
exit :退出脚本。exit后面可以加数字0-255之间。如果没有定义命
令状态码,就是exit后面的数字。那么最后执行的命令的状态
码即为脚本的状态码。
if ……;then如果if后面不加[ ],那么if直接判断状态码,如
if grep ……。
文件测试:
-e file:测试文件是否存在
-f file:测试文件是否问普通文件
-d file:测试指定路径是否为目录
-r file:测试文件对当前用户是否有读权限
-w file:测试文件对当前用户是否有写权限
-x file:测试文件对当前用户是否有执行权限
例:如果文件不存在则推出脚本
#!/bin/bash
注:if后面为假,则then后面就不执行。所以文件不存在,!取反,则then后面执行 |
FILE=/etc/inittab
if [ !–e $FILE ];then
echo “NOFILE!”
exit 8
fi
多分支if语句:
if 判断1;then
statement1
……
elif 判断2;then
statement2
……
elif ……
else
statementN
fi
例:输入一个文件路径,测试文件是否存在。
#!/bin/bash
if [$# -lt 1 ] || [ $# -gt 1 ];then
echo “NO Parameters !”
exit 7
fi
if [ -e $1 ];then
echo “OK!”
else
echo “NO Files !”
fi
shift : 轮替后面可加数字,表示轮替多少个
例:
#!/bin/bash
echo$1
shift
echo$1
执行:./X.sh 1 2
显示结果为: 1
2
若改成shift 2
则./X.sh 1 2 3
则显示: 1
3
字符测试:
== 是否相等,相等为真
!= 是否不相等,不相等为真
> 大于
< 小于
-zstring :测试指定字符串是否为空,空则真
-nstring :测试指定字符串是否为不空,不空为真
例:[ `id –n –u$1` == `id –n –g $1`]
飞bc:计算器
scale=N ,表示保留几位精度
例: echo “scale=2;111/22;”|bc
或者 bc<<< “scale=2;111/22;”
例:传递三个参数给脚本,第一个为整数,第二个为算术运算符,第三个为整数,将计算结果保留两位精度。
#!/bin/bash
echo`bc <<< “scale=2;$!$2$3”`
例:传递三个参数给脚本,参数均为用户名,将这些用户的账号信息提取出来放置于/tmp/test中,并且需求每一行行首有行号。
egrep “$1|$2|$3” /etc/passwd >>/tmp/a
cat –n /tmp/a > /tmp/test
rm –rf a
shell循环:要有进入条件,退出条件:for、while、until
1 for 变量 in 列表 ;do
循环体
done
生成列表:{ 1..N}、`seq 起始数步进数 结束数`
declare :声明变量类型
-i:整型
-x:声明为环境变量
例:求1到100的和
#!/bin/bash
declare -i SUM=0
for I in {1..100};do
SUM=$[$SUM+$I]
done
echo “The SUM is :$SUM。”
例:比较三个数的大小
echo -n "Enter three number:"
read a b c
if [ $a -gt $b ];then
t=$a;a=$b;b=$t;
fi
if [ $a -gt $c ];then
t=$a;a=$c;c=$t;
fi
if [ $b -gt $c ];then
t=$b;b=$c;c=$t;
fi
echo "From small to big:$a,$b,$c"
例:给每个用户发送hello
#!/bin/bash
for I in `cat /etc/passwd|cut –d: -f1` ;do
echo“hello,$I”
done
例:依次向/etc/passwd中的每个用户问好,并显示对方的shell,只想默认shell为bash的用户问好。
#!/bin/bash
for I in `cat /etc/passwd |grep ‘bash‘`;do
echo"hello `echo $I |cut -d: -f1` your bash"
done
例:添加10个用户user1~user10,密码同用户名,要求只有用户不存在的情况下才能添加
扩展,接受一个参数,参数为add时添加用户,当参数是del时,删除用户,其他参数则退出。
#!/bin/bash
if [ $1 == add];then
for I in{1..10};do
! id user$I &&useradd user$I -puser$I
done
elif [ $1 == del];then
for I in {1..10};do
id user$I >/dev/null &&userdel user$I
done
else
echo "paramiter wrong"
fi
例:分别显示当前系统上所有默认shell为bash的用户和默认shell为nologin的用户,并统计各类shell的用户总数如:there have 3 users,they name is ……
#!/bin/bash
for I in `grep‘bash‘ /etc/passwd|cut -d: -f1`;do
A="$A $I"
done
echo "users`grep ‘bash‘/etc/passwd|wc -l`name is $A"
或者直接用把用户名cut出来赋予一个变量得到的结果“user1 user2 user3”,而且没有格式错误。