Shell脚本编程

Shell脚本编程

## 一、编程语言的分类
编程语言的分类,根据其分类标准的不同,也有不同种分法。
1. 编程语言根据其运行方式,大概分为两类:
(1) 编译运行:源代码 –> 编译器(编译) –> 程序文件
(2) 解释运行:源代码 –> 运行时启动解释器,由解释器边解释边运行

二者优劣比较:

运行方式 | 执行速度 | 变更灵活度
———— | ———— | ————–
编译运行 | 快 | 低
解释运行 | 慢 | 高
> 为了解决编译运行的灵活性问题,避免一个大程序修改少量代码要耗时数小时进行重新编译,很多项目中,都对代码进行分段编译。当需要修改局部代码时,只需重新编译其所属段即可完成重新编译动作,减少了编译的耗时,提高了使用效率。
2. 根据其编程过程中功能的实现是调用库还是调用外部的程序文件来分类:
(1) shell脚本编程:利用系统上的命令及程序编程组件进行编程;
(2) 完整编程:利用自身库或编程组件进行编程;

3. 根据编程模型进行分类:
(1) 面向过程式编程语言:以指令为中心,来组织代码,数据服务于指令;
其中包括:
顺序执行、选择执行、循环执行
(2) 面向对象式编程语言:以数据为中心,来组织代码,指令服务于数据;
这种编程语言,首先要有对象,然后将对象实例化出来,取名为类(class),再开发出针对类的一些处理方法,取名为方法(method),通过method去管理class。例如:Java、C++、Python

## 二、文本编辑器
Linux系统中有很多文本编辑器
(1) **nano**:GNU nano 是一款小巧友好的文本编辑器。nano 是 Pico 编辑器的自由克隆版本,也是 Pico 的功能增强。这款软件在屏幕下方通过操作提示,来告知用户下一步操作的快捷键。
(2) **sed**
(3) **vi** 或 **vim**
## 三、Shell脚本编程
### 1. 什么是Shell脚本编程?
Shell脚本编程实际上就是命令的堆积,命令多不具有幂等性,需要用程序逻辑来判断运行条件是否满足,以避免其运行中发生错误。

### 2. Shell脚本编程的特点
(1) 是过程式编程语言
(2) 通过解释运行方式运行在Linux系统中
(3) 依赖于外部程序文件运行

### 3. 如何写shell脚本?
(1) 脚本文件的第一行
顶格,给出shebang(解释器路径),用于指明解释器执行当前脚本的解释器程序文件。
常见解释器首行格式
bash : #!/bin/bash
python : #!/usr/bin/python
perl : #!/usr/bin/perl
(2) 运行Shell脚本
方法1 : 赋予脚本执行权限,并直接运行此程序文件。例如:chmod +x /PATH/TO/SCRIPT_FILE
方法2 : 通过解释器直接运行。例如:bash /PATH/TO/SCRIPT_FILE
> 注意:
脚本中的空白行将会被解释器忽略,想换行的可以单起一行输入echo;
脚本中,除了shebang,余下所有以#开头的行,都将被视作注释行而被忽略,即为注释行;
shell脚本的运行时通过运行一个子shell进程实现的;

### 4. bash脚本编程之配置文件
**登陆类型分类**:
(1) 交互式登录shell进程:
– 直接通过某终端输入账号和密码后登陆打开的shell进程;
– 使用su命令:su – USERNAME或者使用su -l USERNAME执行的登陆切换;

(2) 非交互式登陆shell进程:
– 使用su USERNAME执行的登陆切换;
– 在图形界面下打开的终端;
– 运行脚本;

**bash配置文件分为两类**:
(1) **profile类**:为交互式登录的shell提供配置
**profile类配置文件**

