-d : 这是一个目录
[root@localhost ~]# test -d /home
[root@localhost ~]# echo $?
0
[root@localhost ~]# test -d /home11111
[root@localhost ~]# echo $?
1
[root@localhost ~]# [ -d /home ]
注意中括号里的两个空格
-f filename : 当filename 存在时返回真
-b filename : 当filename 存在并且是块文件时返回真(返回0)
-d pathname : 当pathname 存在并且是一个目录时返回真
-h filename : 当filename 存在并且是符号链接文件时返回真 (或 -L filename)
-u pathname : 当由pathname 指定的文件或目录存在并且设置了SUID 位时返回真
-c filename : 当filename 存在并且是字符文件时返回真
-e pathname : 当由pathname 指定的文件或目录存在时返回真
-g pathname : 当由pathname 指定的文件或目录存在并且设置了SGID 位时返回真
-k pathname : 当由pathname 指定的文件或目录存在并且设置了"粘滞"位时返回真
-p filename : 当filename 存在并且是命名管道时返回真
-r pathname : 当由pathname 指定的文件或目录存在并且可读时返回真
-s filename : 当filename 存在并且文件大小大于0 时返回真
-S filename : 当filename 存在并且是socket 时返回真
-t fd : 当fd 是与终端设备相关联的文件描述符时返回真
-w pathname : 当由pathname 指定的文件或目录存在并且可写时返回真
-x pathname : 当由pathname 指定的文件或目录存在并且可执行时返回真
-O pathname : 当由pathname 存在并且被当前进程的有效用户id 的用户拥有时返回真(字母O 大写)
-G pathname : 当由pathname 存在并且属于当前进程的有效用户id 的用户的用户组时返回真
file1 -nt file2 : file1 比file2 新时返回真
file1 -ot file2 : file1 比file2 旧时返回真
[ 1 -gt 2 ] 大于
[ 1 -lt 2 ] 小于
[ 1 -eq 2 ] 等于
[ 1 -ne 2 ] 不等于
[ 1 -ge 2 ] 大于等于
[ 1 -le 2 ] 小于等于
[root@localhost ~]# vim user.sh
num=$(id -u)
if [ $num -eq 0 ]
then
echo "administrator"
else
echo "user"
fi
[root@localhost ~]# bash user.sh
[root@localhost ~]# bash 1.sh
administrator
[js@localhost ~]# bash 1.sh
user
[root@localhost ~]# ((1<2));echo $?
0
[root@localhost ~]# ((1==2));echo $?
1
[root@localhost ~]# ((1>2));echo $?
1
[root@localhost ~]# ((1>=2));echo $?
1
[root@localhost ~]# ((1<=2));echo $?
0
[root@localhost ~]# ((1!=2));echo $?
0
[root@localhost ~]# ((`id -u`>0));echo $?
1
[root@localhost ~]# (($UID==0));echo $?
0
猜测你的用户名是root
[root@localhost ~]# [ "$USER" = "root" ];echo $?
0
[root@localhost ~]# [ "$USER" == "root" ];echo $?
0
[root@localhost ~]# [ "$USER" = "root" ];echo $?
0
[root@localhost ~]# [ "$USER" = "js" ];echo $?
1
[root@localhost ~]# [ "$USER" != "js" ];echo $?
0
双引号的重要性
定义三个变量,一个有值,一个妹纸,一个没有定义。
[root@localhost ~]# var1=111
[root@localhost ~]# var2=
//var3变量没有定义
-z:判断长度是0
[root@localhost ~]# [ -z "$var1" ];echo $?
1
[root@localhost ~]# [ -z "$var2" ];echo $?
0
[root@localhost ~]# [ -z "$var3" ];echo $?
0
-n:判断长度不是0
[root@localhost ~]# [ -n "$var1" ];echo $?
0
[root@localhost ~]# [ -n "$var2" ];echo $?
1
[root@localhost ~]# [ -n "$var3" ];echo $?
1
或者
[root@localhost ~]# echo ${#var1}
3
[root@localhost ~]# echo ${#var2}
0
[root@localhost ~]# echo ${#var3}
0
小结:变量为空 或 未定义: 长度都为0
&& 逻辑的 AND 的意思, -a 也是这个意思,两个条件同时成立,为真。
|| 逻辑的 OR 的意思, -o 也是这个意思,两个条件一个成立,为真。
猜测用户输入的成绩是否良好(59~79)之间
[root@localhost ~]# num=59;[ $num -gt 60 -a $num -lt 80 ];echo $?
1
[root@localhost ~]# num=81;[ $num -gt 60 -a $num -lt 80 ];echo $?
1
[root@localhost ~]# num=60;[ $num -gt 60 -a $num -lt 80 ];echo $?
1
[root@localhost ~]# num=61;[ $num -gt 60 -a $num -lt 80 ];echo $?
0
[root@localhost ~]# [ 1 -lt 2 -a 5 -gt 10 ];echo $?
1
[root@localhost ~]# [ 1 -lt 2 -o 5 -gt 10 ];echo $?
0
注意:&&调用正则时,请使用双中括号。
[root@localhost ~]# [[ 1 -lt 2 && 5 -gt 10 ]];echo $?
1
[root@localhost ~]# [[ 1 -lt 2 || 5 -gt 10 ]];echo $?
0
或者
[root@localhost ~]# [ 1 -lt 2 ] && [ 11 -gt 10 ];echo $?
0
if 条件测试
then 命令序列
fi
编写脚本,由用户输入用户名,如果用户不存在,则创建该用户,并设置密码为123456
[root@localhost ~]# vim 1.sh
#!/bin/bash
read -p "Input username: " name
id $name &> /dev/null
if [ $? -ne 0 ]; then
useradd $name
echo "123456" | passwd --stdin $name &> /dev/null
echo "$name create finished,the password is 123456"
fi
或者运用取反的方法
[root@localhost ~]# vim 1.sh
#!/bin/bash
read -p "Input username: " name
if ! id $name &> /dev/null; then
useradd $name
echo "123456" | passwd --stdin $name &> /dev/null
echo "$name create finished,the password is 123456"
fi
if 条件测试
then 命令序列
else 命令序列
fi
编写脚本,由用户输入用户名,如果用户不存在,则创建该用户,并设置密码为123456;否则,提示用户已经存在
[root@localhost ~]# vim 1.sh
#!/bin/bash
read -p "Input username: " name
#id $name &> /dev/null
#if [ $? -ne 0 ] ;then
if ! id $name &> /dev/null; then
useradd $name
echo "123456" | passwd --stdin $name &> /dev/null
echo "$name create finished,the password is 123456"
else
echo "$name already exist"
fi
编写脚本,由用户输入用户名,判断该用户的uid及gid,如果相同,则显示Good user;
否则显示Bad user.
[root@localhost ~]# vim 1.sh
#!/bin/bash
read -p "Input username: " name
user_id=`id -u $name`
group_id=`id -g $name`
if [ $user_id -eq $group_id ];then
echo "Good user."
else
echo "Bad user."
fi
if 条件测试1
then 命令序列
elif 条件测试2
then 命令序列
elif 条件测试3
then 命令序列
...
else 命令序列
fi
编写脚本,取出系统时间的小时,对数字进行判断
6–10 this is morning
11-13 this is noon
14-18 this is afternoon
其他 this is night
[root@localhost ~]# vim 1.sh
#!/bin/bash
hour=`date +%H`
if [ $hour -ge 6 -a $hour -le 10 ];then
echo "This is morning"
elif [ $hour -ge 11 -a $hour -le 13 ];then
echo "This is noon"
elif [ $hour -ge 14 -a $hour -le 18 ];then
echo "This is afternoon"
else
echo "This is night"
fi
if 条件测试1
then 命令序列
if 条件测试1
then 命令序列
else 命令序列
fi
else 命令序列
fi
[root@localhost ~]# vim 1.sh
read -p "Input username: " name
id $name &> /dev/null
if [ $? -eq 0 ]
then echo "$name 存在"
else useradd $name
echo "$name create finished"
read -p "请输入用户密码: " pass
if [ ${
#pass} -ge 7 ]
then echo "$pass" | passwd --stdin $name
echo "$name 用户密码是 $pass"
else echo "密码不合格"
fi
fi
case 变量 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
模式3)
命令序列3
;;
*)
无匹配后命令序列
esac
[root@localhost ~]# vim 1.sh
#!/bin/bash
read -p "Input string: " str
case $str in
windows)
echo "Linux..."
;;
linux)
echo "Windows..."
;;
*)
echo "Other...."
;;
esac
邀请用户输入待删除用户名。
询问用户,确定要继续删除吗 yes/no
[root@localhost ~]# vim 1.sh
#!/bin/bash
#1请输入删除的用户名:
read -p "please input a username : " user
#2输出用户ID
id $user &> /dev/null
#3判断用户是否存在
if [ $? -ne 0 ];then
echo "no such user: $user"
exit 1
fi
#4请用户确认是否删除
read -p "are you sure?[y/n]: " action
if [ "$action" = "y" -o "$action" = "Y" ] ;then
userdel -r $user
echo "$user is deleted!"
else
echo "thank you"
fi
[root@localhost ~]# vim 1.sh
#!/bin/bash
#1请输入删除的用户名:
read -p "please input a username : " user
#2输出用户ID
id $user &> /dev/null
#3判断用户是否存在
if [ $? -ne 0 ];then
echo "no such user: $user"
exit 1
fi
#4请用户确认是否删除
read -p "are you sure?[y/n]: " action
#if [ "$action" = "y" -o "$action" = "Y" ] ;then
# userdel -r $user
# echo "$user is deleted!"
#else
# echo "thank you"
#fi
#5case写法
case "$action" in
Y|y|YES|yes)
userdel -r $user
echo "$user is deleted!"
;;
*)
echo "thank you"
;;
esac
1)web1
2)web2
3)web3
h)help
q)exit
[root@localhost ~]# vim jump-server.sh
#!/bin/bash
web1=10.8.162.66
web2="待分配2"
web3="待分配3"
while :
do
cat <.web1
2.web2
3.web3
4.quit
5.exit
EOF
read -p "input number:" num
case $num in
1)
ssh root@$web1
;;
2)
ssh root@$web2
;;
3)
ssh root@$web3
;;
4)
quit
;;
5)
exit
;;
*)
echo "no"
esac
done
h 显示命令帮助
f 显示磁盘分区
d 显示磁盘挂载
m 查看内存使用
u 查看系统负载
q 退出程序
[root@localhost ~]# vim systemmanage.sh
#!/bin/bash
cat <.help
f.disk partation
d.filesystem mount
m.memory
u.system load
q.exit
EOF
while :
do
read -p "please input:" action
case "$action" in
f)
fdisk -l
;;
d)
df -hT
;;
m)
free -m
;;
u)
uptime
;;
q)
exit
;;
h)
cat <.help
f.disk partation
d.filesystem mount
m.memory
u.system load
q.exit
EOF
;;
*)
echo "error"
;;
esac
done
() 子shell中执行: (cd /home;ls)
(()) 比较数值,运算 C语言: ((1<2));echo $?
$() 命令替换,或者反撇``: touch file$(date)
$(()) 整数运算: echo $((1+1))
{
}集合: touch file{
1..3}
${
}字符串的提取和替换。: echo ${
aaa-111}
[] 条件测试: [ -f file1.txt ]; echo $?
[[]] 条件测试,支持正则 : [[ 12 =~ [0-9]+$ ]] ;echo $?
$[] 整数运算: echo $[1+1]
执行脚本:
# ./01.sh <需要执行权限> 在子shell中执行
# bash 01.sh 不需要执行权限 在子shell中执行
# . 01.sh 不需要执行权限 在当前shell中执行
# source 01.sh 不需要执行权限 在当前shell中执行
提示:通常修改系统配置文件中如 /etc/profile 的PATH等变量后,使之在当前shell中生效
调试脚本的其他方法:
# sh -n 02.sh 仅调试脚本中的语法错误。
# sh -vx 02.sh 以调试的方式执行,查询整个执行过程