1:shell函数
function funcname(){...}
只需要函数名就可以调用函数,比如:funcname
;
函数参数的传递就像脚本的函数传递一样,如下:
funcname arg1 arg2 arg3
函数接收参数如下:
function funcname(){
echo "$1" ($1->arg1)
echo "$2" ($2->arg2)
echo "$3" ($3->arg3)
echo "$4" ($4->arg4)
echo "$@" ($@->($1,$2,$3...))
}```
实际代码及运行结果如下:
function test(){
echo "$1"
echo "$2"
echo "$3"
echo "$4"
echo "$@"
}
called:
test this is a test
result:
zhangshuisheng:shell zhangshuisheng$ ./func.sh
this
is
a
test
this is a test
##2:流程操作
###2.1:条件语句
####2.1.1:if
if condition_1
then
command_1
else
command
fi
####2.1.2: if elif else
if condition_1
then
command_1
elif condition_2
then
command_2
elif condition_n
then
command_n
else
command
fi
####2.1.3:case语句
case $1 in
1) echo 'first param';;
2) echo 'second param';;
3) echo 'third param';;
*) echo 'default param';;
esac
代码示例:
!/bin/bash
function caseTest(){
case $1 in
1) echo 'first param';;
2) echo 'second param';;
3) echo 'third param';;
*) echo 'default param';;
esac
}
caseTest $1
result:
zhangshuisheng:shell zhangshuisheng$ ./case.sh 1
first param
zhangshuisheng:shell zhangshuisheng$ ./case.sh 2
second param
zhangshuisheng:shell zhangshuisheng$ ./case.sh 3
third param
zhangshuisheng:shell zhangshuisheng$ ./case.sh 4
default param
zhangshuisheng:shell zhangshuisheng$
###2.2:循环语句
####2.2.1:for语句
for var in item1 item2 itme3...itemn
do
command_1
command_2
...
command_n
done
代码示例:
function test(){
for var in $1 $2 $3 $4
do
echo $var
done
}
function test1(){
for var in $@
do
echo $var
done
}
called:
test this is a for exemple
test1 this is a for example
result:
zhangshuisheng:shell zhangshuisheng$ ./for.sh
test's result:
this
is
a
for
test1's result:
this
is
a
for
exemple
####2.2.2:while
total=0
i=0
while [ $i -lt $1 ]
do
let total=total+i
let i=i+1
echo $total,$i
done
执行以上代码
zhangshuisheng:shell zhangshuisheng$ ./while.sh 3
0,1
1,2
3,3
zhangshuisheng:shell zhangshuisheng$ ./while.sh 4
0,1
1,2
3,3
6,4
zhangshuisheng:shell zhangshuisheng$ ./while.sh 5
0,1
1,2
3,3
6,4
10,5
####2.2.3:while read line
while read line
do
echo $line
done <$1
called:
zhangshuisheng:shell zhangshuisheng$ ./whileRead.sh test
this is test1
this is test2
this is test3
this is test4
this is test5
以上test文件内容为:
this is test1
this is test2
this is test3
this is test4
this is test5
##3:运算符(test命令)
###3.1:数值(条件)比较
参数 | 说明 |备注
------------ | ------------- | ------------
-eq | 等于 |
-ne | 不等于 |
-gt |大于 |
-ge |大于等于|
-lt |小于 |
-le |小于等于 |
###3.2:字符串比较
参数 | 说明 |备注
------------ | ------------- | ------------
= | 等于 |
!= | 不等于 |
> | 不等于 | `/>`需要转义字符,否则被认为是输出重定向
< | 不等于 | `/<`需要转义字符,否则被认为是输入重定向
-z 字符串 |字符串长度为零则为真 |
-n 字符串 |字符串长度不为零则为真|
str 字符串 |检测字符串是否为空,不为空返回 true|
###3.3:文件测试运算符
参数 | 说明 |备注
------------ | ------------- | ------------
-e 文件名| 文件存在为真 |
-r 文件名| 文件可读为真 |
-w 文件名 |文件可写为真 |
-x 文件名 |文件可执行为真|
-s 文件名 |文件存在并且存在一个字符为真|
-d 文件名 |文件存在且为目录为真|
-f 文件名 |文件存在且为普通文件为真|
-O 文件名 |文件是否存在且属于当前用户所有|
-G 文件名 |检查问价是够存在且默认组与当前用户相同|
###3.4:布尔运算符
参数 | 说明 |备注
------------| ------------- | ------------
!| 非运算,表达式为 true 则返回 false,否则返回 true | [ ! false ] 返回 true
-o | 或运算,有一个表达式为 true 则返回 true | [ false -o true ] 返回 true
-a |与运算,两个表达式都为 true 才返回 true | [ true -o true ] 返回 true
###3.5:逻辑运算符
参数 | 说明 |备注
------------ | ------------- | ------------
&&| 逻辑的 AND | [[ true && false ]]双中括号 return false
ll | 逻辑的 OR | [[ true ll false ]]双中括号 return true
###3.6:高级特性
####3.7:使用双括号(())
对于上面提及的test命令,只允许在比较中进行简单的算数运算,而双括号允许将高级的数学表达式使用到比较之中
>格式:((expression1,expression2,...))
特点:
1、在双括号结构中,所有表达式可以像c语言一样,如:a++,b--等。
2、在双括号结构中,所有变量可以不加入:“$”符号前缀。
3、双括号可以进行逻辑运算,四则运算
4、双括号结构 扩展了for,while,if条件测试运算
5、支持多个表达式运算,各个表达式之间用“,”分开
符号 | 说明 |备注
------------ | ------------- | ------------
val++ | 后增 |((val++))
val-- | 后减|
++val | 前增|
--val |前减 |
ll | 逻辑或 |
&& | 逻辑和|
! | 逻辑求返|
~ | 位求返|
& | 位布尔和|
l | 位布尔或|
<<|左位移|
>>|右位移|
####3.8:使用双方括号[[]]
双方括号提供了字符串比较的高级特性。它使用test命令中采用的标准字符串能行比较,同时支持test命令不曾提供的一种匹配模式,即:模式匹配
>格式:[[expresion]]
##4: 变量的使用
>1:在shell中,使用变量之前并不需要事先为它们作出声明,通过使用来创建他们,默认情况下,变量被看做字符串并以字符串的形式来存储,在shell中变量是区分大小写的。
2:在shell中如果想要获取变量的内容,必须在变量名前加一个$
zhangshengdeMBP:shellexercis Bruce$ exemple=Hello
zhangshengdeMBP:shellexercis Bruce$ echo exemple
exemple
zhangshengdeMBP:shellexercis Bruce$ echo $exemple
Hello
zhangshengdeMBP:shellexercis Bruce$ exemple=7+5
zhangshengdeMBP:shellexercis Bruce$ echo $exemple
7+5
zhangshengdeMBP:shellexercis Bruce$ exemple=Happy every day
-bash: every: command not found
zhangshengdeMBP:shellexercis Bruce$ exemple="Happy every day"
zhangshengdeMBP:shellexercis Bruce$ echo $exemple
Happy every day
>注意:如果赋值的字符串里面有空格,就必须用引号把他们括起来。特别注意的是赋值符号(=)两侧不能有空格
###4.1 引号的使用
1. 脚本文件中的参数包含一个或多个空白字符(空格,制表符或者换行符),必须给参数加上引号
2. 双引号"$varname",程序执行到这时会把变量($varname)替换成它的值
3. 单引号'$varname',程序执行到这时,不会发生把变量($varname)替换成值得情况,即得到的是字符%varname。
4. 可以在$varname前加\(转义符)即\$varname取消它的特殊含义。
5. 对于反引号,是shell脚本中的最有用的特性之一。允许开发者将shell命令的输出复制给变量
总结来说:字符串通常放在双引号中,以防止变量被空白符分开,同事又允许$的扩展。当需要将一个命令的输出赋值给一个变量时,就方便的使用反引号``
示例展示:
!/bin/bash
read -p "Pleas input text " varname
echo "$varname"
echo '$varname'
echo $varname
echo $varname
result:
zhangshengdeMBP:shellexercis Bruce$ ./quotation
Pleas input text "happy every day"
"happy every day"
$varname
$varname
"happy every day"
反引号
zhangshuisheng:shell zhangshuisheng$ datetext=date
zhangshuisheng:shell zhangshuisheng$ echo $datetext
2016年 8月 4日 星期四 15时38分52秒 CST
###4.2:环境变量
环境变量 | 说明 |备注
------------| ------------- | ------------
$HOME|当前用户的home目录|`echo $HOME /Users/Bruce`
$PATH|以冒号分割的用来搜索命令的目录列表|`echo $PATH`
`/Users/Bruce/.nvm/versions/node/v5.3.0/bin:`
`/usr/local/bin:/usr/bin:/bin:`
`/bin:/usr/sbin:/sbin`
$PS1|命令提示符,通常是$,在bash中会使用一些更复杂的值|`echo $PS1 \h:\W \u\$`
h:机器名,W:当前目录,用户名
$PS2|二级提示符,用来提示后续的输入,通常是>字符|`$PS2 >`
$IFS|输入域分隔符,当shell读取输入时,它给出用来分隔单词的一组字符,通常是空格,制表符和换行符|
$0|shell脚本的名字|
$#|传递给脚本的参数个数|
###4.3:参数变量
参数变量 | 说明 |备注
------------| ------------- | ------------
$1,$2,$3...$n| 脚本程序的参数|
$*|在一个变量中列出所有的参数,各个参数之间用环境变量IFS中的第一个字符分隔开。如果IFO被修改了,那么$*将命令行分割为参数的方式将随之改变|
$@|它是$*的一种精巧的变体,它不使用IFS环境变量,所以即使IFS为空,参数也不会记在一起
代码示例:
code:
!/bin/bash
echo "$1:$1"
echo "$2:$2"
echo "$3:$3"
echo "$4:$4"
echo "$:$"
echo "$@:$@"
echo "$#:$#"
result:
./var.sh fir sec thi fou
$1:fir
$2:sec
$3:thi
$4:fou
$*:fir sec thi fou
$@:fir sec thi fou
$#:4
##5:数学运算
###5.1:expr命令处理数学表达式
预设:arg1=9 arg2=2
expr操作符|说明|例子
:--:|:--:|:-:
+ | 加法| ` test=expr $arg1 + $arg2 —>$text=11`
- | 减法| `expr $arg1 - $arg2—>$text=7`
* | 乘法| `expr $arg1 /* $arg2—>$text=18`
/ | 除法| `expr $arg1 / $arg2—>$text=4`
% | 取余| `expr $arg1 % arg2$—>$text=1`
= | 等于|
!= | 不等于|
> | 大于|
>= | 大于等于|
< | 小于|
< =| 小于等于|
I | 如果没有参数是null或是0,返回arg1,否则返回arg2|expr 0 \I 1
1
expr 2 \I 1
2
expr2 \I 4
2
& | 如果没有参数是null或是0 ,返回arg1,否则返回0| expr 2 \& 4
2
expr 2 \& 0
0
expr 0 \& 4
0
>注:许多expr操作符在shell中有其他意思,所以在脚本或是命令行上使用时很多的操作符前面需要使用转义字符(\)。
###5.2:使用$[ operation ]
$[ operation ] 标识来执行数学运算操作,实现等同的expr命令所实现的功能。
zhangshuisheng:tao800home zhangshuisheng$ echo $[1+5]
6
zhangshuisheng:tao800home zhangshuisheng$ echo $[1*5]
5
zhangshuisheng:tao800home zhangshuisheng$ echo $[1/5]
0
zhangshuisheng:tao800home zhangshuisheng$ echo $[1%5]
1
zhangshuisheng:tao800home zhangshuisheng$
>注:使用$[ operation ] 方式进行数学操作比起expr方便很多,并且也避免掉了在expr命令中字符多义需要使用转义字符进行转义的弊端。