类型 | 作用范围 | 文件
—— | ———— | ——
全局配置 | 对所有用户都有效 | /etc/profile, /etc/profile.d/*.sh
用户个人配置 | 仅对当前用户有效 | ~/.bash_profile
profile类的功用:
– 用于定义环境变量
– 用于运行命令或脚本

(2) **bashrc类**:为非交互式登陆的shell进程提供配置
**bashrc类配置文件**

类型 | 作用范围 | 文件
—— | ———— | ——
全局配置 | 对所有用户都有效 | /etc/bashrc
用户个人配置 | 仅对当前用户有效 | ~/.bashrc
bashrc类的功用:
– 定义本地变量
– 定义命令别名

> 注意:
仅管理员可修改全局配置文件。

**配置文件读取顺序**
交互式登录shell进程的配置文件读取顺序:
/etc/profile –> /etc/profile.d/*.sh –> ~/.bash_profile –> ~/.bashrc –> /etc/bashrc
非交互式登录shell进程的配置文件读取顺序:
~/.bashrc –> /etc/bashrc –> /etc/profile.d/*.sh
>注意:
配置文件的生效是:以最后读取的配置为最终生效配置;
在命令行中定义的特性,例如变量和别名作用域为当前shell进程的生命周期;
在配置文件定义的特性,只对随后新启动的shell进程有效;

让通过配置文件定义的特性立即生效:
(1) 通过命令行重复定义一次;
(2) 让shell进程重读配置文件;
– ~]# source /PATH/TO/CONF_FILE
– ~]# . /PATH/TO/CONF_FILE

练习题:
(1) 定义对所有用户都生效的命令别名,例如:lftps=’lftp 172.16.0.1/pub’?
“`
~]# vim /etc/bashrc
在文件末尾添加如下行:
alias lftps=’lftp 172.16.0.1/pub’
~]# . /etc/bashrc
“`
(2) 让centos用户登录时,提示其已经登陆,并显示当前系统时间?
“`
~]# vim /home/centos/.bash_profile
在文件末尾添加如下行:
echo “Hi, centos!You logged into the system at $(date+%D-%T).”
“`
### 5. bash脚本编程之算数运算
算术运算有很多种,包括+, -, *, /, **(次方), %(取模,也叫取余数)。这些算数运算在linux的bash shell中无法直接使用,需要用单独的运算格式。

算术运算格式:
(1) let VAR=算数运算表达式
(2) VAR=$[算术运算表达式]
(3) VAR=$((算术运算表达式))
(4) VAR=$(expr $ARG1 $OP $ARG2)
其中,ARG1和ARG2是两个变量,$OP是算术运算法则,包括+, -, *, /, **(次方), %(取模,也叫取余数)。
注意:彼此间都要有空格!!

练习题:
(1) 写一个脚本,完成如下功能:添加三个用户,求此三个用户的UID之和;
“`
#!/bin/bash
id tom &> /dev/null || useradd tom
id jerry &> /dev/null || useradd jerry
id neo &> /dev/null || useradd neo
declare -i A=`grep “^tom” /etc/passwd | cut -d: -f3`
declare -i B=`grep “^jerry” /etc/passwd | cut -d: -f3`
declare -i C=`grep “^neo” /etc/passwd | cut -d: -f3`
let sum=$A+$B+$C
echo $sum
“`

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/87467

(0)
N27_sapbcsN27_sapbcs
上一篇 2017-09-20 17:44
下一篇 2017-09-20 17:48

相关推荐

  • sed命令用法详解

    1.sed运行原理         sed(stream editor)是一个行处理器。处理时,把当前处理的行放到“模式空间中”,处理完毕后,把该行输出到屏幕,接着处理下一行;这样不断重复,直到末行;此时文件本身内容并没有改变 2.sed用途    …

    Linux干货 2016-08-15
  • grep命令和find命令的练习

    1、显示系统上root、Fedora、或user1用户的默认shell [root@localhost ~]# grep -E “^(root|fedora|user1)\>” /etc/passwd | cut -d: -f1,7 root:/bin/bash fedora:/bin/bash user1:/bin/bash 2、找出/etc/rc.…

    Linux干货 2017-07-30
  • Bash的&&,||逻辑运算

    Bash的&&,||逻辑运算 bash里的true和false并不是我们通常所认为的0和1。 true和false是shell的内置命令,返回逻辑值。 $?是一个特殊的变量,存放有上一个程序的结束状态。 在shell里面,把0作为程序是否成功结束的标志。 例如: $ true$ echo$?0$ false$ echo$?1 有时候,下一条命…

    Linux干货 2016-04-11
  • 第三周博客作业

      开始学习已经三周了,感觉到年底有些时间不够,作业也交的越来越晚,需要加紧学习的进度了。   1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。  最简单的实现题目要求的方法是使用cut命令只显示用户名并用sort命令排序去重: [root@localhost ~]# who |&nbs…

    Linux干货 2016-12-20
  • N28-第二周

    1. Linux上的文件管理類命令都有哪些,其常用的使用方法及其相關示例演示。
    2. bash的工作特性之命令執行狀態返回值和命令行展開所涉及的內容及其示例演示。
    3. 請使用命令行展開功能來完成以下練習:
    (1) 創建/tmp目錄下的a_c、a_d、b_c、b_d。
    (2) 創建/tmp/mylinux目錄下的bin、boot/grub、dev、etc/rc.d/init.d、etc/sysconfig/network-scripts、lib/modules、
    lib64、proc、sbin、sys、tmp、usr/local/bin、usr/local/sbin、var/lock、var/log、var/run目錄。
    4. 如何查看文件的元數據,其信息有哪些,分別表示什麼含意?如何修改文件的時間戳信息?
    5. 如何定義一個命令的別名?如何在命令中引用另一個命令的執行結果?
    6. 顯示/var目錄下所有以L小寫開頭,以一個小寫字母結尾,且中間至少出現一位數字(可以有其它字符)的文件或目錄。
    7. 顯示/etc目錄下,以任意一個數字開頭,且以非數字結尾的文件或目錄。
    8. 顯示/etc目錄下,以非字母開頭,後面跟了一個字母以及其他任意長度任意字符的文件或目錄。
    9. 在/tmp目錄下創建以tfile開頭,後跟當前日期和時間的文件,文件名形如:tfile-2016-05-27-09-32-22。
    10. 複製/etc目錄下所有以p開頭,以非數字結尾的文件或目錄到/tmp/mytest1目錄中。
    11. 複製/etc目錄下所有以.d結尾的文件或目錄至/tmp/mytest2目錄中。
    12. 複製/etc目錄下所有以L小寫或m或n開頭,以.conf結尾的文件至/tmp/mytest3目錄中。

    Linux干货 2017-12-14
  • 压缩、解压缩及归档工具

    压缩、解压缩及归档工具 缩文件的基本原理是查找文件内的重复字节,并建立一个相同字节的"词典"文件,并用一个代码表示,比如在文件里有几处有一个相同的词"中华人民共和国"用一个代码表示并写入"词典"文件,这样就可以达到缩小文件的目的。         &#8212…

    Linux干货 2016-08-18