Linux Shell编程笔记

一,前言

摘抄自《Shell脚本学习指南中文PDF版》

Shell脚本最常用于系统管理工作,或者用于结合现有的程序以完成小型的、特定的工作。一旦你找出完成工作的方法,可以把用到的命令串在一起,放在一个独立的程序或script中。脚本编程语言与编译型语言区别在于脚本编程语言通常是解释型的,这类程序的执行,是有解释器读入程序代码,而编译型语言则是编译执行,将源代码转换成目标代码,便可以直接执行,使用脚本语言的好处是,它们多半运行在比编译型语言还高的层级,能够轻易处理文件与目录之类的对象,缺点是执行效率通常不如编译型语言。

二,初识Shell编程

Shell的基本概念

2.1 shell命令

一个简单的Shell命令,如“mkdir dir1 dir2 dir3 dir4” 由命令本身、参数和空格构成

复杂的Shell命令是由简单的命令以多种方式组织在一起的,例如,管道把一个命令的输出传递给另外一个命令作为输入、循环或条件结构,如:

cat book_to_read | grep "english" > mybook

该命令通过管道把cat命令的输出送给grep作为输入。grep命令在输入字符串中查找子字符串english,通过重定向把所有包含字符串english的行写入到mybook文件中
下面附上一个简单的Shell脚本,建立hello文件,文件内容如下:

#!/bin/bash
#the simple case -hello world
echo Hello World

为了使当前文件有可执行的权限,输入以下命令:

sh hello
chmod u+x hello

运行脚本文件,如下图所示:
执行脚本文件

脚本内容解释:#!说明这个文件类型的,Linux 系统根据#!及该字符串后面的信息确定该文件的类型,在#!之后是一个路径名,这个路径名指定了一个解释脚本中命令的程序,“/bin/BASH”就表明该文件是一个BASH程序 ,需要由/bin下的BASH程序来解释运行。#表示注释,echo语句的功能就是把echo后面的字符串输出到标准输出中。

2.2 Shell语法

如果输入没有被注释掉,那么Shell将读取该输入并且把它分割成字(word)和操作符,然后引用规则来定义输入的每个字符的意义。

2.3 Shell扩展

Shell扩展在每个命令行被分割成记号(tokens)后运行。

2.4 重定向

在一个命令运行之前,它的输入和输出可能会重定向为使用一个由Shell解释的特殊符号。

2.5 Shell函数

Shell函数是一种具有特定功能的一系列语句(命令)的集合,像普通命令一样运行。事实上,BASH在运行脚本的时候,若发现一个函数的定义,则它将函数保留,并作为一条命令,在后面遇见该函数名时,便直接运行该函数,所以函数需要先定义,再调用。

2.6 Shell变量

Shell变量是一个存储值的实体,就是一个存储了名字的参数,引用变量用<nobr><span class="math" id="MathJax-Span-1" style="width: 1.95em; display: inline-block;"><span style="display: inline-block; position: relative; width: 1.522em; height: 0px; font-size: 127%;"><span style="position: absolute; clip: rect(1.405em, 1000em, 2.72em, -0.472em); top: -2.362em; left: 0em;"><span class="mrow" id="MathJax-Span-2"><span class="texatom" id="MathJax-Span-3"><span class="mrow" id="MathJax-Span-4"><span class="mo" id="MathJax-Span-5"><span style='font-family: STIXGeneral,"Arial Unicode MS",serif; font-size: 79%; font-style: normal; font-weight: normal;'>,</span></span></span></span><span class="texatom" id="MathJax-Span-6"><span class="mrow" id="MathJax-Span-7"><span class="mo" id="MathJax-Span-8"><span style='font-family: STIXGeneral,"Arial Unicode MS",serif; font-size: 79%; font-style: normal; font-weight: normal;'>如</span></span></span></span></span><span style="display: inline-block; width: 0px; height: 2.362em;"></span></span></span><span style="border-left: 0em solid; display: inline-block; overflow: hidden; width: 0px; height: 1.403em; vertical-align: -0.321em;"></span></span></nobr><script type="math/tex" id="MathJax-Element-1">,如</script>STR,但是更为标准的是${STR}。BASH中的变量可以不被定义直接使用的,所以也就没有类型之说,一个变量既可以被定义为字符串,也可以被再定义为整数。

2.7 Shell脚本

Shell脚本与Windows下的批处理类似,就是一堆命令的集合,方便一次性运行的程序文件。

三,判断和递归

3.1 判断的用法

判断的语法由if、elif、then、fi所构成,示例如下:

#!/bin/bash

if [ $1 -eq 1 ]; then
        echo "yes 1"
elif [ $1 -eq 2 ]; then
        echo "yes 2"
else
        echo "no"

fi

这是简单的判断决定输出,运行结果如下:
这里写图片描述

3.2 循环的用法

在Shell脚本中使用的循环有case、for、while和until,这里介绍for和while这两个循环

while语法


while [ 条件 ] ;
do
命令或动作
done

上面的中括号[]中的条件不能和括号连在一起,而必须加上空格。下面附上一个示例:

#!/bin/bash

echo "please input n to computer 1+2+....+n"
read -r n

x=1
sum=0
while [ $x -le $n ];
do
        sum=`expr $sum + $x`
        x=`expr $x + 1`
done
echo "sum=" $sum

在Shell脚本中,所有的变量都是文字形态,因此要作为数值使用,必须要加上expr变量,而且表达式必须加上反引号。在本示例中用read -r 读取输入变量n,-le表示数值的小于或等于。

for语法


for item in list
do
    命令或动作
done    

示例,判断当前目录下的所有对象是一般文件还是文件夹:

#!/bin/bash

for ff in *;
do
        if [ -f $ff ];then
                echo "$ff is a file"
        elif [ -d $ff ];then
                echo "$ff is a directory"
        else
                echo "$ff is not a file , not a directory"
        fi
done

资料来源《Linux指令与Shell编程编程范例速查手册》

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值