shell

               Shell 脚本编程 -----编程范围与变量

一.脚本文件名的结尾必须加.sh

(1) 写脚本内容是开头必须加 #!/bin/bash

(2) 执行脚本命令:bash yunjisuan.sh sh yunjisuan.sh (也可以 以绝对路径的方式执行脚本 /root/xxx/yunjisuan.sh   但前提必须点给yunjisuan.sh 脚本加x执行全限 chmod +x yunjisuan.sh)

(3) 我们在写脚本的时候里面的命令行必须都是免交户的列如下图

 

二.Shell脚本的意义:

  Shell脚本的意义在于,通过命令行解析的方式帮我们自动去执行我们设定好的命令代码。

  假如我们把脚本挂到定时任务里,那就是自动在某个没有人的时间里自动执行脚本里的命令代码(也就是自动化脚本)

  脚本虽然能帮我们自动执行,但是脚本的局限性是很大的,假如我们要去/根下清空某个目录,但没有这个目录,脚本也去执行,但它执行的是在根/下执行这条命令 /]#rm -rf * 就完了! 因此我们在写脚本 指定目标路径前加个命令test来判断有没有这个文件或目录(test -d 是判断目录  test -f 是判断文件)

列如下图:

 

 

 我们也可以用[  ] 这个符号进行条件测试真jia

列如下图

 

[  ] 括号里面两边必须加空格判断数值时==号两边也要加空格,(这条命令的意思时xx的值对就数出0 错就输出1-gt grep than)是大于  -lt  (less than)是小于  ==两个等于是判断 eq是等于   !=就是取反不等于  -ge 是大于等于  -le是小于等于

 

       -z 判断字符串是否是空

 

逻辑或只能出现一个在最右边,有了逻辑或后边就不能有逻辑与了,luo

以上总结

 

脚本交户形式

(1)read “ ” 交户 模式 让用户输入

列如下图:

 

 

创建用户脚本

#!/bin/bash

User="yunjisuan"

Passwd="123456"

read -p "请输入用户名" user

read -p "请输入密码" passwd

[ $User -eq $user ] && echo "YOU ARE RIGHT" || echo YOU ARE WRONG

[ $Passwd -eq $user ] && echo "YOU ARE RIGHT" || echo "YOU ARE WRONG"

 

  read -p”文本提示” num变量  让用户输入内容复值到num的变量里

三.基本条件逻辑语:

   if [ 如果什么 ]

   then 那么,干啥

   elif 否则如果

   else 否则

   exit 强行终止

   if结束

  列如:

 

 

yum 仓库脚本

(1)移除光盘,再挂载

(2)判断光盘挂载

(3)挂载本地yum仓库脚本

(4)判断一级目录、二级目录是否存在

配置文件手动生成,避免之前被修改过(重定向或echo -e

 

 

配置文件手动生成

用脚本手动生成配置文件,一般用重定向

输入重定向通过FOF标识(任意定义,但成对出现),将FOF之间的内容输入重定向到catcat再输出重定向给/etc/yum.repos.d/yum/repo文件

shell脚本循环语句

for 循环语句

  格式: for 变量名  in  取值列表

         do

循环体

done 结束

列如:

 

循环取值的过程:in后边是取值范围,in将后边的值一个一个负值给变量i,负值一次i就进入dodoen之间的循环体循环一次,循环完毕自动返回,让i去取下一个值,直到没有了整个结束。

 也可以已命令方式,但命令必须用反引号括起来优先执行,in在一个一个的去取值......在交给i 输出

 

  | xargs 是将root下的目录文件以横排显示也是将分行符 转换为空格

(1)变种的for 循环

   1)格式:  for ((i=0;i<10;i++))

do 双括号是支持c++语言i=0i

echo $i       初始变量=0i<10是条件范围,i++就是

doen                        i=i+1 没次输出完都执行i++直到超出

                           条件范围跳出循环,不加i<10条件就会无                     限输出

 

格式二: h=0

         for  i in {1..10}

         do

               echo $h

   let h++

         done

自动找出本网段内存活的IP地址的脚本

写法:

一般都用ping -c 1  是只ping一次

 

while脚本循环

(1) 格式:

while 条件

do

循环体(指令)

done

read -p “用户输入:” i   (也可以写i=0

while [ $i -lt 10 ]     是条件为真继续循环条件为假跳出循环

do                 while : 不写条件就是永招 无限循环

echo $i

let i++         let 是让shell 支持 i++

done

  while循环主要是弥补for循环没有无限循环的格式用的

Case语句

用途:菜单;启动脚本

case语句适合变量的值少,且为固定的数字或字符串集合。 系统服务启动脚本传参的判断多用case语句

格式:

case "字符串变量" in

    1

        指令1

        ;;

    2

        指令2

        ;;

    *)

        指令

esac

服务脚本框架

  vim case.sh  

#!/bin/bash

. /etc/init.d/functions

case $1 in

        start)

                action "服务开始启动"   /bin/true

                ;;

        stop)

                action "服务准备停止"   /bin/false

                ;;

        restart)

                action "服务准备停止"   /bin/true

                action "服务来时启动"   /bin/true

                ;;

        *)

                echo "请输入正确参数"

                ;;

esac

在当前脚本引用函数库(绝对路径)

Function对应的是action “ ” 路径

/bin/true 表示一个标志

 

 

设置脚本配置启动级别

(1)为脚本设置启动级别

将脚本cp/etc/init.d/下,vim编辑/etc/init.d/cash.sh脚本

在脚本的第二行加# chkconfig: 35 90 10

 

(2)chkconfig中添加脚本

# chkconfig --add case.sh

# chkconfig --list case.sh

(3)设置关闭cash.sh

# chkconfig case.sh off

 

shell 函数

不论什么编程语言,基本只有三种编程方法

1. 面向过程

2. 面向对象

3. 函数式编程

 这三种模式,并不是语法,而是我们如何去编写代码的方法论。

shell这种语言里,只能支持面向过程这种编程方法。

过程就是按照一定顺序进行代码的编写,不能跳步这就是过程。

shell中,function表示函数(functionreturn可以不写)

格式:

function 函数名(){

命令序列

[return x]

}

函数名

函数体只有被调用时才会启动,若要重复启动该函数,只需将函数名重复制一遍,复制几遍就启动几次

 

 

 

 

源码编译示意

 

四种循环控制语句break  contiue  exit  rotun

exit 强行终止

 

 

break达到条件时跳出当前循环,但不终止脚本,会进入当前循环以外的或下一个循环(break只跳出当前离它最近的内侧循环)

 

 

continue 终止当前本次循环进入下次循环,直到循环完当前循环的条件,在跳出循环,当没有条件的时候会在当前无限循环

 

 

rotun是用在函数里的作为函数的返回值,用于判断函数执行是否正确。和exit一样,如果函数里有循环碰到它也会跳出整个函数体,会从哪调用的函数就从哪继续

 

 

原文地址:https://www.cnblogs.com/yixin666/p/9899159.html