Shell脚本语言学习一

Shell脚本语言学习二
Shell脚本语言学习三


首先 进行基本的文件创建,以及权限查询修改等

  • 进入Mac终端在桌面创建文件

    终端命令:
    bogon:~ junde$ cd Desktop/
    bogon:Desktop junde$ touch shell.sh
    
  • 查询文件权限

    终端命令: 
    bogon:Desktop junde$ ls -l shell.sh
    输出结果:
    -rw-r--r--  1 junde  staff  0 11 16 17:07 shell.sh
    解释: r, w, x 分别代表读,写,执行 三种权限
         第一个 '-' 代表类型,通常文件都是'-'.当然还有其他类型,比如d表示目录等
         接下来 'rw-'  代表当前用户的权限,即属主权限
         再接下来 'r--'  代表当前用户所在组的成员对该文件的权限,即属组权限
         最后3个字符是r--,代表其他用户权限表示该文件对于其他用户来说也是只能读,不能写和执行。
         如果权限后面跟的有 '@' 这是mac系统的文件自带的一个表示文件有扩展属性的标示,与权限无关。 
         紧接着 '1' , number,即文件inode数量,inode表示储存文件元信息的区域
         然后 'junde' , 即 user,即当前用户名
         然后 'staff', 即 group,即当前用户所在的组的名字
         然后 '0' , 即 filesize,即该文件大小,单位是byte
         接着是修改时间: 11月16号17时07分
         最后是文件名称
    
  • 修改文件权限
    命令以及格式如下

    修改权限的命令格式 
    chmod [<权限范围><权限操作><具体权限>] [文件或目录…]
    
    <权限范围> 
    u:User,即文件或目录的拥有者。 
    g:Group,即文件或目录的所属群组。 
    o:Other,除了文件或目录拥有者或所属群组之外,其他用户皆属于这个范围。 
    a:All,即全部的用户,包含拥有者,所属群组以及其他用户。
    
    <权限操作> 
    +:表示增加权限 
    -:表示取消权限 
    =:表示唯一设定权限
    
    <具体权限> 
    r:表示可读取 
    w:表示可写入 
    x :表示可执行
    

    案例需求

    将当前用户增加执行权限
    命令:
    bogon:Desktop junde$ chmod u+x shell.sh 
    
    再次查看文件权限是否更改
    命令:
    bogon:Desktop junde$ ls -l shell.sh 
    输出结果
    -rwxr--r--  1 junde  staff  0 11 16 17:07 shell.sh
    

    通过上述操作我们就成功的给当前用户添加了对该文件的执行权限.


其次 Shell环境介绍

  • Mac环境支持Shell开发
  • Shell中类非常多
    Bash是所有的操作系统默认脚本语言(免费、易用)
    种类:bash、c Shell、K Shell等等...

最后 开始Shell语言的基础学习

以下都是使用Shell语言写在shell.sh文件中的脚本代码
在终端中执行这个脚本文件命令: ./shell.sh 而不是shell.sh 运行其它二进制的程序也一样,直接写 shell.sh,linux 系统会去 PATH 里寻找有没有叫 shell.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 shell.sh 是会找不到要执行的脚本文件的,也就执行不了文件中的命令,要用 ./shell.sh (文件名前加上./) 告诉系统说,就在当前目录找。

  • 第一个Shell程序

    脚本代码
        #!/bin/bash
        echo "Hello world!"
    解释:
        #! 表示约定标记,它告诉系统这个脚本需要什么解释器来执行,即是一种脚本体现
        echo:表示命令用于输出文本信息
        # 表示注释, 只有单行注释,如需要注释上面的输出文件命令行只需要前面加# `#echo "Hello world!"`  
    终端执行输出结果             
         Hello world!
    
  • Shell脚本语言->变量

    1> 定义变量注意事项:

    • 注意事项一, 定义变量时候,变量名处不需要加"$"符号

    • 注意事项二, 变量名中间不允许有空格

    • 注意事项三, 变量名和等号不能够有空格(和我们的一般语言不一样)

      正确写法:
          name="smile2017"
      错误写法:(报错 ./shell.sh: line 13: name: command not found)
          name ="smile2017"
      
    • 注意事项四, 变量名首字母必需是字母或者+下划线也可以(a-z、A-Z)

      正确
      age=100
      _age=100
      echo $变量名 可以输出变量值, 即 echo $age 或者 echo $_age 值都是100
      
    • 注意事项五, 不允许使用标点符号

      #错误写法
      na,me="simle2017"
      

2> 只读变量 -> 类似于通常所讲解常量

关键字:readonly(只读,不能够修改)
脚本代码:
       name="HelloApp"
       readonly name
如果后面还有脚本代码给 name 赋值,   
       eg: name="hehe"
       echo $name
则终端执行文件输出的值还是 'HelloApp', 并且会出现报错 './shell.sh: line 10: name: readonly variable'

3> 将变量删除

语法:unset(干掉了)
案例:unset 变量名
脚本代码:
      name="Andy"
      echo $name
      unset name
      echo $name
第一个输出的值 Andy, 第二个输出的值为空, 如果先将变量用 readonly 修饰,也是删除不了的.

4> 变量类型

类型一: 本地变量     
作用域: 整个bash进程都可以使用
语法(直接写的形式): name="bash"

类型二: 局部变量
作用域: 当前代码段
修饰符: local
语法: local name="Andy"

类型三: 环境变量
作用域:当前shell进程以及子进程
语法:export name="Dream"

类型四: 位置变量
脚本代码:
     fileName=${0}
     name=${1}
     age=${2}
     sex=${3}
     echo "姓名:${name} 年龄:${age} 性别:${sex}"
