准备找测试开发的工作,很多都是需要熟悉shell脚本的,所以看了下shell脚本的知识,恩。。。和PHP很像,上手还比较简单。下面mark下shell脚本的知识点。
shell基础
和我之前学过的C C++ .NET JAVA JS PHP语言不一样,shell定义变量时不需要加符号(和python有点像),而且变量名和等号之间不能有空格,当然和其他语言一样,变量命名必须遵循以下原则:
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
中间不能有空格,可以使用下划线(_)。
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)
除了显式地直接赋值,还可以用语句给变量赋值,如: for file in ‘ls /etc’
使用一个定义过的变量,只要在变量名前面加美元符号即可:echo ${your_name}
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变:myUrl=”http://www.w3cschool.cc” readonly myUrl
使用 unset 命令可以删除变量,变量被删除后不能再次使用。unset 命令不能删除只读变量。
变量类型有:局部变量,环境变量,shell变量.
string="abcd"
echo ${#string} #输出 4
echo ${string:1:4}#提取字符
string="runoob is a great company"
echo `expr index "$string" is` # 输出 8
shell数组用()表示,用空格分割,读取数组的格式是${数组名[下标]}
# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}
在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字
参数处理 | 说明 |
---|---|
$# | 传递到脚本的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数。如”$*“用「”」括起来的情况、以”$1 $2 … $n”的形式输出所有参数。 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数。如”$@”用「”」括起来的情况、以”$1” “$2” … “$n” 的形式输出所有参数。 |
$- | 显示Shell使用的当前选项,与set命令功能相同。 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
运算符
和其他语言一样,支持多种运算符、原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。
val=`expr 2 + 2`
echo "两数之和为 : $val"
关系运算符:
运算符 | 说明 | 举例 |
---|---|---|
-eq | 检测两个数是否相等,相等返回 true。 | [ $a -eq $b ] 返回 false |
-ne | 检测两个数是否相等,不相等返回 true。 | [ $a -ne $b ] 返回 true。 |
-gt | 检测左边的数是否大于右边的,如果是,则返回 true | [ $a -gt $b ] 返回 false |
-lt | 检测左边的数是否小于右边的,如果是,则返回 true | [ $a -lt $b ] 返回 true |
-ge | 检测左边的数是否大于等于右边的,如果是,则返回 true | [ $a -ge $b ] 返回 false |
-le | 检测左边的数是否小于等于右边的,如果是,则返回 true | [ $a -le $b ] 返回 true |
恩。。。我在JavaScript和css中也用到了,大部分语言时相同的
!非运算, -o或运算 , -a与运算。&&逻辑AND, | 逻辑OR. |
还有很多运算符,就不一一列举了,详见菜鸟
shell命令
echo命令:与 PHP 的 echo 指令类似,都是用于字符串的输出。echo string。
echo -e "OK! \n" # -e 开启转义
echo "It it a test"
printf命令:模仿 C 程序库(library)里的 printf() 程序
test命令:用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。详见菜鸟
流程控制
和Java、PHP等语言不一样,sh的流程控制不可为空,如果else分支没有语句执行,就不要写这个else。
if [ $(ps -ef | grep -c “ssh”) -gt 1 ]; then echo “true”; fi |
if else-if else语法:
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
for循环:for var in item1 item2 … itemN; do command1; command2… done;
while语句:while condition do command don
until 循环:until循环执行一系列命令直至条件为真时停止。 until循环与while循环在处理方式上刚好相反。 一般while循环优于until循环,但在某些时候—也只是极少数情况下,until循环更加有用。
until condition do command done
case:多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
跳出循环的break continue用法和其他语言一样.
shell函数
和其他语言一样,shell可以用户定义函数,然后在shell脚本中可以随便调用。
[ function ] funname [()]
{
action;
[return int;]
}
#1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
#2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。
输入\输出重定向
命令 | 说明 |
---|---|
command > file | 将输出重定向到 file。 |
command < file | 将输入重定向到 file |
command » file | 将输出以追加的方式重定向到 file |
n > file | 将文件描述符为 n 的文件重定向到 file |
n » file | 将文件描述符为 n 的文件以追加的方式重定向到 file |
n >& m | 将输出文件 m 和 n 合并 |
n <& m | 将输入文件 m 和 n 合并 |
« tag | 将开始标记 tag 和结束标记 tag 之间的内容作为输入 |
文件包含
Shell 也可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件
. filename # 注意点号(.)和文件名中间有一空格
或
source filename
实例:
# test1.sh文件
#!/bin/bash
url="http://www.runoob.com"
# test2.sh文件
#!/bin/bash
#使用 . 号来引用test1.sh 文件
. ./test1.sh
# 或者使用以下包含文件代码
# source ./test1.sh
echo "菜鸟教程官网地址:$url"
#我们为 test2.sh 添加可执行权限并执行:
$ chmod +x test2.sh
$ ./test2.sh
菜鸟教程官网地址:http://www.runoob.com