Linux Shell篇之一:Shell编程简介

     Shell是操作系统的最外层,Shell可以合并编程语言以控制进程和文件,以及启动和控制其它程序。shell 通过提示您输入,向操作系统解释该输入,然后处理来自操作系统的任何结果输出来管理您与操作系统之间的交互。简单来说Shell就是一个用户跟操作系统之间的一个命令解释器

      Shell是用户与Linux操作系统之间沟通的桥梁。用户可以输入命令执行,又可以利用 Shell脚本编程去运行。

      Linux Shell种类非常多,常见的有:Bourne Shell(/usr/bin/sh或/bin/sh)、Bourne Again Shell(/bin/bash)、C Shell(/usr/bin/csh)、K Shell(/usr/bin/ksh)、Shell for Root(/sbin/sh)等。不同的Shell语言的语法有所不同,所以不能交换使用。

      最常用的shell是Bash,也就是Bourne Again Shell,由于易用和免费,Bash在日常工作中被广泛使用,也是大多数Linux系统默认的Shell。

第一个Shell脚本:

vi  first_shell.sh

#!/bin/bash                      

#This is my First shell      

echo  “Hello  World !"   

      执行Shell脚本:./或者sh、/bin/bash、.

方法1:./   的前提:赋予执行权限x,才能执行!

Linux Shell篇之一:Shell编程简介_Linux Shell篇之一:Shell

方法2:sh 或者/bin/bash 或者. 直接运行即可。

Linux Shell篇之一:Shell编程简介_Linux Shell篇之一:Shell_02

 

认识变量

       Shell编程语言是非类型的解释型语言,不像C++/JAVA语言编程时需要事先声明变量,SHELL给一个变量赋值,实际上就是定义了变量,在Linux支持的所有shell中,都可以用赋值符号(=)为变量赋值

       SHELL变量可分为两类:局部变量和环境变量。局部变量只在创建它们的shell脚本中使用。而环境变量则可以在创建它们的shell及其派生出来的任意子进程中使用。有些变量是用户创建的,其他的则是专用shell变量。 

       定义这样一个变量A,前面变量名,后面是变量的值。引用变量可以使用$A,

#!/bin/bash
#author baishubing 201507
A=12345
echo "prinf varables equal is $A"

把变量放在脚本里面,执行:

Linux Shell篇之一:Shell编程简介_Linux Shell篇之一:Shell_03

注:简单的理解变量,相当于定义一个别名-名称,引用的时候加上$符号就可以了!

Linux Shell篇之一:Shell编程简介_Linux Shell篇之一:Shell_04

参数-x:表示可以看到执行命令的过程!

Linux Shell篇之一:Shell编程简介_Linux Shell篇之一:Shell_05

参数-n:表示在执行命令的过程判断是否有错误!

 

一、SHELL常见的系统变量

解析如下:

$0 输出当前脚本的名称

$n 输出当前脚本的第n个参数,n=1,2,…9

$* 输出当前脚本的所有参数(不包括程序本身)

$# 输出当前脚本的参数个数(不包括程序本身)

$? 输出命令或程序执行完后的状态,一般返回0表示执行成功,其他值都表示不成功。

$UID 输出当前用户的ID

$PWD  输出当前所在的目录

练习:系统变量

例1:同时打印出$0、$n等参数:

其中:\$0中的\表示转译,不把$0作为一个脚本或者变量来运行!

Linux Shell篇之一:Shell编程简介_Linux Shell篇之一:Shell_06

结果输出:

Linux Shell篇之一:Shell编程简介_Linux Shell篇之一:Shell_07

例2:练习系统变量:

#!/bin/bash

#auto print variables

#by wugk 2014-09

echo -e '\033[32m-----------------------------\033[0m'

echo "This is $0 param !"

echo "This \$1 is $1 param !"

echo "This \$2 is $2 param !"

echo -e '\033[32m-----------------------------\033[0m'

echo "This \$* is $* param !"

echo "This \$# is $# param !"

echo "This \$? is $? param !"

echo

命令输出:

Linux Shell篇之一:Shell编程简介_Linux Shell篇之一:Shell_08

 

二、printf输出颜色

printf("\033[字背景颜色;字体颜色m字符串\033[0m");

printf("\033[41;32m字体背景是红色,字是绿色\033[0m\n");
其中:41是字背景颜色, 32是字体的颜色, 字体背景是红色,字是绿色是字符串.

