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
通过上述操作我们就成功的给当前用户添加了对该文件的执行权限.
- Mac环境支持Shell开发
- Shell中类非常多
Bash是所有的操作系统默认脚本语言(免费、易用)
种类:bash、c Shell、K Shell等等...
在终端中执行这个脚本文件命令:
./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"
- 注意事项一, 定义变量时候,变量名处不需要加"$"符号
关键字: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脚本语言 -> 字符串
脚本代码:
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脚本语言学习一】如果上述有错误的地方,敬请告知,谢谢!
推荐阅读
- Shell-Bash变量与运算符
- 「按键精灵安卓版」关于全分辨率脚本的一些理解(非游戏app)
- C语言学习|第十一届蓝桥杯省赛 大学B组 C/C++ 第一场
- Linux|109 个实用 shell 脚本
- Xshell5|Xshell5 远程连接本地虚拟机Ubuntu16
- C语言学习(bit)|16.C语言进阶——深度剖析数据在内存中的存储
- 用了30天整理的一些GO语言学习资料,2019请你加油
- 5.|5. Python 入门- 课程 5 脚本
- linux作业9
- adb|adb 相关命令