Linux 的shell脚本编程

shell脚本编程

程序:指令+数据

程序编辑风格:

            过程式:以指令为中心,数据服务于指令

            对象式:以数据为中心,指令服务于数据

shell程序:提供了编程能力,解释执行

计算机:运行二进制指令

编程语言:

低级:汇编语言

高级:编译:高级语言-->编译器-->目标代码

java,c#,c,c++

解释:高级语言-->解释器-->机器代码

shell,per,python

编程逻辑处理方式:

          顺序执行

          循环执行

          选择执行

shell编程:

          过程式,解释执行

     编程语言的基本结构

          数据存储,变量,数组

          表达式:a+b

          语句:if

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

首行shebang机制

               #!/bin/bash

               #!/usr/bin/python

               #!/usr/bin/perl

shell脚本用途有:

自动化常用命令

执行系统管理和故障排除

创建简单的应用程序

处理文本或文件

脚本 hello word 例子

#!/bin/bash

#autho:zczx

#Version:1.0

#Description:hello word

echo "hello,word"

:wq

chmod u+x hello.sh

/root/hello.sh

不建议在根目录PATH加入.

.bash_profile

bash -n f1  检查语法是不是完整

bash -x f1  调试,一条一条执行,发现出错会报错可以检查命令执行顺序

变量

变量的内容可以是更改的,内容可以存字符,存数值。不同的变量应用的范围不同,数据存储格式不同,参与的运算不同。

类型:字符

数值:整形,浮点型

尽量不要使用与系统指令相同的名字作为变量法则名字

1 不能使程序中的保留字

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

           3 驼峰法则,字母首个字母开头大写

                                    4 见名知义

大写

PATH

USER

PWD

OLDPWD

HISTSIZE

HISTFIlESIZE

HISTFILESIZE

SHELL

HOME

PS1

HISTTIMEFORMAT

UID

HISTFILE

bash

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

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

本地变量不能给子进程使用

zczx1=xxx  不能带空格

zczx1="xxx aaa bbb"   多个用‘‘ ""来引入

echo $zczx1

echo "$zczx1" 强引用,如果变量所引用的指令跟原本指令显示的一样输出。

unset zczx1  删除变量,释放变量。

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

export +变量 声明为环境变量

declare -x 声明为环境变量

declare -r 只读常量,不能修改,删除。只能退出脚本

readonly name 只读常量

a=xxx

b=yyy

echo ${a}b

xxxb  a是变量,b不是

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

都只针对当前终端使用

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

特殊变量:$?, $0, $*, [email protected], $#

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

$0: 命令本身

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

[email protected]: 传递给脚本的所有参数,每个参数为独立字符串

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

[email protected] $* 只在被双引号包起来的时候才会有差异

$*引用的参数都作为一个独立的整体 "a b c"

[email protected]引用的参数每个数都能分为独立的字符 a b c

bash中的算术运算

+,-,*,/,%取模(取余),**(乘方)

实现算术运算:

(1)let var =算术表达式

                  let $var*=5 

                  let $var=5 * var

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

              (3) var=[算术表达式]

              (4) var=$(expr arg1 arg2 arg3 ...)

              (5) declare –i var= 数值

              (6) echo ‘算术表达式’ | bc

treu | false

  1      0   

与:有0就为0.1与1为1.

或:有1就为1.0与0为0.

!1=0

!0=1

短路与 &&:第一个条件成立,就执行第二个条件。第一个条件不成立,将不执行。

短路或 ||:第一个条件成立,就不执行第二个条件,第一个条件不成立,才执行第二个条件。

异或:^

相同为假,不同为真。

聚集命令

有两种聚集命令的方法:

复合式:date; who | wc -l

命令会一个接一个地运行

  子shell:(date; who | wc -l ) >>/tmp/trace

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

 0 代表成功,1-255代表失败

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

echo $? 查询命令是否成功执行

ping -c1 -w1 10.0.1.0 &> /dev/null

 一次  一秒

当使用了(),里面所执行的内容等于新建了一个子shell运行。   

条件性

判断某需求是否满足,需要由测试机制来实现;

专用的测试表达式需要由测试命令辅助完成测试过程;

以便用在条件性执行中

若真,则返回0

   若假,则返回1

test

a=haha

b=haha

test $a = $b    [$a -eq $b ] -eq是判断数字的对比

[ $a = $b ]   字符的对比

[[ $a = $b ]]

[[$1]]可以查询变量里面是否有定义