终端执行命令:
    ./shell.sh andy  18  男
回车输出:
    姓名:andy 年龄:18 性别:男
说明: 
    ${0}表示脚本文件名称
    参数从1开始

类型五: 特殊变量
    $0 是特殊变量,表示文件名称
    $? 也是特殊变量,表示返回上一个命令的执行状态返回值
        0:表示执行成功
        1:程序执行结果
        2:表示程序状态返回码(0-255)
        系统预留错误(1、2、127)
    $# 表示当前截止的脚本文件的参数个数
    $* 表示参数列表,将所有的参数列表组成一个字符串
    $@ 表示参数列表,各个参数是分开的
    $$ 表示当前Shell进程的ID
    $! 表示执行的上一个指令的PID(Progress ID),也就是Shell最后运行的后台Process的PID
脚本代码:
      echo ${0}
      echo ${?}
      echo ${#}
      echo ${*}
      echo ${@}
      echo ${$}
      echo ${!}
终端执行命令:
      ./shell.sh andy 18 男
输出结果:
      ./shell.sh
      0
      3
      andy 18 man
      andy 18 man
      1691
      空值
  • Shell脚本语言 -> 字符串

1> 字符串 -> 单引号

脚本代码:
      name='Andy'
      echo ${name}
终端执行输出:
      Andy

2> 字符串 -> 双引号

脚本代码:
      name="Andy"
      echo ${name}
终端执行结果:
      Andy

3> 字符串 -> 拼接

方式一
脚本代码:
      name="jack"
      age=18
      sex="man"
      info="${name} ${age} ${sex}"
      echo $info
终端执行结果:
      jack 18 man

方式二
脚本代码:
      name="Andy"
      age=100
      sex="男"
      info=" 姓名:"${name}"   年龄:"${age}"  性别:"${sex}""
      echo ${info}
终端执行输出:
      姓名:Andy 年龄:100 性别:男

4> 字符串 -> 获取字符串长度

脚本代码:
      name="HeHe"
      echo ${#name}
终端执行输出:
      4

5> 字符串 -> 截取

语法:${变量名:开始位置:截取长度}

案例需求一: 从字符串第三个开始截取,截取三个
脚本代码:
      name="I have a dream!"
      result=${name:2:3}
      echo $result
终端执行输出:
      hav

案例需求二: 从字符串第五个开始截取,到最后一个结束.
方式一
脚本代码: 
      name="I have a dream!"
      result=${name:4}
      echo $result
终端执行输出:
      a dream!
方式二
      name="I have a dream!"
      length=${#name}
      result=${name:4:length-4}
终端执行输出:
      ve a dream!

6> 字符串->删除

语法一:${变量名#删除字符串 正则表达式}
作用:从左边开始匹配要删除的字符串

案例需求一: 分别从左右侧删除字符串看效果
脚本代码一:
      name="I have a Dream"
      result=${name#Dream}
      echo ${result}
终端执行输出:(没有匹配到)
      I have a Dream
原因: 暂时测试发现,这种只能从字符串左侧第一个字符开始检索删除

脚本代码二:
      name="I have a Dream"
      result=${name#I}
      echo ${result}
终端执行输出:
      have a Dream


案例需求二: 查找指定字符串第一个,并且删除前面多有的字符串(包含自己)
脚本代码:
      name="I have a Dream"
      result=${name#*a}
      echo ${result}
终端执行输出:
      ve a Dream


案例需求三:执行删除范围(第一个开始删除,删除到哪里)
脚本代码
      name="I have a Dream"
      result=${name#I*D}
      echo ${result}
终端执行输出:
       ream

语法二: ${变量名##删除字符串 正则表达式}
作用:从字符串结尾(右边)开始匹配要删除字符串

脚本代码:
      name="I have a Dream"
      result=${name##*a}
      echo ${result}
终端执行输出:
      m

总结: 语法一和语法二都是从左侧第一个字符开始删除到右边,只是检查方向不一样

语法三:${变量名%删除字符串 正则表达式}
作用:从字符串结尾开始匹配,删除匹配的字符串.

案例需求一:查找第一个字符(匹配第一个)
脚本代码一:
      name="I have a Dream"
      result=${name%a}
      echo ${result}
终端执行输出:(没有匹配到)
      I have a Dream
原因: 暂时测试发现,这种只能从字符串右侧第一个字符开始检索删除

脚本代码二:
      name="I have a Dream"
      result=${name%m}
      echo ${result}
终端执行输出:
      I have a Drea


案例需求二:查找指定字符串第一个,并且删除前面所有字符(包含自己)
脚本代码:
      name="I have a Dream"
      result=${name%h*}
      echo ${result}
终端执行输出:
      I


案例需求三: 指定删除范围
脚本代码:
      name="I have a Dream"
      result=${name%r*m}
      echo ${result}
终端执行输出:
      I have a D

语法四: ${变量名%%删除字符串 正则表达式}

案例需求: 查找指定字符最后一个,并且删除前面所有的字符(包含自己)
脚本代码:
      name="I have a Dream"
      result=${name%%a*}
      echo ${result}
终端执行结果:
      I h

总结: 语法三和语法四都是从右侧第一个字符开始删除到左边,只是检查方向不一样

总结:

  • 左侧第一个字符向右边删除
    • # -> 表示查询方向从左向右
    • ## -> 表示查询方向从右向左
  • 右边第一个字符向左边删除
    • %-> 表示查询方向从右向左
    • %%-> 表示查询方向从左向右

思考题: 如何删除字符串中间部分?

如果上述有错误的地方,敬请告知,谢谢!

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

推荐阅读更多精彩内容