***
一,shell教程
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言
二,shell环境
跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。
Linux 的 Shell 种类众多,常见的有:
Bourne Shell(/usr/bin/sh或/bin/sh)
Bourne Again Shell(/bin/bash)
C Shell(/usr/bin/csh)
K Shell(/usr/bin/ksh)
Shell for Root(/sbin/sh)
……
#! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。
扩展名并不影响脚本执行,见名知意就好,如果你用 php 写 shell 脚本,扩展名就用 php 好了。
运行shell脚本有两种方法:
1,作为可执行程序
chmod +x ./test.sh #使脚本具有执行权限
./test.sh #执行脚本
2,作为解释器参数
/bin/sh test.sh
/bin/php test.php
三,shell变量
注意,变量名和等号之间不能有空格
1,命名只能用英文字母,数字和下划线,首个字符不能以数字开头
2,中间不能有空格
3,不能用标点符号
4,不能使用bash里的关键字(可用help命令查看保留关键字)
除了显示赋值,还可用语句赋值,如:
for file in 'ls /etc'
或
for file in $(ls /etc)
以上语句将/etc下目录的文件循环出来
1,使用变量
echo &xxx
2,只读变量
readonly xxx
3,删除变量
unset variable_name #不能删除只读变量
变量类型
运行shell时存在三种变量:
1,局部变量:只在当前shell实例中有效
2,环境变量:所有程序,包括shell启动的程序
3,shell变量:由shell程序设置的特殊变量。
四,shell字符串
单引号:任何字符都会原样输出,不会输出变量,不能出现一个单一的单引号
但可以成对出现,作字符串拼接使用。
双引号:可以使用转义字符,可以有变量
1,拼接字符串:
#使用双引号拼接
your_name="runb"
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1
#使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
#结果:
hello, runoob ! hello, runoob !
hello, runoob ! hello, ${your_name} !
2,获取字符串长度
string="abcd"
echo ${#string} #输出4
3,提取子字符串
截取第二个字节后的4个字符
echo ${string:1:4}
#第一个索引是0
4,查找子字符串
查找字符i或字符o的位置(哪个先出现就计算那个)
string="runoob is"
echo `expr index "$string" io` #输出 4 ,反引号``不是单引号''
五,Shell数组
bash支持一维数组,不支持多维,并且没有限定数组的大小
类似于C语言,数据元素下标从0开始编号,
通过下标获取数组中的元素,下标可以是整数或算术表达式,值大于或等于0
1,定义数组
用()表示数组,数组元素用“空格”符号分割开,
定义数组的一般形式为:
数组名=(值1 值2 ... 值n)
还可以单独定义数组
array_name[0]=value0
array_name[1]=value1
#下标没有限制
初始化时不需要定义数组大小,和php一样
2,读取数组
格式:${数组名[下标]}
echo ${array_name[@]}
# @符号可以获取数组中的所有元素
3,获取数组长度
#取数组元素的个数
length=${#array_name[@]}
#或者
length=${#array_name[*]}
#取得数组单个元素的长度
length=${#array_name[n]}
4,注释
单行:
# #开头不能有其他字符
多行: 末行开头不能有空格
:<<EOF
注释内容...
注释内容...
注释内容...
EOF
六,shell传递参数
有几个特殊字符用来处理参数:
参数处理 说明
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数。
#如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。
#如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
例: #!/bin/bash
echo "Shell 传递参数实例!"
echo "第一个参数为:$1"
echo "参数个数为:$#"
echo "传递的参数作为一个字符串显示:$*"
ma_hongbao@jiguang-X10SAE:~$ ./test.sh 1 2 3
Shell 传递参数实例!
第一个参数为:1
参数个数为:3
传递的参数作为一个字符串显示:1 2 3
$* 与 $@ 区别:
相同点:都是引用所有参数。
不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。
#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com
echo "-- \$* 演示 ---"
for i in "$*"; do
echo $i
done
echo "-- \$@ 演示 ---"
for i in "$@"; do
echo $i
done
执行脚本,输出结果如下所示:
$ chmod +x test.sh
$ ./test.sh 1 2 3
-- $* 演示 ---
1 2 3
-- $@ 演示 ---
1
2
3
七,运算符:算数,关系,布尔,字符串,文件测试运算符
原生bash不支持简单的数学运算,但可以通过其他命令实现如awk和expr,
expr最常用,它是一款表达式求值操作,要使用反引号而不是单引号
两点注意:
表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2