bash的测试类型

数值测试:

        -gt:是否大于:

        -ge:是否大于等于:

        -eq:是否等于:

        -ne:是否不等于

        -lt:是否小于:

        -le:是否小于等于:

==:是否等于:

>:Ascill码是否大于Ascill码

<:Ascill码是否小于Ascill码

!=:是否不等于

=~:左侧字符串是否能够被右侧的字符串所匹配,要用[[]]

-z:字符串是否为空,空为真,不空为假。[[]]

-n:字符串是否不空,不空为真,空为假。[[]]

[[-n $a]] 看是不是非0

[[-z $a]] 看是不是为0

文件测试

[-a /etc/]  查看是否存在

存在性测试

-a FILE:同-e

-e FILE: 文件存在性测试,存在为真,否则为假;

存在性及类别测试

-b FILE:是否存在且为块设备文件;

-c FILE:是否存在且为字符设备文件;

-d FILE:是否存在且为目录文件;

-f FILE:是否存在且为普通文件;

-h FILE 或-L FILE:存在且为符号链接文件;

-p FILE:是否存在且为命名管道文件;

-S FILE:是否存在且为套接字文件;

 文件权限测试:

-r FILE:是否存在且可读

-w FILE: 是否存在且可写

-x FILE: 是否存在且可执行

文件特殊权限测试:

-g FILE:是否存在且拥有sgid权限;

-u FILE:是否存在且拥有suid权限;

-k FILE:是否存在且拥有sticky权限;

文件大小测试:

-s FILE: 是否存在且非空;

-o 或者

[[ -r /tmp/file1 ]] -a [[ -w /tmp/file1]] && echo ‘用户对文件可读‘ || echo ‘用户对文件不可读‘

编写脚本/root/bin/systeminfo.sh,显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小。

编写脚本/root/bin/backup.sh,可实现每日将/etc/目录备份到/root/etcYYYY-mm-dd中

编写脚本/root/bin/disk.sh,显示当前硬盘分区中空间利用率最大的值

编写脚本/root/bin/links.sh,显示正连接本主机的每个远程主机的IPv4地址和连接数,并按连接数从大到小排序

写一个脚本/root/bin/sumid.sh,计算/etc/passwd文件中的第10个用户和第20用户的ID之和

写一个脚本/root/bin/sumspace.sh,传递两个文件路径作为参数给脚本,计算这两个文件中所有空白行之和

写一个脚本/root/bin/sumfile.sh,统计/etc, /var, /usr目录中共有多少个一级子目录和文件

写一个脚本/root/bin/argsnum.sh,接受一个文件路径作为参数;如果参数个数小于1,则提示用户“至少应该给一个参数”,并立即退出;如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行数

写一个脚本/root/bin/hostping.sh,接受一个主机的IPv4地址做为参数,测试是否可连通。如果能ping通,则提示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问”

chmod -rw /tmp/file1,编写脚本/root/bin/per.sh,判断当前用户对/tmp/fiile1文件是否不可读且不可写

编写脚本/root/bin/nologin.sh和login.sh,实现禁止和充许普通用户登录系统。

写一个脚本/root/bin/hostping.sh,接受一个主机的IPv4地址做为参数,先判断是否合格IP,否,提示IP格式不合法并退出,是,测试是否可连通。如果能ping通,则提示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问”

计算1+2+3+...+100的值

计算从脚本第一参数A开始,到第二个参数B的所有数字的总和,判断B是否大于A,否提示错误并退出,是则计算之

时间: 2024-10-20 11:10:58

Linux 的shell脚本编程的相关文章

Linux系统shell脚本编程——生产实战案例

Linux系统shell脚本编程--生产实战案例     在日常的生产环境中,可能会遇到需要批量检查内网目前在线的主机IP地址有哪些,还可能需要检查这些在线的主机哪些端口是开放状态,因此依靠手工来检查是可以实现,但比较费时费力,所以需要结合shell脚本来实现批量检查的功能,那么今天就来做个小小的实验. 1.开发脚本前准备 一般大家都知道,测试主机是否在线,常用的命令无非就是ping.nmap,因此,首先找一个地址来测试下ping命令的效果 [[email protected] scripts]

Linux之Shell脚本编程(一)

