shell脚本1

shell脚本基础

shell脚本:

包含一些命令或声明,并符合一定格式的文本文件

格式要求:首行shebang机制

#!/bin/bash

#!/usr/bin/python

#!/usr/bin/perl

shell脚本的用途有:

自动化常用命令

执行系统管理和故障排除

创建简单的应用程序

处理文本或文件

创建shell脚本

第一步:使用文本编辑器来创建文本文件

第一行必须包括shell声明序列:#!

#!/bin/bash

添加注释

注释以#开头

第二步:运行脚本

给予执行权限,在命令行上指定脚本的绝对或相对路径

直接运行解释器,将脚本作为解释器程序的参数运行

 shell脚本1

shell脚本1 

直接执行脚本权限会拒绝,要给脚本加个X权限

脚本规范

脚本代码开头约定

1、第一行一般为调用使用的语言

2、程序名,避免更改文件名为无法找到正确的文件

3、版本号

4、更改后的时间

5、作者相关信息

6、该程序的作用,及注意事项

7、最后是各版本的更新简要说明

示例:

#!/bin/bash

# ——————————————

# Filename: hello.sh

# Revision: 1.1

# Date: 2017/06/01

# Author: wang

# Email: wang@gmail.com

# Website: www.magedu.com

# Description: This is the first script

# ——————————————

# Copyright: 2017 wang

# License: GPL

echo “hello world”

脚本调试

bash -n f1.sh 检测脚本中语法的错误

shell脚本1

设置变量b,故意将$后的小括号打成中文的括号,然后检测,就会报错,提示你括号打错了

bash -x f1.sh  调试执行

shell脚本1

 shell脚本1

每一步都显示出来

变量

变量:命名的内存空间

     数据存储方式:

             字符:

              数值:整型,浮点型(有小数)

变量:变量类型

        作用:

               1、数据存储格式

               2、参与的运算

                3、表示的数据范围

类型:

         字符

         数值:整型、浮点型

 

强类型:变量不经过强制转换,它永远是这个数据类型,不允许隐式的类型转换。一般定义变量时必须指定类型、参与运算必须符合类型要求;调用未声明变量会产生错误

java,c#

 

弱类型:语言的运行时会隐式做数据类型转换。无须指定类型,默认均为字符型;参与运算会自动进行隐式类型转换;变量无须事先定义可直接调用

如:bash 不支持浮点数,php

 

变量命名法则:

1、不能使程序中的保留字:例如if, for

2、只能使用数字、字母及下划线,且不能以数字开头

3、见名知义

4、统一命名规则:驼峰命名法

bash中变量的种类

根据变量的生效范围等标准:

1.本地变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效

shell脚本1