后面的\033[0m是控制码

颜色代码如下:
QUOTE:
字背景颜色范围: 40--49 字颜色: 30--39

40: 黑       30: 黑
41: 红       31: 红
42: 绿       32: 绿
43: 黄       33: 黄
44: 蓝       34: 蓝
45: 紫       35: 紫
46: 深绿    36: 深绿
47: 白色    37: 白色

ANSI控制码:
QUOTE:
\033[0m 关闭所有属性

\033[1m 设置高亮度

\03[4m 下划线

\033[5m 闪烁

\033[7m 反显

\033[8m 消隐

\033[30m -- \033[37m 设置前景色

\033[40m -- \033[47m 设置背景色

\033[nA 光标上移n行

\03[nB 光标下移n行

\033[nC 光标右移n行

\033[nD 光标左移n行

\033[y;xH设置光标位置

\033[2J 清屏

\033[K 清除从光标到行尾的内容

\033[s 保存光标位置

\033[u 恢复光标位置

\033[?25l 隐藏光标

\33[?25h 显示光标

这样, 在某些时候就可以实现动态的输出!

 

练习脚本颜色打印输出

例1:带颜色打印输出

Linux Shell篇之一:Shell编程简介_Linux Shell篇之一:Shell_09

输出效果:

Linux Shell篇之一:Shell编程简介_Linux Shell篇之一:Shell_10

例2:练习LAMP安装菜单制作

Linux Shell篇之一:Shell编程简介_Linux Shell篇之一:Shell_11

Linux Shell篇之一:Shell编程简介_Linux Shell篇之一:Shell_12

注:echo -e "\033[32mPlease Select your to Meunu!\033[0m"

-e:表示扩展

\033[32m-------\033[0m:是固定格式!

32m---------0m:表示绿色在这行以及下面的行都显示绿色,并且次行颜色开始加深!

Linux Shell篇之一:Shell编程简介_Linux Shell篇之一:Shell_13

Linux Shell篇之一:Shell编程简介_Linux Shell篇之一:Shell_14

注:[32m------[0m:表示:只是这行显示绿色!

三、逻辑运算符

解析:

-f       判断文件是否存在 eg: if [ -f filename ]

-d      判断目录是否存在 eg: if [ -d dir     ]

-eq    等于 应用于:整型比较    -------相当于==

-ne    不等于 应用于:整型比较

-lt      小于 应用于:整型比较

-gt     大于 应用于:整型比较

-le     小于或等于 应用于:整型比较

-ge    大于或等于 应用于:整型比较

-a      双方都成立(and) 逻辑表达式 –a 逻辑表达式----相当于&&

-o      单方成立(or) 逻辑表达式 –o 逻辑表达式--------相当于||

  -z       空字符串

 

四、3种运算符号((  ))、[[  ]]、[  ]

[ ],可以用于判断(字符串、目录、文件、大小、是否非空、数字比较);

(( )),用于运算比较大小;

` `,用于字符的,运算比较大小;

一个[ ],把里面的内容当成字符,来判断和运算;2个[ ],用于运算;

(( ))的运算,只能用数学上的:+ -* /,而不能用逻辑运算符:-eq、-gt、lt等等!

[    ]的运算,不能用数学上的:+ -* /,只能能用逻辑运算符:-eq、-gt、lt等等!

` `的运算,能用数学上的:+ -* /,也能用逻辑运算符:-eq、-gt、lt等等!

一个[ ],用于数字运算的时候,“ ”可以去掉!但是用于运算字符的时候," "还是要加上!

[[  ]]用于多个主机间,计算和:需要用&&替换-a;计算或:需要用||替换-o;以及其他的-gt等;

[  ]用于判断字符相等,不要使用-eq,而是使用==来表示!

 

练习[ ]、` `

Linux Shell篇之一:Shell编程简介_Linux Shell篇之一:Shell_15

Linux Shell篇之一:Shell编程简介_Linux Shell篇之一:Shell_16

注:这里的[ -z "$1" -o -z "$2" ]:内容需要使用双引号,原因是:把$1、$2当成了字符串!而单引号'  '是转译的作用,也不能用!

五、日期赋值运算

date  +%Y%m%d

date  +%Y-%m-%d

先把当前的所有 /tmp/20150725全部替换成:¥DIR

:%s#/tmp/20150725#$DIR#g

如果把以上的日期格式的内容放在脚本中运行,会把当前的命令赋值到当前的目录中!

Linux Shell篇之一:Shell编程简介_Linux Shell篇之一:Shell_17

Linux Shell篇之一:Shell编程简介_Linux Shell篇之一:Shell_18

注:`data +Y%-m%-d%`,其中的反引号,表示把里面的内容当成一个脚本来运行!