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 jundestaff0 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 jundestaff0 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 andy18男 回车输出: 姓名: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

总结: 语法三和语法四都是从右侧第一个字符开始删除到左边,只是检查方向不一样
总结:
  • 左侧第一个字符向右边删除
    • # -> 表示查询方向从左向右
    • ## -> 表示查询方向从右向左
  • 右边第一个字符向左边删除
    • %-> 表示查询方向从右向左
    • %%-> 表示查询方向从左向右
思考题: 如何删除字符串中间部分?
【Shell脚本语言学习一】如果上述有错误的地方,敬请告知,谢谢!

    推荐阅读