Shell Script初入门

Shell script学习总结

shell script注意事项

  1. 命令的执行顺序 从上至下,从左至右
  2. 命令的执行:命令,参数间的多个空白都会被忽略掉
  3. 空白行也将被忽略掉,并且[tab]键所得的空白被同样视为空格键。
  4. 如果一行内容太多可以用“[Enter]”来扩展到下一行。
  5. “#”之后的语句是注释语句。执行时将被忽略。

Shell script的执行

假设我们有一个/home/doris/shell.sh脚本文件,执行该脚本文件的方法有如下几种:

  1. 直接命令执行, shell.sh必须有具备可读与可执行(rx)权限,然后:
    • 绝对路径执行:/home/doris/shell.sh
    • 相对路径执行:当前工作目录在/home/doris,则命令为 ./shell.sh
    • 变量"PATH"功能,将shell.sh放置在PATH指定的目录内,例如: ~/bin/.
  2. 以bash进程来执行(此时shell.sh只需要有r权限即可):通过"bash shell.sh"或"sh shell.sh"来执行,记住用这个方式来执行的时候要先进入到该文件所在目录中。
  3. source shell.sh也可以用来执行shell.sh文件,与"sh shell.sh"区别在于source执行的bash进程就是父进程,而bash是在子进程中执行,在子进程中执行的命令的变量不会作用于主进程,只在子进程中起作用。

shell追踪与调试

在用sh执行shell脚本的时候可以对执行追踪与调试。
命令如下:

sh [-nvx] shell.sh
参数:
-n: 不需要执行shell.sh,仅仅查询语法的问题。
-v: 在执行script前,先将script的内容输出到屏幕上。
-x: 将使用到的script内容显示在屏幕上,可以跟踪每一个执行的命令。

在这个命令中,-x是一个非常有用的参数,可以帮助我们查看sh执行的过程,快速定位错误在那里。

Shell script 语法

  • 编写shell script程序的结构:

    1. 每一个shell文件第一行必须有类似#!/bin/bash用来申明使用什么shell来执行,而这里我们是用bash来执行shell。
    2. 程序说明用#来注释对这个文件的说明。
    3. 主要环境变量的说明,一般用来定义PATH变量。(用set -可以用来查看当前设置的环境变量)。比较重要的环境变量还有LANG与文件编码有关,有时候得到的结果与预期的不一样的时候,你可以先检查一下编码是否和你的预期的一样。
    4. 主要程序部分,命令的集合。
  • test命令
    1 "文件类型"判断
    test xxx filename

       参数      意义
       -e    该文件是否存在
       -f    该文件是否存在且为文件
       -d    该文件是否存在且为目录
       -b    该文件是否存在且为一个block device 设备
       -L    该文件是否存在且为一个连接文件
       -c    该文件是否存在且为一个character device设备
       -S    该文件是否存在且为一个Socket文件
       -p    该文件是否存在且为一个FIFO(pipe)文件
    

    2 文件权限检测
    test xxx filename

      参数   意义
      -r   该文件是否存在且具有可读权限
      -x   该文件是否存在且具有可执行权限
      -w   该文件是否存在且具有可写权限
      -s   该文件是否存在且为"非空白文件" 
    

    3 两个文件之间的比较
    test file1 xx file2

    参数  意义
    -nt (newer than)判断file1是否比file2新
    -ot (older than)判断file1是否比file2旧
    -ef 判断两个文件是否是同一个文件,主要在于判断两个文件是否指向同一个文件结点
    

    4 两个整数之间的判断
    test n1 xx n2

    参数  意义
    -eq n1是否等于n2(equal)
    -ne 不相等
    -gt n1大于n2
    -lt n1小于n2
    -ge n1大于等于n2    
    
    

    5 字符串判断

    Test -Z string 判断字符串是否为0,字符串为空字符串,返回为true。
    Test -n string 判断字符串是否非空,字符串非空时,返回true。
    test str1=str2 判断两字符串是否相等
    test str1!=str2 判断两字符串不相等

    6 多重条件判断连接符
    -a and
    -o or
    ! 非

    PS:
    1 除了用test命令之外,可以用[]判断符号,比如[ -z "$home" ]判断$home是否为空。还有一个需要注意的是,因为[]使用的地方很多,所以在作为判断符号的时候,中括号的两端需要空格键分隔。

  • 中括号内的每个组件都需要空格键来分隔

  • 中括号中的变量最好都以双引号括起来

  • 中括号中的常量最好都用单引号与双引号括起来
    原因如下:
    name="doris's jianshu"
    [ $name == "doris's jianshu" ]
    执行之后你会发现报错: too many arguments
    为什么呢? 分析一下原因:展开上述判断式为[ doris's jianshu = "doris's jianshu"]这样就有'doris's','jianshu'以及'doris's jianshu'三个参数,而判断式仅能两个数据比较。所以就报错了。所以应该加上双引号,变成[ "doris's jianshu" == "doris's jianshu"].

2 在bash当中===是一样的,不过一般用=表示变量的设置,==用于逻辑判断。

  • shift 用于参数变量号码偏移, shift 3表示参数偏移3个,从第四个开始取。

  • 默认变量,在shell script存在默认变量名,比如下面这个命令:

    /home/doris/shell.sh 1, 2, 3
    $0 $1 $2 $3
    其中参数1,默认变量名为$1,所以在shell文件中可以利用$1来代表第一个参数,从而对它操作。

条件判断式

1 if[];...then...fi
2 if[];...then..elif[];..then...else..fi
3 当变量是固定值的时候,可以使用case判断式,如果有学习过JAVA的,其实就相当于switch语句。
case $变量名称 in
"第一个变量内容")
;;
"第二个变量内容")
;;
*)//其他变量
;;
esac

循环(loop)

1 while [condition] 当condition不成立时才停止。
do
程序段落
done

2 until [condition] 当condition成立时才停止与while do done相反。
do
程序段落
done
3 for var in con1,con2,con3 依次读取con1,con2,con3执行程序段落
do
程序段落
done
4 for ( ( 初始值1; 限制值; 执行步长) )
do
程序段落
done

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

推荐阅读更多精彩内容

  • 1.创建文件夹 !/bin/sh mkdir -m 777 "%%1" 2.创建文件 !/bin/sh touch...
    BigJeffWang阅读 10,019评论 3 53
  • 一、shell脚本介绍 1.1 开头(环境使用shebang机制) #!/bin/bash 必须写在文件首行 符号...
    优果馥斯阅读 3,270评论 0 1
  • Shell 快速指南 概述 什么是 shell Shell 是一个用 C 语言编写的程序,它是用户使用 Linux...
    静默虚空阅读 700评论 0 5
  • 1.建立和运行shell程序 什么是shell程序呢? 简单的说shell程序就是一个包含若干行shell或者li...
    运维阿文阅读 1,475评论 0 9
  • 今日天气 低温直线上升呀!不过看着还是比杭州好些! ―――――――――――――――――― 6:00每日一抽 第21...
    陈恒丽阅读 146评论 0 0