当前位置: 首页 > news >正文

Engineer01

Shell脚本

• 脚本: 可以执行文件,实现某种功能

• 提前设计可执行语句,用来完成特定任务的文件(命令的堆积)

规范Shell脚本的一般组成
• #! 环境声明(Sha-Bang) 以下所有代码,用那个程序解释
• # 注释文本
• 可执行代码

[root@server0 ~]# cat /root/hello.sh
#!/bin/bash
echo hello world
hostname
uname -r
ifconfig | head -2 | tail -1
cat /etc/redhat-release

[root@server0 ~]# /root/hello.sh

####################################################
重定向输出

: 只收集正确信息的重定向
2>: 只收集错误信息的重定向
&>: 收集正确与错误信息的重定向

[root@server0 ~]# echo 123 > /opt/1.txt
[root@server0 ~]# cat /opt/1.txt
[root@server0 ~]# cat /etc

[root@server0 ~]# cat /opt/1.txt /etc/
[root@server0 ~]# cat /opt/1.txt /etc/ > /mnt/a.txt
[root@server0 ~]# cat /mnt/a.txt

[root@server0 ~]# cat /opt/1.txt /etc/ 2> /mnt/a.txt
[root@server0 ~]# cat /mnt/a.txt

[root@server0 ~]# cat /opt/1.txt /etc/ &> /mnt/a.txt
[root@server0 ~]# cat /mnt/a.txt

运算:
[root@server0 ~]# echo 1+2 | bc

[root@server0 ~]# echo 2*3 | bc

[root@server0 ~]# echo 4/2 | bc

[root@server0 ~]# echo 10%3 | bc #取余数运算

$( ):将命令的输出结果,作为参数

[root@server0 ~]# rm -rf /opt/*
[root@server0 ~]# cd /opt/

[root@server0 opt]# date

[root@server0 opt]# date +%F #输出年月日

[root@server0 opt]# mkdir $(date +%F)
[root@server0 opt]# ls

[root@server0 opt]# mkdir mydir-$(date +%F)
[root@server0 opt]# ls

[root@server0 opt]# mkdir $(hostname)-$(date +%F)
[root@server0 opt]# ls

''(单引号):取消特殊字符的意义

[root@server0 /]# echo '* >'

[root@server0 /]# echo '* > ? {} [] ~'

#####################################################

/dev/null:黑洞设备

变量:为了增加脚本适用环境的能力,以及方便适用

变量作用:以不变的名称,存储变化的值(容器)

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/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用户密码设置成功

#################################################
变量的定义

• 以不变的名称存放的可能会变化的值
– 变量名=变量值
– 方便以固定名称重复使用某个值
– 提高对任务需求、运行环境变化的适应能力

• 设置变量时的注意事项
– 若指定的变量名已存在,相当于为此变量重新赋值
– 等号两边不要有空格
– 变量名由字母/数字/下划线组成,区分大小写
– 变量名不能以数字开头,不要使用关键字和特殊字符

• 基本格式
– 引用变量值:$变量名
– 查看变量值:echo $变量名、echo ${变量名}

[root@server0 /]# a=rhel
[root@server0 /]# echo $a
[root@server0 /]# echo ${a}

[root@server0 /]# echo $a7

[root@server0 /]# echo ${a}7

环境变量
• 常见的环境变量
– USER(当前登陆的用户)
– RANDOM(储存一个随机数)

位置变量
• 在执行脚本时提供的命令行参数
– 表示为 $n,n为序号
– $1、$2、.. .. ${10}、${11}、.. ..

[root@server0 /]# vim /root/2.sh

#!/bin/bash
echo $1
echo $2
echo $3

[root@server0 /]# /root/2.sh hello tom harry

[root@server0 /]# vim /root/3.sh

#!/bin/bash
cat -n $1 | head -$2

[root@server0 /]# /root/3.sh /etc/passwd 3

预定义变量

$# 已加载的位置变量的个数
$* 所有位置变量的值
$? 程序退出后的状态值,0表示正常,其他值异常

[root@server0 ~]# cat /root/3.sh
#!/bin/bash
echo $1
echo $2
echo $#
echo $*

[root@server0 ~]# /root/3.sh haha xixi hehe lele

######################################################
常用的测试选项
• 检查文件状态
-e:存在为真
-d:存在且为目录才为真
-f:存在且为文件才为真
-r:存在且具备读取权限才为真
-w:存在且具备写入权限才为真
-x:存在且具备执行权限才为真

• 比较整数大小(带e字母的都有“等于”二字)
-gt:大于
-ge:大于等于
-eq:等于
-ne:不等于
-lt:小于
-le:小于等于

• 字符串比对
==:相等为真
!=:不相等为真

####################################################

if双分支处理

if [条件];then
命令序列xx
else
命令序列yy
fi

请书写脚本:
用户输入一个用户名,判断用户是否存在
如果存在 输出用户/etc/passwd相应一行
如果不存在 则创建该用户

[root@server0 ~]# vim /root/6.sh

read  -p  '请输入一个用户名:'    user
id  $user &> /dev/null
if  [  $? -eq 0 ];then
     grep $user /etc/passwd
 else
      useradd $user
      echo $user 创建成功
 fi 

