shell基础

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/  > /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
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

##############################################################
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

案例:
        计算机随机产生一个0~9之间的数字
        用户输入一个0~9之间的数字
  
    如果 计算机随机产生的数字 与  用户输入的数字  相等
             则输出  恭喜您猜对啦
    如果 计算机随机产生的数字 与  用户输入的数字  不相等 
    如果猜大了 则输出大了
    如果猜小了 则输出小了   

[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

posted on 2019-07-26 20:20  heping1314  阅读(90)  评论(0编辑  收藏  举报