[/code][b][size=medium]Shell 传递参数[/size][/b]
在执行Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n
n代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……
例子:[i]为脚本设置可执行权限,并执行脚本,传递参数[/i]
写一个名为test.sh的脚本在脚本中打印出接收到的参数
[code="shell"]
echo "执行的文件名:$0";
echo "收到的第一个参数为:$1";
echo "收到的第二个参数为:$2";
echo "收到的第三个参数为:$3";
输出为:
执行的文件名:test.sh
第一个参数为:1
第二个参数为:2
第三个参数为:3
$ chmod +x test.sh
$ ./test.sh 1 2 3 #为脚本设置可执行权限,执行脚本并传递了3个参数进去
参数处理 说明
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数。
如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。
如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
相同点:都是引用所有参数。
不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。
[b][size=medium]Shell 数组[/size][/b]
Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与 PHP 类似)。与大部分编程语言类似,数组元素的下标由0开始。
格式:array_name=(value1 ... valuen)
#声明数组
my_array=(zhangshan tacy "C" f)
#用下标定义数组
array_name[0]=王五
array_name[1]=张珊
array_name[2]=B
#读取数组
${array_name[index]} #index为数组的下标
#获取数组中的所有元素
echo "数组的元素为: ${my_array[*]}" #二者效果一样
echo "数组的元素为: ${my_array[@]}"
#获取数组的长度
echo "数组元素个数为: ${#my_array[*]}"
echo "数组元素个数为: ${#my_array[@]}"
[b][size=medium]Shell 运算符[/size][/b]
Shell支持的运算符:算数运算符 关系运算符 布尔运算符 字符串运算符 文件测试运算符
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。
[i]expr 是一款表达式计算工具,使用它能完成表达式的求值操作。[/i]
例如,两个数相加([i]注意使用的是反引号 ` 而不是单引号 '[/i]):
#!/bin/bash
val=`expr 3 + 2`
echo "两数之和为 : $val"
#执行的结果为:两数之和为 : 5
下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:
运算符 说明 举例
+ 加法 `expr $a + $b` 结果为 30。
- 减法 `expr $a - $b` 结果为 10。
* 乘法 `expr $a \* $b` 结果为 200。
/ 除法 `expr $b / $a` 结果为 2。
% 取余 `expr $b % $a` 结果为 0。
= 赋值 a=$b 将把变量 b 的值赋给 a。
== 相等。用于比较两个数字,相同则返回 true。 [ $a == $b ] 返回 false。
!= 不相等。用于比较两个数字,不相同则返回 true。 [ $a != $b ] 返回 true。
注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]。
[b][size=medium]Shell之echo 输出[/size][/b]
echo用于字符串的输出,看例子:
[i]echo "赵云"[/i] #于PHP 的 echo 指令类似,都 是用于字符串的输出,可省略"" 如:echo 赵云
[i]echo显示转义字符[/i] 如:echo "\"that is a bird\" 输出:"that is a bird"
echo -e "我下面有一行空白因为我开启了转义! \n" # -e 开启转义
echo "ye i'm here"
输出为:
我下面有一行空白因为我开启了转义!
ye i'm here
[i]输出当前时间echo `date`[/i] 输出为:Fri May 27 08:31:12 UTC 2016
[i] 显示结果定向至文件[/i]
echo "It is a test" > yourfile
[b][size=medium]Shell之printf 输出[/size][/b]
printf 命令模仿 C 程序库(library)里的 printf() 程序。
标准所定义,因此使用printf的脚本比使用echo移植性好。
printf 使用引用文本或空格分隔的参数,外面可以在printf中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。默认printf不会像 echo 自动添加换行符,我们可以手动添加 \n。
printf 命令的语法:
printf format-string [arguments...]
说明:format-string: 为格式控制字符串
arguments: 为参数列表。
例子:
printf "赵玉建\n赵云"
输出结果为:
赵玉建
赵云
[i]printf的转义序列
序列 说明
\a 警告字符,通常为ASCII的BEL字符
\b 后退
\c 抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略
\f 换页(formfeed)
\n 换行
\r 回车(Carriage return)
\t 水平制表符
\v 垂直制表符
\\ 一个字面上的反斜杠字符
\ddd 表示1到3位数八进制值的字符。仅在格式字符串中有效
\0ddd 表示1到3位的八进制值字符[/i]
printf "%-10s %-8s %-4s\n" id name sex
printf "%-10s %-8s %-4.2f\n" 01 赵云 男
printf "%-10s %-8s %-4.2f\n" 02 吕布 男
printf "%-10s %-8s %-4.2f\n" 03 关羽 男
输出为:
id name sex
01 赵云 0.00
02 吕布 0.00
03 关羽 0.00
[b][size=medium]Shell之test[/size][/b]
test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试
数值测试
参数 说明
-eq 等于则为真
-ne 不等于则为真
-gt 大于则为真
-ge 大于等于则为真
-lt 小于则为真
-le 小于等于则为真
eg:
num1=100
num2=1000
if test $num1 -eq $num2
then
echo '两个数相等!'
else
echo '两个数不相等!'
fi
输出为:
两个数不相等!
字符串测试
参数 说明
= 等于则为真
!= 不相等则为真
-z 字符串 字符串的长度为零则为真
-n 字符串 字符串的长度不为零则为真
实例演示:
num1="shell"
num2="shell"
if test num1=num2
then
echo '两个字符串相等!'
else
echo '两个字符串不相等!'
fi
文件测试
参数 说明
-e 文件名 如果文件存在则为真
-r 文件名 如果文件存在且可读则为真
-w 文件名 如果文件存在且可写则为真
-x 文件名 如果文件存在且可执行则为真
-s 文件名 如果文件存在且至少有一个字符则为真
-d 文件名 如果文件存在且为目录则为真
-f 文件名 如果文件存在且为普通文件则为真
-c 文件名 如果文件存在且为字符型特殊文件则为真
-b 文件名 如果文件存在且为块特殊文件则为真
实例演示:
cd /bin
if test -e ./bash
then
echo '文件已存在!'
else
echo '文件不存在!'
fi
输出结果:
文件已存在!
另外,Shell还提供了与( -a )、或( -o )、非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为:"!"最高,"-a"次之,"-o"最低。例如:
cd /bin
if test -e ./notFile -o -e ./bash
then
echo '有一个文件存在!'
else
echo '两个文件都不存在'
fi
输出结果:
有一个文件存在!
[b][size=medium]Shell 流程控制[/size][/b]
if condition
then
command1
command2
...
commandN
fi
if condition
then
command1
command2
...
commandN
else
command
fi
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
num1=$[2*3]
num2=$[1+5]
if test $[num1] -eq $[num2]
then
echo '两个数字相等!'
else
echo '两个数字不相等!'
fi
[b][size=medium]Shell for循环[/size][/b]
for temp in 1 2 3 4 5 xx 赵玉娜 usa chian 3.25
do
echo "$temp"
done
输出结果为:
1
2
3
4
5
xx
赵玉娜
usa
chian
3.25
[b][size=medium]Shell while语句[/size][/b]
while condition
do
command
done
i=0
while(( $i<=10 ))
do
echo $i
let "i++"
done
结果为:
0
1
2
3
4
5
6
7
8
9
10
while :
do
command
done
或者
while true
do
command
done
或者
for (( ; ; ))
until循环执行一系列命令直至条件为真时停止。
until循环与while循环在处理方式上刚好相反。
一般while循环优于until循环,但在某些时候—也只是极少数情况下,until循环更加有用。
until 语法格式:
until condition
do
command
done
case
Shell case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
case工作方式如上所示。取值后面必须为单词in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。
取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。
下面的脚本提示输入1到4,与每一种模式进行匹配:
echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read aNum
case $aNum in
1) echo '你选择了 1'
;;
2) echo '你选择了 2'
;;
3) echo '你选择了 3'
;;
4) echo '你选择了 4'
;;
*) echo '你没有输入 1 到 4 之间的数字'
;;
esac
输入不同的内容,会有不同的结果,例如:
输入 1 到 4 之间的数字:
你输入的数字为:
3
你选择了 3
跳出循环
在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,Shell使用两个命令来实现该功能:break和continue。
break命令
break命令允许跳出所有循环(终止执行后面的所有循环)。
下面的例子中,脚本进入死循环直至用户输入数字大于5。要跳出这个循环,返回到shell提示符下,需要使用break命令。
#!/bin/bash
while :
do
echo -n "输入 1 到 5 之间的数字:"
read aNum
case $aNum in
1|2|3|4|5) echo "你输入的数字为 $aNum!"
;;
*) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"
break
;;
esac
done
执行以上代码,输出结果为:
输入 1 到 5 之间的数字:3
你输入的数字为 3!
输入 1 到 5 之间的数字:7
你输入的数字不是 1 到 5 之间的! 游戏结束
continue
continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。
对上面的例子进行修改:
#!/bin/bash
while :
do
echo -n "输入 1 到 5 之间的数字: "
read aNum
case $aNum in
1|2|3|4|5) echo "你输入的数字为 $aNum!"
;;
*) echo "你输入的数字不是 1 到 5 之间的!"
continue
echo "游戏结束"
;;
esac
done
运行代码发现,当输入大于5的数字时,该例中的循环不会结束,语句 echo "Game is over!" 永远不会被执行。
esac
case的语法和C family语言差别很大,它需要一个esac(就是case反过来)作为结束标记,每个case分支用右圆括号,用两个分号表示break。
[b][size=medium]Shell中的函数或方法定义[/size][/b]
跟javacript差不多,直接看例子
#定义函数
myfunction(){
echo "哥写的第一个shell函数"
}
#这样调用函数
myfunction
functionWithReturn(){
aNum=10
anotherNum=20
return $(($aNum+$anotherNum))
}
functionWithReturn
echo "输入的两个数字之和为$?!"
调用该函数并输出的结果为:
输入的两个数字之和为30!
[i]注意:函数返回值在调用该函数后通过 $? 来获得。
注意:所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。[/i]
#定义函数
funWithParam(){
echo "第一个参数为 $1 !"
echo "第二个参数为 $2 !"
echo "第十个参数为 $10 !"
echo "第十个参数为 ${10} !"
echo "第十一个参数为 ${11} !"
echo "参数总数有 $# 个!"
echo "作为一个字符串输出所有参数 $* !"
}
#调用函数并且传入参数值
funWithParam 1 关羽 3 4 5 6 赵云 8 9 34 73
结果为:
第一个参数为 1 !
第二个参数为 关羽 !
第十个参数为 10 !
第十个参数为 34 !
第十一个参数为 73 !
参数总数有 11 个!
作为一个字符串输出所有参数 1 关羽 3 4 5 6 赵云 8 9 34 73 !
[i]注意,[/i]$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。
另外,还有几个特殊字符用来处理参数:
参数处理 说明
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
[url]http://zhaoxiaoboblogs.iteye.com/[/url]