设置个本地变量d=444,当前shell是一级(echo $SHLVL查看当前shell是几级shell,可以引用变量d。进入2shell,再引用变量d,不会显示吃结果,  说明变量d已经不存在了,进入3shell,还是一样。当再次返回一级shell,又能引用变量d了,所以本地变量只对当前shell有效,对当前shell的子shell及以下的shell都无效。

变量赋值:name=‘value’

可以使用引用value:

       (1) 可以是直接字串; name=“root”

       (2) 变量引用:name=”$USER”

       (3) 命令引用:name=`COMMAND`(命令用反单引号引起来) name=$(COMMAND)

shell脚本1

变量引用:${name} $name

       “”:弱引用,其中的变量引用会被替换为变量值

       ”:强引用,其中的变量引用不会被替换为变量值,而保持原字符串

shell脚本1

 

显示已定义的所有变量:set(既可以查本地变量又能查环境变量)

删除变量:unset name(在脚本中设置了变量,用完了之后最好把变量删除掉)

shell脚本1

 

2.环境变量:生效范围为当前shell进程及其子进程

shell脚本1

设置环境变量a,当前是一级shell,能引用环境变量a,进入2级shell,依旧能引用,3级也是如此,所以环境变量对当前shell及其子shell或以下都有效。

变量声明、赋值:

             export name=VALUE

             declare -x name=VALUE

变量引用:$name, ${name}

显示所有环境变量:(只显示环境变量)

       env

       printenv

       export

       declare -x

删除变量:(在脚本中设置了变量,用完了之后最好把变量删除掉)

    unset name

bash内建的环境变量:

        PATH

        SHELL

         USER

         UID

         HOME

         PWD

         SHLVL

         LANG

         MAIL

         HOSTNAME

         HISTSIZE

          —

source

shell脚本1

 shell脚本1

写一个脚本66.sh,内容为设置一个本地变量f=1111,然后把本地变量f显示出来(脚本中变量f是在2级shell设置的),写完脚本后,在当前shell也设置一个本地变量f=magedu,然后把脚本66.sh加上权限,用路径执行脚本,结果为1111,在当前shell显示变量f结果为magedu,再用source来执行脚本,结果还为1111,但再在当前shell显示变量f结果为1111,所以可以得出结论:source在当前shell执行脚本后,脚本中设置的变量(在当前shell的子shell中设置的)会覆盖当前shell相同的变量。用source执行脚本是极为不安全的,因为会破坏掉当前shell的变量。

.也就是source

 

3.局部变量:生效范围为当前shell进程中某代码片断(通常指函数)

4.位置变量:$1, $2, …来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数

   位置变量:在脚本代码中调用通过命令行传递给脚本的参数

   $1, $2, …:对应第1、第2等参数,shift [n]换位置

shell脚本1

这的$10$11不是整体,是$10$11

shell脚本1

 所以$10显示的是第一个参数和0$11显示的是第一个参数和1        

shell脚本1

 1011用大括号括起来,使其变成一个整体 ,这样就能使${10}显示第10个参数,${11}显示第11个参数。       

shell脚本1

          $0: 命令本身

shell脚本1

         $*: 传递给脚本的所有参数,全部参数合为一个字符串

shell脚本1

         $@: 传递给脚本的所有参数,每个参数为独立字符串

shell脚本1

          $#: 传递给脚本的参数的个数

shell脚本1

          $@ $* 只在被双引号包起来的时候才会有差异

   set —清空所有位置变量  

5.特殊变量:$?, $0, $*, $@, $#,$$

6.只读变量: 只能声明,但不能修改和删除

   声明只读变量:   

        readonly varname

        declare -r varname

   查看所有的只读变量

        readonly -p

shell脚本1

(只读变量不能修改和删除)reboot重启后只读变量会自动消失。

 

退出状态

进程使用退出状态来报告成功或失败

0 代表成功,1255代表失败

$? 变量保存最近的命令退出状态

例如:

ping-c1-W1 hostdown&>/dev/null

echo $?

shell脚本1

 

退出状态码

bash自定义退出状态码

exit [n]:自定义退出状态码

注意:脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态取决于exit命令后面的数字

shell脚本1

注意:如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码

shell脚本1

 shell脚本1

 shell脚本1

 

转译:

\ 完全转译

“”部分转译 (\ ` ! $ 不能转译)

shell脚本1

完全转译

 

引用变量时

$varname

“$varname”

${varname}

当变量值当中包含换行符,如果希望引用出的值同样包含换行符,只能使用“$varname”

shell脚本1

$()${}的区别:当引用一些命令的结果时用$(),当引用的是设置变量的名字时用${},来划分界限。

 

算术运算

bash中的算术运算:help let

+, -, *, /, %取模(取余), **(乘方)在bc当中乘方是^

实现算术运算:

(1) let var=算术表达式

shell脚本1

 shell脚本1

(2) var=$[算术表达式]

shell脚本1

(3) var=$((算术表达式))

shell脚本1

(4) var=$(expr arg1 arg2 arg3 …)   乘法时要转译* ,即\*

shell脚本1

(5) declare –i var = 数值

shell脚本1

(6) echo ‘算术表达式’ | bc(这种算术表达乘方是^)

shell脚本1

 

bash有内建的随机数生成器:$RANDOM(0-32767)

echo $[$RANDOM%50] 0-49之间随机数

echo $[$RANDOM%72+1]取个随机数071再加1(就是172

shell脚本1

赋值

增强型赋值:

+=, -=, *=, /=, %=

let varOPERvalue

例如:let count+=3

自加3后自赋值

自增,自减:

    let var+=1

    let var++

    let var-=1

    let var–

 

原创文章,作者:fuming,如若转载,请注明出处:http://www.178linux.com/83748

(0)
上一篇 2017-08-05 11:02
下一篇 2017-08-05 11:57

相关推荐

  • 磁盘配额

    磁盘配额 1 启用磁盘配额 首先创建新的分区 /dev/sd5,并创建文件系统。 [root@local ~]# mkfs.ext4 /dev/sda5 由于xfs 不磁盘配额能成功,这里使用ext4. 然后把/dev/sda5分区挂载到 /home [root@local ~]# mount /dev/sda5 /home [root@local ~]# …

    Linux干货 2017-05-02
  • 函数定义、使用

        1、函数介绍         函数function是由若干条shell命令组成的语句块,实现代码重用和模块化编程。           &nb…

    Linux干货 2016-08-22
  • 胡说八道计算机网络之什么是网络(一)?

    胡说八道计算机网络之什么是网络(一) 什么是网络? 网络通信的实现:tcp/ip协议 使用Wireshark抓包分析tcp/ip协议栈 什么是网络?      所谓网络,就是通过一定的形式连接起来的物体,物体与物体之间可以实现通信。     比如这样的,就称为计算机网络。它可以实现计算机之…

    Linux干货 2017-05-01
  • GOPS 2016全球运维大会 上海站

    GOPS 2016全球运维大会 • 上海站已经圆满落幕,最新GOPS大会推荐:GOPS2017全球运维大会 • 深圳站 基本信息: GOPS2017全球运维大会 • 深圳站 时间:2017-04-21 08:00:00 至 2017-04-22 18:00:00结束 地点:深圳    会议规模:5000人 会议详情:http://www….

    系统运维 2016-09-07
  • 逻辑卷管理器LVM使用简介

    逻辑卷管理器(LVM) 原理图如下: 先准备一个分区/dev/sdb1,注意也存在ID问题,选择8e。 1.先把磁盘变成物理卷 在做这步前可以先看下系统中存在的物理卷,没有就什么都不会显示。 把我们准备好的两个磁盘变成物理卷,注意我那使用旧的格式化的分区磁盘,可能会出现上面有文件系统或者卷标类型的问题,所以尽量使用新磁盘做实验。如果出现这种情况,可以使用dd…

    2017-05-02
  • linux第一周学习

      一周过去了,这周学习并新认识了不少内容。由一开始的萌逼状态,逐步清晰的认识了不少内容。相信我会越来越好的。 文件与目录 touch touch newfile         创建空文件touch oldfile          更新文件的三个…

    Linux干货 2017-09-02