Linxu Shell编程

Shell 编程概述

  • Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口
    它接收用户输入的命令并把它送入内核去执行。实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。不仅如此,Shell有自己的编程语言用于对命令的编辑,它允许用户编写由shell命令组成的程序。Shell编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,用这种编程语言编写的Shell程序与其他应用程序具有同样的效果。

  • Shell最主要的功用都是解译使用者在命令列提示符号下输入的指令
    Shell 的另一个重要功用是提供个人化的使用者环境,这通常在 shell 的初始化档案中完成(.profile、.login、.cshrc、.tcshrc 等等)。这些档案包括了设定终端机键盘和定义窗口的特征;设定变量,定义搜寻路径、权限、提示符号和终端机类型;以及设定特殊应用程序所需要的变量,例如窗口、文字处理程序、及程序语言的链接库。Shell 也能当解译性的程序语言(interpreted programing language)。Shell 程序,通常叫做命令文件,它由列在档案内的命令所构成。此程序在编辑器中编辑(虽然也可以直接在命令列下写作程序,online scripting),由 UNIX 命令和基本的程序结构,例如变量的指定、测试条件、和循环所构成。

Shell执行步骤

Shell的编写流程:用编辑器编写Shell脚本文件;赋予文件可执行权限;执行及调试

Shell的编写使用的编辑器

  • 使用UNIX提供的gedit编辑器
    gedit是一个GNOME桌面环境下兼容UTF-8的文本编辑器。它使用GTK+编写而成,因此它十分的简单易用,有良好的语法高亮,对中文支持很好,支持包括gb2312、gbk在内的多种字符编码。gedit是一个自由软件。

1、启动:
从菜单启动:应用程序——>附件——>文本编辑器
从命令行执行以下命令: gedit

2、窗口说明:
菜单栏:包含您在 gedit 中处理文件所需的所有命令。
工具栏:包含您可以从菜单栏访问的命令的子集。
显示区域:该区域包含您正在编辑的文件的文本。
输出窗口:显示 Shell 命令插件和比较文件插件返回的输出。
状态栏:显示关于当前 gedit 活动的信息和关于菜单项的上下文信息。

  • 使用vi编辑器

vi 编辑器是 Linux/UNIX 环境下经典的编辑器。Linux vi 命令非常强大,熟练地使用它可以高效的编辑代码,配置系统文件等,是程序员和运维人员必须掌握的技能。
vi编辑器的基本使用方法及语法:传送门

需要注意的是Sheel文件的后缀都是.sh,类似于C语言的.c文件

赋予文件可执行权限

Linux/Unix 的文件调用权限分为三级 : 文件拥有者、群组、其他。利用 chmod 可以改变文件或目录的读、写、执行的允许权。

  • 执行格式: chmod [-R] mode name

参数说明

  • [-R]为递归处理,将指定目录下所有文件及子目录一并处理

  • mode为权限设定字串,格式如下 :

[ugoa...][[+-=][rwxX]...][,...]

其中:

  • u 表示该文件的拥有者,g 表示与该文件的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。

  • +表示增加权限、- 表示取消权限、= 表示唯一设定权限。

  • r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该文件是个子目录或者该文件已经被设定过为可执行。

其他参数说明:

  • c : 若该文件权限确实已经更改,才显示其更改动作
  • f : 若该文件权限无法被更改也不要显示错误讯息
  • v : 显示权限变更的详细资料
  • R : 对目前目录下的所有文件与子目录进行相同的权限变更(即以递回的方式逐个变更)
  • help : 显示辅助说明
    实例
  • 将文件 file1.txt 设为所有人皆可读取 :
chmod ugo+r file1.txt

或者

chmod a+r file1.txt

-将文件 file1.txt 与 file2.txt 设为该文件拥有者,与其所属同一个群体者可写入,但其他以外的人则不可写入 :

chmod ug+w,o-w file1.txt file2.txt
  • 将目前目录下的所有文件与子目录皆设为任何人可读取 :
chmod -R a+r *

执行及调试

shell程序执行方式

假设有一个脚本script.sh 使用BASH shell
1.使用./script.sh
2.使用bash script.sh 或者sh script.sh
3.使用. script.sh
注意!.是一个命令,后面要有空格(source命令也称为“点命令”,也就是一个点符号(.),是bash的内部命令)
以上三种执行方式的具体区别:传送门

Shell调试

Shell调试的具体方法: 传送门

Shell基本语法

Shell程序开头

在Shell程序的开头要加上#!/bin/bash
意思是指此脚本使用/bin/bash来解释执行就是用bin目录下的bash来进行解析
其中,#!是一个特殊的表示符,其后,跟着解释此脚本的shell路径。
当然,bash只是shell的一种,还有很多其它shell,如:sh,csh,ksh,tcsh…

Shell常用关键字

1、echo:打印文字到屏幕
2、exec:执行另一个Shell脚本
3、read:读标准输入
4、expr:对整数型变量进行算术运算
5、test:用于测试变量是否相等、 是否为空、文件类型等
6、exit:退出

