基本介绍
shell分为shell控制台中使用的语句和shell脚本语法。
shell脚本编程本身语法和使用并不复杂,记不清楚也可以随时google,关键是熟练使用shell命令,只有熟练使用shell命令,组合出来的shell脚本才会更有效强大。。
shell第一行要加
1#!/bin/bash不加会调默认的解析器。
chmod +x ./test.sh
- 添加权限
shell命令有两种之分
- 一种是内建命令,不需要bash也能执行的,例如cd
- 另一种需要bash去查找的应用程序,如ls
bash的配置文件
- 用户家目录下的.bashrc
- 使之生效
source .bashrc
. .bashrc
如果将命令行下输入的命令用()括号括起来,那么也会fork出一个子Shell执行小括号中的命令,一行中可以输入由分号;隔开的多个命令,比如:
$ (cd ..;ls -l)
和上面两种方法执行Shell脚本的效果是相同的,cd ..命令改变的是子Shell的PWD,而不会影响到交互式Shell。然而命令
$ cd ..;ls -l
则有不同的效果,cd ..命令是直接在交互式Shell下执行的,改变交互式Shell的PWD,然而这种方式相当于这样执行Shell脚本:
$ source ./test.sh
或者
$ . ./test.sh
source或者.命令是Shell的内建命令,这种方式也不会创建子Shell,而是直接在交互式Shell下逐行执行脚本中的命令。
alias
- 命令取别名
alias pg='ps aux | grep'
基本语法
变量
学习一门语言最重要的是先掌握其 数据类型和变量
shell里就一种数据类型
- string
两种变量
- 环境变量
- 定义:export VAR=hello
- 取变量:$VAR
- 本地变量
- 定义:VAR=hello
- 取变量:$VAR
- unset 可以将变量删除
通配符
* 匹配0个或多个任意字符
? 匹配一个任意字符
[若干字符] 匹配方括号中任意一个字符的一次出现
正则表达式
- 环境变量
命令代换
由“`”反引号括起来的也是一条命令,Shell先执行该命令,然后将输出结果立刻代换到当前命令行中。例如定义一个变量存放date命令的输出:
123$ DATE=`date`$ echo $DATE命令代换也可以用$()表示:
1$ DATE=$(date)
算术代换
使用$(()),用于算术计算,(())中的Shell变量取值将转换成整数,同样含义的$[ ]等价例如:
|
|
转义字符
和C语言类似,\在Shell中被用作转义字符,用于去除紧跟其后的单个字符的特殊意义(回车除外),换句话说,紧跟其后的字符取字面值。例如:
|
|
shell 脚本语法
把一个变量当命令操作加上$()
- 直接取值不加()
- 例:
- $(ls):执行命令
- $ls:取ls命名的变量名称
命令test或 [ 可以测试一个条件是否成立,如果测试结果为真,则该命令的Exit Status为0,如果测试结果为假,则命令的Exit Status为1(注意与C语言的逻辑表示正好相反)。例如测试两个数的大小关系:
123456789101112ubuntu:~$ var=2ubuntu:~$ test $var -gt 1ubuntu:~$ echo $?0ubuntu:~$ test $var -gt 3ubuntu:~$ echo $?1ubuntu:~$ [ $var -gt 3 ]ubuntu:~$ echo $?1虽然看起来很奇怪,但左方括号 [ 确实是一个命令的名字,传给命令的各参数之间应该用空格隔开,比如:$VAR、-gt、3、] 是 [ 命令的四个参数,它们之间必须用空格隔开。命令test或 [ 的参数形式是相同的,只不过test命令不需要 ] 参数。以 [ 命令为例,常见的测试命令如下表所示:
12345678910111213[ -d DIR ] 如果DIR存在并且是一个目录则为真[ -f FILE ] 如果FILE存在且是一个普通文件则为真[ -z STRING ] 如果STRING的长度为零则为真[ -n STRING ] 如果STRING的长度非零则为真[ STRING1 = STRING2 ] 如果两个字符串相同则为真[ STRING1 != STRING2 ] 如果字符串不相同则为真[ ARG1 OP ARG2 ] ARG1和ARG2应该是整数或者取值为整数的变量,OP是-eq(等于)-ne(不等于)-lt(小于)-le(小于等于)-gt(大于)-ge(大于等于)之中的一个和C语言类似,测试条件之间还可以做与、或、非逻辑运算:
12345[ ! EXPR ] EXPR可以是上表中的任意一种测试条件,!表示“逻辑反(非)”[ EXPR1 -a EXPR2 ] EXPR1和EXPR2可以是上表中的任意一种测试条件,-a表示“逻辑与”[ EXPR1 -o EXPR2 ] EXPR1和EXPR2可以是上表中的任意一种测试条件,-o表示“逻辑或”例如:
1234$ VAR=abc$ [ -d Desktop -a $VAR = 'abc' ]$ echo $?0注意,如果上例中的$VAR变量事先没有定义,则被Shell展开为空字符串,会造成测试条件的语法错误(展开为[ -d Desktop -a = ‘abc’ ]),作为一种好的Shell编程习惯,应该总是把变量取值放在双引号之中(展开为[ -d Desktop -a “” = ‘abc’ ]):
1234567$ unset VAR$ [ -d Desktop -a $VAR = 'abc' ]bash: [: too many arguments$ [ -d Desktop -a "$VAR" = 'abc' ]$ echo $?1
分支
在Shell中用if、then、elif、else、fi这几条命令实现分支控制。这种流程控制语句本质上也是由若干条Shell命令组成的,例如
|
|
当then换行时,可以不加;号:
|
|