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时,会同时存在三种变量:
- 局部变量
局部变量在脚本或命令中定义,仅在当前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 ] 比较相等。