标签:$* 运算 定义 test ifconfig dir rhel zha pre
Shell语言脚本:可以运行,一个文件,可以实现某种功能(命令的堆积)
[root@server0 ~]# vim /root/stu.sh
echo hello world
cat /etc/redhat-release
uname -r
hostname
ifconfig | head -2
[root@server0 ~]# chmod +x /root/stu.sh
[root@server0 ~]# /root/stu.sh
案例1:书写一个创建用户的脚本
[root@server0 ~]# vim /root/user.sh
useradd nsd02
echo 123 | passwd --stdin nsd02
[root@server0 ~]# chmod +x /root/user.sh
[root@server0 ~]# /root/user.sh
#################################################################
规范Shell脚本的一般组成
? #! 环境声明(下面所有的语句解释程序)
? # 注释文本
? 可执行代码
管道传递
? 使用 | 管道操作
– 将前一条命令的标准输出交给后一条命令处理
重定向输出
: 只收集前面命令的正确输出
2> : 只收集前面命令的错误输出
&> : 前面命令正确与错误输出
[root@server0 ~]# echo 123 > /opt/1.txt
[root@server0 ~]# cat /opt/1.txt
[root@server0 ~]# cat /opt/1.txt /etc/
[root@server0 ~]# cat /opt/1.txt /etc/ > /opt/a.txt
[root@server0 ~]# cat /opt/a.txt
[root@server0 ~]# cat /opt/1.txt /etc/ 2> /opt/a.txt
[root@server0 ~]# cat /opt/a.txt
[root@server0 ~]# cat /opt/1.txt /etc/ &> /opt/a.txt
[root@server0 ~]# cat /opt/a.txt
###################################################################
/dev/null : 黑洞设备
案例2:创建用户设置密码
[root@server0 ~]# vim /root/user.sh
#!/bin/bash
useradd nsd04 &> /dev/null
echo 用户nsd04创建成功
echo 123 | passwd --stdin nsd04 &> /dev/null
echo 用户nsd04密码设置成功
[root@server0 ~]# chmod +x /root/user.sh
[root@server0 ~]# /root/user.sh
让脚本适用多变的环境
变量 : 容器 以不变名称,存放可以变化的值
[root@server0 ~]# vim /root/user.sh
#!/bin/bash
user=natasha
useradd $user &> /dev/null
echo 用户$user创建成功
echo 123 | passwd --stdin $user &> /dev/null
echo 用户$user密码设置成功
[root@server0 ~]# /root/user.sh
为变量赋值:
变量名=值
read 为变量赋值,读入用户在键盘上的输入,将用户在键盘上的输入赋值给变量
[root@server0 ~]# cat /root/user.sh
#!/bin/bash
read -p ‘请输入您要创建的用户:‘ user
useradd $user &> /dev/null
echo 用户$user创建成功
echo 123 | passwd --stdin $user &> /dev/null
echo 用户$user密码设置成功
[root@server0 ~]#
[root@server0 ~]# cat /root/user.sh
#!/bin/bash
read -p ‘请输入您要创建的用户:‘ user
read -p ‘请输入您要设置的密码:‘ pass
useradd $user &> /dev/null
echo 用户$user创建成功
echo $pass | passwd --stdin $user &> /dev/null
echo 用户$user密码设置成功
###############################################################
? 以不变的名称存放的可能会变化的值
– 变量名=变量值
– 方便以固定名称重复使用某个值
– 提高对任务需求、运行环境变化的适应能力
变量名
– 等号两边不要有空格
– 变量名由字母/数字/下划线组成,区分大小写
– 变量名不能以数字开头,不要使用关键字和特殊字符
下列变量名中有效的shell变量名是( C )
A:-2-time B:_2$3 C:trust_no_1 D:2004file
查看/引用变量
? 基本格式
– 引用变量值:$变量名
– 查看变量值:echo $变量名、echo ${变量名}
[root@server0 ~]# echo $a
rhel
[root@server0 ~]# echo $a7
[root@server0 ~]# echo ${a}7
rhel7
$[] : 代表运算
[root@server0 ~]# echo $[1+1]
[root@server0 ~]# echo $[2*3]
[root@server0 ~]# echo $[2-3]
[root@server0 ~]# echo $[10/2]
[root@server0 ~]# echo $[10%2] #取余数运算
[root@server0 ~]# echo $[10%3]
[root@server0 ~]# a=7
[root@server0 ~]# b=3
[root@server0 ~]# echo $[$a+$b]
$( )与` `: 将命令输出结果,作为参数
[root@server0 opt]# date +%F
[root@server0 opt]# mkdir date +%F
[root@server0 opt]# ls
[root@server0 opt]# mkdir mariadb-date +%F
[root@server0 opt]# ls
[root@server0 opt]# mkdir hostname
-date +%F
[root@server0 opt]# ls
单引号‘ ‘ : 可以取消特殊字符的意义
生成随机数 $RANDOM
生成随机数 范围为 0~99 之间的随机数 $[$RANDOM%100]
生成随机数 范围为 0~9 之间的随机数 $[$RANDOM%10]
求余运算: 余数一定小于被除数
##############################################################
环境变量,由系统直接定义完成,赋值完成
? 常见的环境变量
USER : 当前登陆的系统身份
位置变量
? 在执行脚本时提供的命令行参数
– 表示为 $n,n为序号
– $1、$2、.. .. ${10}、${11}、.. ..
[root@server0 /]# vim /root/test02.sh
#!/bin/bash
cat -n $1 | head -$2
[root@server0 /]# /root/test02.sh /etc/passwd 4
预定义变量
? 用来保存脚本程序的执行信息
$# 已加载的位置变量的个数(计算使用位置变量的总数)
$* 所有位置变量的值
$? 程序退出后的状态值,0表示正常,其他值异常
[root@server0 /]# vim /root/test02.sh
#!/bin/bash
cat -n $1 | head -$2
echo $#
echo $*
[root@server0 /]# /root/test02.sh /etc/passwd 2
#############################################################
条件测试及选择
? 检查文件状态
-e : 存在 为真
-d : 存在且为目录 才为真
-f : 存在且为文件 才为真
-r : 存在且对于对象有读权限 才为真
-w : 存在且对于对象有写权限 才为真
-x : 存在且对于对象有执行权限 才为真
[root@server0 /]# [ -e /etc ]
[root@server0 /]# echo $?
0
[root@server0 /]# [ -e /etc/haha ]
[root@server0 /]# echo $?
1
[root@server0 /]# [ -d /etc/passwd ]
[root@server0 /]# echo $?
1
[root@server0 /]# [ -d /etc ]
[root@server0 /]# echo $?
0
[root@server0 /]# [ -f /etc/passwd ]
[root@server0 /]# echo $?
0
? 比较整数大小(带g都有大于二字,带e的都有等于二字,带l的都有小于二字)
-gt :大于
-ge :大于等于
-eq :等于
-ne :不等于
-lt :小于
-le :小于等于
[root@server0 /]# a=7
[root@server0 /]# b=3
[root@server0 /]# [ $a -ne $b ]
[root@server0 /]# echo $?
0
[root@server0 /]# [ $a -eq $b ]
[root@server0 /]# echo $?
1
[root@server0 /]# [ $a -ge $b ]
[root@server0 /]# echo $?
0
[root@server0 /]# [ $a -le $b ]
[root@server0 /]# echo $?
1
? 字符串比对
== : 字符串一致为真
!= : 字符串不一致为真
[root@server0 /]# [ $USER == root ]
[root@server0 /]# echo $?
0
[root@server0 /]# [ redhat == root ]
[root@server0 /]# echo $?
1
[root@server0 /]# [ redhat != root ]
[root@server0 /]# echo $?
0
###############################################################
if双分支处理
if [条件判断];then
命令序列01
else
命令序列02
fi
案例:
计算机随机产生一个0~9之间的数字
用户输入一个0~9之间的数字
如果 计算机随机产生的数字 与 用户输入的数字 相等
则输出 恭喜您猜对啦
如果 计算机随机产生的数字 与 用户输入的数字 不相等
则输出 再见
[root@server0 /]# vim /root/num.sh
#!/bin/bash
num1=$[$RANDOM%10]
read -p ‘请输入[0-9]之间的数字:‘ num2
if [ $num1 -eq $num2 ];then
echo 恭喜您猜对了
else
echo 再见
fi
if多分支处理
if [条件判断1];then
命令序列01
elif [条件判断2];then
命令序列02
elif [条件判断3];then
命令序列03
else
命令序列04
fi
案例:
判断用户输入成绩
如果 成绩大于等于90 则输出优秀
如果 成绩大于等于80 则输出良好
如果 成绩大于等于70 则输出及格
如果 成绩大于等于60 则输出仍需努力
以上条件均不满足 则输出 在牛的肖邦,也弹不出哥的悲伤
[root@server0 /]# cat /root/nsd.sh
#!/bin/bash
read -p ‘请输入您的成绩:‘ nsd
if [ $nsd -ge 90 ];then
echo 优秀
elif [ $nsd -ge 80 ];then
echo 良好
elif [ $nsd -ge 70 ];then
echo 及格
elif [ $nsd -ge 60 ];then
echo 仍需努力
else
echo 在牛的肖邦,也弹不出哥的悲伤
fi
##############################################################
案例:
计算机随机产生一个0~9之间的数字
用户输入一个0~9之间的数字
如果 计算机随机产生的数字 与 用户输入的数字 相等
则输出 恭喜您猜对啦
如果 计算机随机产生的数字 与 用户输入的数字 不相等
如果猜大了 则输出大了
如果猜小了 则输出小了
[root@server0 /]# cat /root/num.sh
#!/bin/bash
num1=$[$RANDOM%10]
read -p ‘请输入[0-9]之间的数字:‘ num2
if [ $num1 -eq $num2 ];then
echo 恭喜您猜对了
exit #退出脚本
elif [ $num2 -gt $num1 ];then
echo 您猜大了
else
echo 您猜小了
fi
for循环结构
for 变量名 in 值列表
do
命令序列
done
for a in zhangsan lisi wangwu dc
do
useradd $a
done
变量a参与循环,变量a值影响循环的结果
[root@server0 /]# vim /root/for.sh
#!/bin/bash
for a in nsd11 nsd12 nsd13 nsd15
do
useradd $a
echo $a创建成功
done
变量a不参与循环,变量a值不影响循环的结果
#!/bin/bash
for a in 1 2 3
do
echo hello world
done
[root@server0 /]# cat /root/num.sh
#!/bin/bash
num1=$[$RANDOM%10]
for a in {1..10}
do
read -p ‘请输入[0-9]之间的数字:‘ num2
if [ $num1 -eq $num2 ];then
echo 恭喜您猜对了
exit #exit退出整个脚本
elif [ $num2 -gt $num1 ];then
echo 您猜大了
else
echo 您猜小了
fi
done
标签:$* 运算 定义 test ifconfig dir rhel zha pre
原文地址:http://blog.51cto.com/13841846/2133956