Shell 教程
- shell 是一种命令语言. 也是一种程序设计语言.
- shell 脚本
- shell 环境 : 常见的有 Bourne Shell(/usr/bin/sh或/bin/sh)
第一个shell脚本
#!/bin/bash
echo "Hello World !"
运行shell脚本有两种方法:
- 作为可执行程序
将上面代码保存为 test.sh 并cd到相应目录.
chmod +x ./test.sh #使脚本具有执行权限 ./test.sh #执行脚本
- 作为解释器参数
直接运行解释器 其参数就是shell脚本文件名
/bin/sh test.sh /bin/PHP test.PHP
shell变量
定义变量
定义变量时,变量名不加
$
符号.your_name="qq.com"
注意:变量名与等号之间不能有空格
变量名遵循如下规则:
除了显示赋值 还可用语句给变量赋值
for file in `ls/etc` #或者 for file in $(ls/etc)
使用变量
使用一个定义过的变量. 只要在变量名前面加
$
符号即可.your_name="jay" echo $your_name echo ${your_name} #变量名外面的 花括号 是可选的.加花括号是为了帮助解释器识别边界. for skill in Ada Coffe Action Java; do echo "I am good at ${skill}Script" done
已定义的变量 可以被重新定义.
your_name="tom" echo $your_name your_name="alibaba" echo $your_name
注意:
- 第二次赋值的时候不写成
$your_name="alibaba"
. - 使用变量的时候才加
$
符号.
- 第二次赋值的时候不写成
只读变量
readonly
: 可将变量定义为只读变量. 只能读取不能改变.#!/bin/bash myUrl="http://www.w3cschool.cc" readonly myUrl myUrl="http://www.runoob.com" #执行脚本报错! #/bin/sh: NAME: This variable is read only.
删除变量
变量类型
- 运行shell时,会同时出现三种变量:
- 局部变量 : 仅在当前shell实例中有效.其他shell程序不能访问局部变量
- 环境变量 : 所有程序,包括shell启动程序,都能访问环境变量.
- shell变量 : shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量. 有一部分是局部变量. 这些变量保证了shell的正常运行
shell 字符串
- 字符串 是shell编程中最常用的数据结构.
- 字符串可以用
单引号
. 也可用双引号
- 单双引号的区别
单引号
单引号里的任何字符都会原样输出.
单引号字符串中的变量是无效的.
单引号字符串中不能出现单引号. 对单引号使用转义符后也不行.
str='this is a string'
双引号
双引号里可以有变量
双引号里可以出现转义字符.
your_name='jay' str="hello.i know your are \"$your_name\"! \n"
拼接字符串
your_name="jay"
greeting="hello,"$your_name"!"
greeting_1="hello,${your_name}!"
echo $greeting $greeting_1
获取字符串长度
string="abcd"
echo ${#string} #输出 4
提取子字符串
#以下实例从字符串第 2 个字符开始截取 4 个字符
string="runoob is a great site"
echo ${string:1:4} # 输出 unoo
查找子字符串
#查找字符"i"或"s"的位置: string="runoob is a greet company" echo `expr index "$string" is` # 输出8
注意: 以上脚本中 “`” 是反引号,而不是单引号 “’”,不要看错了哦
shell 数组
bash
支持一维数组.- 数组下标从
0
开始.
定义数组
在shell中,用括号表示数组. 数组元素用
空格
分割开来#数组名=(值1 值2 ... 值n) array_name=(value0 value1 value2 value3) #或者 array_name=( value0 value1 value2 value3 )
还可以单独定义数组的各个分量
#array_name=() array_name[0]=value0 array_name[1]=value1 echo ${array_name[0]}
读取数组
读取数组元素的一般格式为:
# ${数组名[下标]} valuen=${array_name[n]}
使用
@
符号可以获取数组中所有元素echo ${array_name[@]}
获取数组的长度
-
# 取得数组元素的个数 length=${#array_name[@]} # 或者 length=${#array_name[*]} # 取得数组单个元素的长度 lengthn=${#array_name[n]}
shell 传递参数
在执行shell加班时,向脚本传递参数,脚本内获取参数的格式为
$n # n代表一个数字.1为执行脚本的第一个参数.2为第二个参数..
demo:向脚本传递三个参数.并输出. 其中
$0
为执行的文件名#!/bin/bash echo "Shell 传递参数实例!"; echo "执行的文件名:$0"; echo "第一个参数为:$1"; echo "第二个参数为:$2"; echo "第三个参数为:$3"; $ chmod +x test.sh $ ./test.sh 1 2 3 #输出结果 #Shell 传递参数实例! #执行的文件名:./test.sh #第一个参数为:1 #第二个参数为:2 #第三个参数为:3
还有几个特殊字符用来处理参数
参数 | 说明 |
---|---|
$# | 传递到脚本的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 与$*相同 |
$- | 显示shell使用的当前选项 |
$? | 显示最后命令的退出状态.0表示没有错误.其他值表明有错误. |
shell 基本运算符
算术运算符
关系运算符
布尔运算符
字符串运算符
文件测试运算符
算术运算符
原生的
bash
不支持简单的数学运算. 但可以通过其他命令来实现. 如awk
和expr
expr
是一款表达式计算工具. 使用它能完成表达式的求值操作.#!/bin/bash val='expr 2 + 2' echo "两数之和为: $val" # 表达式和运算符之间要有空格
注意: 条件表达式要放在方括号之间. 并且要有空格.
# 必须写成 [$a == $b]
注意:
- 乘号
*
前边必须加 反斜杠\
才能实现惩罚运算
val=`expr $a \* $b` echo "a * b : $val"
- 乘号
关系运算符
运算符 | 说明 |
---|---|
-eq | 检测两个数是否相等.相等返回true |
-ne | 是否不相等. |
-gt | 检测左侧是否大于右侧 |
-lt | 检测左侧是否小于右侧 |
-ge | 左侧是否大于等于右侧 |
-le | 左侧是否小于等于右侧 |
布尔运算符
!
: 非运算-o
: 或运算. 有一个表达式为true则true-a
: 与运算
&&
: 逻辑AND
||
: 逻辑OR
字符串运算符
=
: 检测两个字符串是否相等!=
: 检测两个字符串是否不相等-z
: 检测字符串长度是否为0. 为0返回true-n
: 检测字符串长度是否为0 不为0返回truestr
检测字符串是否为空. 不为空返回true
文件测试运算符
操作符 | 说明 |
---|---|
-b file | 检测文件是否是块设备文件 |
-c file | 检测文件是否为字符设备文件 |
-d file | 检测文件是否为目录 |
-f file | 检测文件是否为普通文件(不是目录也不是设备文件) |
-g file | 检测文件是否设置了 SGID 位 |
-k file | 检测文件是否设置了 粘着位sticky bit |
-p file | 检测文件是否为有名管道 |
-u file | 检测文件是否设置了 SUID 位 |
-r file | 检测文件是否可读 |
-w file | 检测文件是否可写 |
-x file | 检测文件是否可执行 |
-s file | 检测文件是否为空(文件大小是否大于0) |
-e file | 检测文件(包括目录)是否存在 |