shell脚本

准备找测试开发的工作,很多都是需要熟悉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