shell基础

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`<br>`/Users/Bruce/.nvm/versions/node/v5.3.0/bin:`<br>`/usr/local/bin:/usr/bin:/bin:`<br>`/bin:/usr/sbin:/sbin`
$PS1|命令提示符,通常是$,在bash中会使用一些更复杂的值|`echo $PS1 \h:\W \u\$`<br>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 <br> 1<br>expr 2 \I 1<br>2<br>expr2 \I 4<br>2 
& |  如果没有参数是null或是0 ,返回arg1,否则返回0|  expr 2 \& 4<br>2<br>expr 2 \& 0<br>0<br> expr 0 \& 4<br>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命令中字符多义需要使用转义字符进行转义的弊端。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容

  • 概述 首先,咱们来了解一下,什么是Shell。操作系统内核给我们提供了各种接口,同时也提供了各种用户层的库,理论上...
    keysaim阅读 1,282评论 0 0
  • 第一节 Shell概述 1.Shell是什么 Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送...
    littlexjing阅读 1,783评论 0 1
  • Shell是一个"命令行解释器",它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以...
    tf_dejs阅读 390评论 0 1
  • 如果明天 你发现我不再向你道声早安 那么原因 一定是我热死在今晚的睡梦中 千万不要悲伤 我只是去了一个没有炎热的天...
    自卑小姐阅读 786评论 36 16
  • 吃完中饭,妈妈说一起去逛东部义乌小商品城吧! 爸爸开车,外面飘着小雨,我想打开天窗看看外面。 爸爸说:外面在下雨,...
    赋能姐在行动阅读 229评论 0 1