Shell简介:

定义:

shell即是一种命令语言,又是一种程序设计语言。

  • 命令语言:他交互式地解释和执行用户输入的命令;
  • 程序设计语言:他定义了各种变量和参数,并提供了血多在高级语言中才具有的控制结构,包括循环和分支。
两种执行命令的方式:
  • 交互式(Interactive): 用户输入一条命令,shell就解释一条。
  • 批处理(Batch): 用户事先写一个Shell脚本,其中有很多命令,让shell一次把这些命令执行完,而不是一条一条的敲命令。

几种常见的Shell

Unix、Linx上常见的Shell脚本解释器有bash、sh、csh、ksh等,习惯上把他们称作一种Shell。我们常说有几种Shell,其中说的是Shell脚本解释器。

bash

bash是Linux标准默认的shell

第一个Shell脚本

例1: 打开终端在root下建立一个shell脚本:

1.vim /root/test.sh

2.在test下输入:

#!/bin/bash
echo "Hello World"

3.给脚本授权:chmod + x /root/test.sh

4.执行脚本:./test.sh

#!是一个约定的标记,它告诉脚本需要什么Shell解释器来解决。

注意: 一定要写成./test.sh不要写成test.sh,如果写成后者运行时会到Path路径下去找。
例2: 下面的脚本使用read命令从 stdin(标准输入) 获取输入并赋值给PERSON变量,最后在**stdout(标准输出)**输出:

#!/bin/bash
echo "你的名字是:"
read PERSON
echo "Hello,$PERSON"
结果:
你的名字:
郭仕帅
Hello,郭仕帅

变量:

定义变量

1.定义变量时,变量名不加 $ 符,如:

name="三德子"
age=12

2.命名规则:数字、字母、下划线,开头必须是字母。

3.变量名与等号(=) 之间不能有空格。

使用变量

使用一个变量只要在变量前加美元符($) 即可,如:

name="三德子"
each $name
each ${name}

变量名外的花括号是可选的,加不加都行,加花括号是为了识别变量的边界,比如下面情况:

for skill in java html shell php
do
    echo "${skill}说:我是世界上最好的语言!"
done
结果:
java说:我是世界上最好的语言!
html说:我是世界上最好的语言!
shell说:我是世界上最好的语言!
php说:我是世界上最好的语言!

建议所有变量加花括号

重新定义变量

已定义的变量可以重新定义:后者覆盖前者。

name="三德子"
echo ${name}
name="法印"
echo ${name}
结果:
三德子
法印
只读变量-readonly

使用readonly定义的变量时不可以修改的。

readonly name="三德子"
echo $name
或者
name="三德子"
readonly name
echo $name
删除变量-unset

使用unset可以删除变量。除只读变量外。

name="三德子"
unset name
echo $name

输出结果什么也没有。

变量类型

运行shell时,会同时存在三种变量:

  1. 局部变量

局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
2) 环境变量

所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
3) shell变量

shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行


特殊变量

变量名只能包含数字、字母和下划线,因为某些包含其他字符的变量有特殊含义,这样的变量被称为特殊变量。
例如:查看当前shell的进程:

echo $$
变量 含义
$0 当前脚本的文件名
$n 传递给脚本或者函数的参数,第一个参数是$1
$# 传递给脚本或函数的参数个数。
$* 传递给脚本或函数的所有参数。
$@ 传递给脚本或函数的所有参数。
$? 上一个命令退出的状态,或者函数的返回值。一般成功返回0,失败返回1
$$ 查看当前shell的进程id
命令行参数
echo "文件的名称:${0}"
echo "第一个参数:${1}"
echo "所有参数:${@}"
echo "所有参数:${*}"
echo "参数的个数:${#}"

运行:

./test.sh 三德子  法印

结果:

第一个参数:三德子
所有参数:三德子 法印
所有参数:三德子 法印
参数的个数:2

Shell 替换-Shell变量替换、Shell命令替换、转义字符

如果表达式中包含特殊字符,Shell将会进行替换。例如:在双引号中使用变量是一种替换,转义字符也是一种替换。

#!/bin/bash
a=10
echo -e "你猜他的年龄是多少岁?答案:$a \n"

结果:

你猜他的年龄是多少岁?答案:10


如果没有-e \n就原样输出。你猜他的年龄是多少岁?答案:10 \n

下面的转移字符都可以用在each中:

转义字符 含义
\\ 反斜杠
\a 警报,响铃
\b 退格(删除键)
\f 换页(FF),将当前位置移动到下页开头
\n 换行
\r 回车
\t 水平制表符
\v 垂直制表符

可以使用echo命令的-E选项禁止转义,默认也是不转义的。

命令替换:

命令替换是指Shell可以先执行命令,将输出结果暂时保存。在适当的地方输出。
命令替换的语法:

`command`

下面的例子:将命令执行结果放在变量中

1.当前日期是:

DATE=`date`
echo "日期是:$DATE"

结果:

日期是2017年 04月 16日 星期日 23:15:34 PDT

2.系统当前登录的用户数是

USERS=`who | wc -l`
echo "系统当前的登录数为:${USERS}"

结果:

系统当前的登录数为:3
变量替换

变量替换可以根据变量的状态(是否为空、是否定义等)来改变他的值

形式 说明
${var} 变量本来的值
${var:-word} 如果var为空或者被删除(unset),那么返回word,但不改变var的值
${var:=word} 如果var为空或者被删除(unset),那么返回word,同时改变var的值
${var:?message} 报错
${var:+word} 如果变量 var 被定义,那么返回 word,但不改变 var 的值。

Shell运算符:Shell算数运算符、关系运算符、布尔运算符、字符串运算符、文件测试运算符

原生的bash不支持简答的数学运算,但可以通过其他命令来解释,最常用的是expr;

例如:计算两个数相加

#!/bin/bash
val=`expr 2 + 2`
echo ${val}

结果:

4

注意:

  • 表达式和运算符之间一定要有空格,例如:2+2是不对的必须写成2 + 2
  • 表达式一定要被``包含,跟makedown一样。

算数运算符:
注意:

  • 乘号:前边一定要加反斜杠(\*)
  • 条件表达式:要放在方括号间,并且要有空格:[ $a == $b ] 比较相等。