[root@server0 ~]# /root/6.sh

     请书写脚本:
             计算机随机产生一个10以内的随机数
             用户随机输入一个10以内的随机数
             如果相等,则中奖了
             如果不相等,则谢谢回顾

[root@server0 ~]# vim /root/7.sh

#!/bin/bash
read -p '请输入一个10以内的随机数字:' num1
num2=$(echo $RANDOM % 10 | bc)
if [ $num1 -eq $num2 ];then
echo 恭喜您,中奖了
else
echo 恭喜您,谢谢回顾
echo 正确数字为$num2
fi

[root@server0 ~]# /root/7.sh

if多分支处理

if [条件1] ; then
命令序列xx
elif [条件2] ; then
命令序列yy
elif [条件3] ; then
命令序列aa
else
命令序列zz
fi

   请书写脚本:
       请用户输入积分.
           如果用户的积分大于等于90,输出 vip plus
           如果用户的积分大于等于80,输出 vip
           如果用户的积分大于等于70,输出 老司机
           如果用户的积分大于等于60,输出 新手
           以上均不满足,输出 仍需努力

[root@server0 ~]# vim /root/8.sh
#!/bin/bash
read -p '请用户输入积分:' num 
if [ $num -ge 90 ];then
echo VIP PLUS
elif [ $num -ge 80 ];then
echo VIP 
elif [ $num -ge 70 ];then
echo 老司机
elif [ $num -ge 60 ];then
echo 新手
else
echo 仍需努力
fi

##################################################

案例4:编写一个判断脚本
在 server0 上创建 /root/foo.sh 脚本
1)当运行/root/foo.sh redhat,输出为fedora
2)当运行/root/foo.sh fedora,输出为redhat
3)当没有任何参数或者参数不是 redhat 或者
fedora时,其错误输出产生以下信息: 
/root/foo.sh redhat|fedora

[root@server0 ~]# vim /root/foo.sh 
#!/bin/bash
if [ $# -eq 0 ];then
echo '/root/foo.sh redhat|fedora' >&2
exit 2
elif [ $1 == redhat ];then
echo fedora 
elif [ $1 == fedora ];then
echo redhat 
else
echo '/root/foo.sh redhat|fedora' >&2
exit 3
fi

[root@server0 ~]# /root/foo.sh
[root@server0 ~]# echo $?
[root@server0 ~]# /root/foo.sh 2> /opt/2.txt
[root@server0 ~]# cat /opt/2.txt

##################################################

for循环结构

循环作用:让计算机,反复执行重复性的操作

for 变量  in  值列表
 do
        执行的动作
 done

[root@server0 ~]# vim /root/10.sh
#!/bin/bash
for user in kenji natasha tom harry jack
do
useradd $user
echo $user 成功
done

[root@server0 ~]# /root/10.sh

#######################################################



     本文转自sweak_h 51CTO博客,原文链接:http://blog.51cto.com/13478354/2046914,如需转载请自行联系原作者




相关文章:

  • 7款拥有超酷设计灵感的动态网站设计
  • 这才叫电脑高手!
  • 必应搜索全球PK,只为证明自己
  • 关于glusterfs-3.3.1的两个bug
  • 老树新芽,在ES6下使用Express
  • 工作那些事儿(5)- 机会
  • ASP.NET中Html.Partial和Html.Action的一个区别
  • ffmpeg架构和解码流程分析
  • oracle维护表空间和数据文件
  • python *args 和**kwargs的用法
  • [C# 开发技巧]实现属于自己的截图工具
  • oracle日志管理
  • 关于git的一些想法
  • TCP协议详解(理论篇)
  • STM 32 IAP(对flash进行读写)
  • angular2开源库收集
  • idea + plantuml 画流程图
  • js中forEach回调同异步问题
  • React Transition Group -- Transition 组件
  • Vue.js-Day01
  • 关于字符编码你应该知道的事情
  • 和 || 运算
  • 前端_面试
  • 软件开发学习的5大技巧,你知道吗?
  • 山寨一个 Promise
  • 微信小程序实战练习(仿五洲到家微信版)
  • 一起参Ember.js讨论、问答社区。
  • 异常机制详解
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (4) PIVOT 和 UPIVOT 的使用
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (c语言)strcpy函数用法
  • (libusb) usb口自动刷新
  • (zt)最盛行的警世狂言(爆笑)
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (二)学习JVM —— 垃圾回收机制
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (学习日记)2024.01.09
  • (转载)hibernate缓存
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .NET NPOI导出Excel详解
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .NET值类型变量“活”在哪?
  • @Conditional注解详解
  • @Pointcut 使用
  • [].slice.call()将类数组转化为真正的数组
  • [Android开源]EasySharedPreferences:优雅的进行SharedPreferences数据存储操作
  • [Angular] 笔记 20:NgContent
  • [BZOJ5250][九省联考2018]秘密袭击(DP)
  • [C# WPF] DataGrid选中行或选中单元格的背景和字体颜色修改
  • [C++] Boost智能指针——boost::scoped_ptr(使用及原理分析)
  • [C++] 如何使用Visual Studio 2022 + QT6创建桌面应用