什么是Shell Shell是命令解释器(command interpreter),是Unix操作系统的用户接口,程序从用户接口得到输入信息,shell将用户程序及其输入翻译成操作系统内核(kernel)能够识别的指令,并且操作系统内核执行完将返回的输出通过shell再呈现给用户,下图所示用户.shell和操作系统的关系: Shell也是一门编程语言,即shell脚本,shell是解释执行的脚本语言,可直接调用linux命令. .java -> .class 一个系统可以存在多个shell,可以

Linux系统Shell脚本编程

1. shell脚本概念:C语言编写的.命令解释器.编程语言. 是用户使用linux的桥梁. shell脚本语言非常擅长处理文本类型的数据. 2. shell脚本作用:自动化管理.监控管理.日志数据处理.自动数据备份. 3. shell脚本中的成分:注释.命令.shell变量.结构控制语句. 以行为单位  一行一行依次执行. (在shell脚本中可以出现任何在交互方式下可以使用的命令.) 4. 调用shell脚本的两种方式: (1)sh 脚本文件名 (2)./脚本文件名(需要有执行权限) 当执行

linux下shell脚本编程1

1. shell脚本是什么 它是一种脚本语言,并非编程语言. 可以使用一些逻辑判断.循环等语法. 可以自定义子函数,是系统命令的集合. shell脚本可以实现自动化运维,大大增加我们的工作效率. 2.shell脚本结构以及执行方法 开头行指定bash路径: #! /bin/bash 以#开头的行作为解释说明 #注释自己的脚本内容,方便自己查阅:utf8字符集,支持中文: 脚本的名字以.sh结尾,用于区分这是一个shell脚本 执行脚本方式有两种: chmod a+x 1.sh    添加x执行权

linux下shell脚本编程2

1. if 判断一些特殊用法 if [ -z $a ]  这个表示当变量a的值为空时会怎么样 if [ ! -e file ]; then 表示文件不存在时会怎么样 if (($a<1)); then -等同于 if [ $a -lt 1 ]; then- [ ] 中不能使用<,>,==,!=,>=,<=这样的符号 $3不存在,所以n为空:判断是否为空: [[email protected] ~]# n=`wc -l /etc/passwd|awk '{print $3}'`

linux系列 : shell 脚本编程

文件系统 1.文件系统分区结构分为inode组以及data域 2.linux文件中分为目录以及二进制文件 3.目录下存放着目录项,目录项记载着文件名以及indexID,每个indexID对应着inode组中的一个元数据结构体 4.元数据结构体中存放着权限,类型,大小,指针等数据,通过指针可以找到二进制文件位置 ls : list文件信息 ls -a 列出所有文件 -l 详细信息 -i 列出indexID diff : different两个文件的差异 diff test.java  testCo

Linux中的shell脚本编程——数组 ,高级字符串操作 ,高级变量 ,配置用户环境

概述: 概述: 本章节将讲述Linux中shell脚本编程的数组,高级字符串处理,高级变量和配置用户的环境. 一.函数和位置参数扩展 1.shift 命令实现在位置参数中的跳跃,会把最左边的参数挤掉     2.匿名函数的使用 第一篇:数组 一.数组的定义: 1.变量:存储单个元素的内存空间 2.数组:存储多个元素的连续的内存空间,相当于多个变量的集合. 3.数组名和索引 索引:编号从0开始,属于数值索引 注意:索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引,bash4.0版本之后开

Linux中的shell脚本编程——基础篇

概述: shell脚本在Linux系统管理员的运维工作中非常重要.shell脚本能够帮助我们很方便的管理服务器,因为我们可以指定一个任务计划,定时的去执行某一个脚本以满足我们的需求.本篇将从编程基础.脚本基本格式.变量.运算.条件测试这几个方面详细介绍shell脚本编程的基础内容,也是我们必须要掌握熟练的内容. 一.编程环境 1.程序:指令+数据 程序编程的风格有两种: 过程式:以指令为中心,数据服务与指令 对象式:以数据为中心,指令服务于数据 2.程序的执行方式: □计算机:只能识别二进制文件

Linux Shell脚本编程学习笔记和实战

http://www.1987.name/141.html shell基础 终端打印.算术运算.常用变量 Linux下搜索指定目录下特定字符串并高亮显示匹配关键词 从键盘或文件中获取标准输入 [read命令] 文件的描述符和重定向 数组.关联数组和别名使用 函数的定义.执行.传参和递归函数 条件测试操作与流程控制语句 获取时间日期格式和延时 [date.sleep命令] 内部字段分隔符IFS和脚本的调试DEBUG 显示.读取或拼接文件内容 [cat命令] 文件查找与打印文件列表 [find命令]