需要特别注意的是,在Shell中的比较字符跟我们经常接触的C语言,Java有些不一样的地方,如下所示
-eq 等于
-ne 不等于
-gt 大于
-lt 小于
-le 小于等于
-ge 大于等于
-z 空串
= 两个字符相等
!= 两个字符不等
-n 非空串

意思就是在Shell中用 -gt 表示大于关系,用 -lt 表示小于关系,而不能直接用>,<号表示

Shell注释

在Shell中用符号#进行注释

Shell变量

Shell变量分为用户自定义、预定义和环境变量三种。一般以一下方式定义变量:“变量名=变量值”
例如:

INPUT=5

需要注意的是 :
变量名一般大写,且等号两边不能空格,变量调用使用“$变量名”实现

1、用户自定义变量
这种变量只支持字符串类型,不支持其他字符、浮点等类型,常见有以下3个前缀:
(1)unset:删除变量
(2)readonly:标记只读变量
(3)export:指定全局变量

2、预定义变量
预定义变量用来获取命令行的输入,常用的有:
(1)$0 :脚本文件名
(2) 1 − 9 : 第 1 − 9 个 命 令 行 参 数 名 ( 3 ) 1-9 :第 1-9 个命令行参数名 (3) 19193# :命令行参数个数
(4) @ : 所 有 命 令 行 参 数 ( 5 ) @ :所有命令行参数 (5) @5* :所有命令行参数
(6) ? : 前 一 个 命 令 的 退 出 状 态 , 可 用 于 获 取 函 数 返 回 值 ( 7 ) ? :前一个命令的退出状态,可用于获取函数返回值 (7) ?退7$ :执行的进程 ID
例如:实现编写shell脚本 ex2.sh,能将命令行参数相加并输出,如:
./ex2.sh 1 3 8输出结果为12
代码如下:

#!/bin/bash

sum=0
for i in $@
do
     sum=$[$sum+$i]
done

echo "sum = $sum"

运行结果:
Linxu Shell编程_第1张图片

3、环境变量
环境变量默认存在,一般包含下面几个:
(1)HOME:用户主目录
(2)PATH:系统环境变量 PATH
(3)TERM:当前终端
(4)UID:当前用户 ID
(5)PWD:当前工作目录,绝对路径

Sheel运算

Shell比较常见的运算包括以下4中,功能都是将m+1:

  1. m=$[ m + 1 ]
  2. m=expr $m + 1 `用``字符包括起来 ,需要注意的是加号两边要有空格
  3. let m=m+1
  4. m=$(( m + 1 ))

Shell语句

if语句

Shell编程中if语句与C语言类似,用于程序分支,也可构成分支嵌套形式,但是在Shell中的if语句的语法和C语言有所区别,在if 和 else if后要加上then,在if语句结尾必须要加上fi作为结束的标志
例如:

INPUT=10
if test $INPUT -eq 10
then
  echo "hello"
  else
    echo "Shell"
    fi

case语句

case语句相当于C语言中的switch,所以当然case语句也可以用if语句来实现,case语句格式较复杂,请注意使用细节
例如:

#!/bin/bash
read NAME                      #类似于scanf
case $NAME in
     "Linux")
     echo "Linux"
     ;;
      "hello")
     echo "hello"
     ;;
        *)                     #跟switch中的default类似
     echo "other"
     ;;
     esac             			#case语句结束标志

for循环

Shell编程中for语句与C语言类似,用于程序循环,也可构成循环嵌套形

for循环语句格式
Linxu Shell编程_第2张图片
Shell中的for循环要在执行语句的前面加上do,在执行语句后加上done
另外在Shell中break,continue的用法和在C语言中的用法一致

Shell数组

和其他编程语言一样,Shell 也支持数组。数组(Array)是若干数据的集合,其中的每一份数据都称为元素(Element)。
Shell 并且没有限制数组的大小,理论上可以存放无限量的数据。和 C++、Java、C# 等类似,Shell 数组元素的下标也是从 0 开始计数。
获取数组中的元素要使用下标[ ],下标可以是一个整数,也可以是一个结果为整数的表达式;当然,下标必须大于等于 0。
遗憾的是,常用的 Bash Shell 只支持一维数组,不支持多维数组。

Shell数组的具体定义和使用方法:传送门

用vi编辑器编写第一个Shell程序

  • 首先在Linux终端用vi生成.sh文件
vi  hello.sh
  • 输出hello Shell!
#!/bin/bash
echo "hello Shell!"
  • 赋予hello.sh可执行权限
chmod a+x hello.sh
  • 运行hello.sh
./hello.sh           #注意./后面和文件名之间不能有空格
  • 运行结果



文章参考来源

  • Linux chmod命令
  • shell入门必备基础之vi(vim)编辑器的使用
  • shell程序执行方式
  • Linux Shell 程序调试
  • Shell数组

你可能感兴趣的:(Linux编程)