1.1 简介python
Shell是一个C语言编写的脚本语言,它是用户与Linux的桥梁,用户输入命令交给Shell处理,Shell将相应的操做传递给内核(Kernel),内核把处理的结果输出给用户。shell
下面是处理流程示意图:编程
Shell既然是工做在Linux内核之上,那咱们也有必要知道下Linux相关知识。bash
Linux是一套免费试用和自由传播的类Unix操做系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操做系统。多线程
1983年9月27日,Richard Stallman(理查德-马修-斯托曼)发起GNU计划,它的目标是建立一套彻底自由的操做系统。为保证GNU软件能够自由的使用、复制、修改和发布,全部的GNU软件都有一份在禁止其余人添加任何限制的状况下受权全部权利给任何人的协议条款,GNU通用公共许可证(GNU General Plubic License,GPL),说白了就是不能作商业用途。运维
GNU是"GNU is Not Unix"的递归缩写。UNIX是一种普遍使用的商业操做系统的名称。ssh
1085年,Richard Stallman又创立了自由软件基金会(Free Software Foundation,FSF)来为GNU计划提供技术、法律以及财政支持。编程语言
1990年,GNU计划开发主要项目有Emacs(文本编辑器)、GCC(GUN Compiler Collection,GNU编译器集合)、Bash等,GCC是一套GNU开发的编程语言编译器。还有开发一些UNIX系统的程序库和工具。编辑器
1991年,Linuxs Torvalds(林纳斯- 托瓦兹)开发出了与UNIX兼容的Linux操做系统内核并在GPL条款下发布。ide
1992年,Linux与其余GUN软件结合,彻底自由的GUN/Linux操做系统正式诞生,简称Linux。
1995年1月,Bob Young创办ACC公司,以GNU/Linux为核心,开发出了RedHat Linux商业版。
Linux基本思想有两点:第一,一切都是文件;第二,每一个软件都有肯定的用途。与Unix思想十分相近。
1.2 Shell基本分两大类
1.2.1 图形界面Shell(GUI Shell)
GUI为Unix或者类Unix操做系统构造一个功能完善、操做简单以及界面友好的桌面环境。
主流桌面环境有KDE,Gnome等。
1.2.2 命令行界面Shell(CLI Shell)
CLI是在用户提示符下键入可执行指令的界面,用户经过键盘输入指令,完成一系列操做。
在Linux系统上主流的CLI实现是Bash,是许多Linux发行版默认的Shell。还有许多Unix上用的Shell,例如tcsh、csh、ash、bsh、ksh等等。
1.3 第一个Shell脚本
本教程主要讲解在大多Linux发行版下默认Bash Shell。Linux系统是RedHat下的CentOS操做系统,彻底免费。与其商业版RHEL(Red Hat Enterprise Linux)出自一样的源代码,不一样的是CentOS并不包含封闭源代码软件和售后支持。
用vi打开test.sh,编写:
# vi test.sh #!/bin/bash echo "Hello world!"
第一行设置运行环境,第二行打印Hello world!
写好后,开始执行,执行Shell脚本有三种方法:
方法1:直接用bash解释器执行 # bash test.sh Hello world! 方法2:添加可执行权限 # ll test.sh -rw-r--r--. 1 root root 32 Aug 18 01:07 test.sh # chmod +x test.sh # ./test.sh -bash: ./test.sh: Permission denied # chmod +x test.sh # ./test.sh # ./在当前目录 Hello world! 方法3:source命令执行,以当前默认Shell执行 # source test.sh Hello world!
1.4 Shell变量
1.4.1 系统变量
在命令行提示符直接执行env、set查看系统或环境变量。env显示用户环境变量,set显示Shell预先定义好的变量以及用户变量。能够经过export导出成用户变量。
一些写Shell脚本时经常使用的系统变量:
$SHELL | 默认Shell |
$HOME | 当前用户家目录 |
$IFS | 默认内部域分隔符 |
$LANG | 默认语言 |
$PATH | 默承认执行程序路径 |
$PWD | 当前目录 |
$UID | 用户ID |
$USER | 当前用户 |
$HISTSIZE | 历史命令大小,可经过HISTTIMEFORMAT变量设置命令执行时间 |
1.4.2 普通变量与临时环境变量
普通变量定义:VAR=value
临时环境变量定义:export VAR=value
变量引用:$VAR
下面看下他们之间区别:
Shell进程的环境变量做用域是Shell进程,当export导入到系统变量时,则做用域是Shell进程及其Shell子进程。
ps axjf输出的第一列是PPID(父进程ID),第二列是PID(子进程ID)
当SSH链接Shell时,当前终端PPID(-bash)是sshd守护程序的PID(root@pts/0),所以在当前终端下的全部进程的PPID都是-bash的PID,好比执行命令、运行脚本。
因此当在-bash下设置的变量,只在-bash进程下有效,而-bash下的子进程bash是无效的,当export后才有效。
进一步说明:再从新链接SSH,去除上面定义的变量测试下
因此在当前shell定义的变量必定要export,不然在写脚本时,会引用不到。
还须要注意的是退出终端后,全部用户定义的变量都会清除。
在/etc/profile下定义的变量就是这个原理,后面有章节会讲解Linux经常使用变量文件。
1.4.3 位置变量
位置变量指的是函数或脚本后跟的第n个参数。
$1-$n,须要注意的是从第10个开始要用花括号调用,例如${10}
shift可对位置变量控制,例如:
#!/bin/bash echo "1: $1" shift echo "2: $2" shift echo "3: $3" # bash test.sh a b c 1: a 2: c 3:
每执行一次shift命令,位置变量个数就会减一,而变量值则提早一位。shift n,可设置向前移动n位。
1.4.4 特殊变量
$0 | 脚本自身名字 |
$? | 返回上一条命令是否执行成功,0为执行成功,非0则为执行失败 |
$# | 位置参数总数 |
$* | 全部的位置参数被看作一个字符串 |
$@ | 每一个位置参数被看作独立的字符串 |
$$ | 当前进程PID |
1.5 变量引用
1.5.1 自定义变量与引用
# VAR=123 # echo $VAR 123
Shell中全部变量引用使用$符,后跟变量名。
有时个别特殊字符会影响正常引用,那么须要使用${VAR},例如:
# VAR=123 # echo $VAR 123 # echo $VAR_ # Shell容许VAR_为变量名,因此此引用认为这是一个有效的变量名,故此返回空 # echo ${VAR} 123
还有时候变量名与其余字符串紧碍着,也会误认为是整个变量:
# echo $VAR456 # echo ${VAR}456 123456
1.5.2 将命令结果做为变量值
# VAR=`echo 123` # echo $VAR 123 # VAR=$(echo 123) # echo $VAR 123
这里的反撇号等效于$(),都是用于执行Shell命令。
博客地址:http://lizhenliang.blog.51cto.com
QQ群:323779636(Shell/Python运维开发群)
1.6 双引号和单引号
在变量赋值时,若是值有空格,Shell会把空格后面的字符串解释为命令:
# VAR=1 2 3 -bash: 2: command not found # VAR="1 2 3" # echo $VAR 1 2 3 # VAR='1 2 3' # echo $VAR 1 2 3
看不出什么区别,再举个说明:
# N=3 # VAR="1 2 $N" # echo $VAR 1 2 3 # VAR='1 2 $N' # echo $VAR 1 2 $N
单引号是告诉Shell忽略特殊字符,而双引号则解释特殊符号原有的意义,好比$、!。
1.7 注释
Shell注释也很简单,只要在每行前面加个#号,即表示Shell忽略解释。