shell编程第一季

从今天开始,进入shell脚本编程大门,开启shell征途。

shell中的基本概念

1.环境变量IFS

IFS(Internal Field Seprator ) ,内部域分隔符,主要用来对文本的默认分隔符进行设置,默认情况下,对于一个文本,分隔符是space,tab,newline,也就是空格,Tab,换行。但是我们可以通过自己的修改来设置新的分隔符。
测试代码test00:

#!/bin/bash
#没有更改IFS值
var2="1 2 3 4 5 6"
for var1 in $var2
do
    echo "$var1"
done

测试结果:


./test00

更改IFS值后:

#!/bin/bash
#更改IFS
#test00

IFS_OLD=$IFS  #将原来的IFS保存为IFS_OLD
IFS='\n'   #设置新的IFS值为:换行符
var2="1 2 3 4 5 6"
for var1 in $var2
do
    echo "$var1"
done

输出结果为:


更改IFS后

再次看看添加'-'后的结果(修改后的代码):

#!/bin/bash
#更改IFS
#test00

IFS_OLD=$IFS  #将原来的IFS保存为IFS_OLD
IFS='-'   #设置新的IFS值为:换行符
var2="1-  2 -3 -   4-5- 6"  #注意间隔
for var1 in $var2
do
    echo "$var1"
done

输出结果:

修改IFS为“-”后

2.循环控制语句

在shell中,for循环遵循了C语言的语法,而基本循环语句和C语言也没什么不同,只是加了do,done,if-elif-else语句也只是添加了一个test command(中括号),也同样有break, continue语句,但是break语句中,默认的break是跳出内循环,(break 1);当要跳出上一层循环时,用break 2即可。

测试代码:

#!/bin/bash
#break out of an inner loop
#test20

for ((a =1; a < 4; a++))
do
    echo "Outer loop: $a"
    for ((b=1; b<100; b++))
    do
        if [ $b -eq 5 ]   # test command
        then 
            break
        fi  #if 语句的结束标志
        echo "  Inner loop: $b"
    done  #循环语句结束标志
done

输出结果:


Paste_Image.png

跳出外部循环:(修改test20)

#!/bin/bash
#break out of an inner loop

for ((a =1; a < 4; a++))
do
    echo "Outer loop: $a"
    for ((b=1; b<100; b++))
    do
        if [ $b -eq 5 ]   # test command
        then 
            break 2   #注意!!!!!!!
        fi
        echo "  Inner loop: $b"
    done
done

输出结果为:


跳出外部循环

until循环

注:在until,while循环中,都可以用多条test命令

#!/bin/bash
#until 多条test命令循环

var1=100
until echo $var1
    [ $var1 -eq 0 ]  #第二条test命令(当命令返回0状态码时停止循环)
do
    echo Inside the loop: $var1
    var1=$[$var1-25]
done

输出结果为:


until多test命令循环
上面提到了当test命令返回0状态码时结束循环,那么现在就来看看什么是命令的状态返回码。

退出状态代码

|代码|描述| |代码|描述|
|:-----|:---||----------:|-------:|
|0|命令成功完成||128|无效的退出参数|
|1|通常的未知错误||128+x|使用Linux信号x的致命错误|
|2|误用shell命令||130|使用CTRL-C终止的命令|
|126|命令无法执行||255|规范外的退出状态|
|127|没有找到命令|||

shell命令处理完毕后,都有一个退出状态,这个退出状态是一个介于0-255之间的整数值,当命令执行完毕后,命令就会把退出状态传递给shell,我们现在来检测它。鉴于Linux提供$?特殊变量来保存最后一条命令执行结束的退出状态,我们就用$?来核对退出状态。

1.命令成功执行完毕的状态码应为0:


成功执行

2.没有此命令:127:

没有此命令

3.退出状态为126表示用户没有权限执行这条命令:

无权限

4.常见的未知错误:

未知错误

5.shell默认返回最后一条命令执行后的退出状态码,但我们可以自己设置返回状态码,用exit语句,不过要小心,因为状态码范围是0-255:

#!/bin/bash
#自己设置返回码

var1=10
var2=30
var3=$[$var1+$var2]
echo 结果是 $var3
exit 5  #自己设置的退出状态码(相当于高级语言里的return)
自己设置返回码
回顾上面的until语句,当test语句返回值是0,表示test条件符合,就退出循环。

3.处理循环输出

可以在shell脚本中使用管道或者重定向循环输出结果。可以在done命令的末尾添加命令来做到这一点:

#!/bin/bash

for ((a=1; a<10; a++))
do
    echo "The number is $a"
done > test.txt  #输出重定向
echo "The command is finished."

运行结果:


输出重定向

4.总结下test命令:条件判断命令

  1. 数值比较:
命令格式 描述 比较 描述
n1 -eq n2 n1是否等于n2 n1 -le n2 n1是否小于等于n2
n1 -ge n2 n1 是否大于等于n2 n1 -lt n2 n1是否小于n2
n1 -gt n2 n1是否大于n2 n1 -ne n2 n1是否不等于n2

2.字符串比较

|比较|描述||比较|描述|
|:---|:----||------:|------:|
|str1 = str2|检查str1是否与str2相同||str1 > str2|检查str1是否大于str2|
|str1 != str2 |检查str1是否不等于str2||-n str1|检查str1长度是否大于0|
|str1 < str2 |检查str1是否小于str2||-z str1|检查str1长度是否为0|

3.文件比较

|比较|描述||比较|描述|
|:------|:----||-------:|-----------:|
|-d file|file是否存在且是目录||-e file|是否存在|
|-f file|file是否存在且是一个文件||-r file|file是否存在且可读|
|-s file|file是否存在且不为空||-w file|file是否存在且可写|
|-x file|file是否存在且可执行||-O file|file是否被当前用户所有|
|-G file|file是否存在且默认组是当前用户组||||
|file1 -nt file2|file1是否比file2新||file1 -ot file2|file1是否比file2旧|
注意:文件的新旧指的是文件的创建时间。(越是早创建,越是旧)


5.shell同样有与或逻辑关系,&&,||分别表示。用在test命令中。双小括号(())的用途:不仅可以用于for的C式循环,还可以包含数序逻辑与比较表达式,除了test命令的数学操作符,还可以使用诸如val++(后增),!(逻辑非)(**取幂)<<(逐位左移)等。


总结

1. shell中的循环有until(一直循环知道test条件为真(返回码为0)),while(当test命令符合条件时循环)
2. for循环中可以使用C风格的循环头。
3. 结构与循环控制也用到了case, break, continue等。
4. shell允许我们使用标准命令重定向,以及管道传送。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352

推荐阅读更多精彩内容

  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 12,157评论 2 33
  • 为何叫做 shell ? shell prompt(PS1) 与 Carriage Return(CR) 的关系?...
    Zero___阅读 3,148评论 3 49
  • [TOC] Shell基本介绍 shell学习必备基础 Linux的基本使用 如何在bash上执行程序 简单的管道...
    J书越来越垃圾了阅读 1,317评论 0 4
  • 以前没有毕业的时候特别羡慕上班族,后来自己终于离开了学校踏入社会,才知道学校的生活才是让人无比羡慕的。 大概人生来...
    阿尼阿C呦阅读 185评论 0 0
  • 穿紧身白裤子出门时 你一定没照镜子 看过路人看你的眼神么? ▼ 白色裤子在你印象中,是不是显胖、难搭?特别是某宝的...
    穷少女恋物记阅读 666评论 0 1