一 简介
android开发中进行动态库编译(.so文件)
ios开发中静态库编译(.a文件)
掌握shell可以修改和应用shell脚本,shell是用c语言开发的程序,是开发者和Linux系统的桥梁,shell有多版本脚本语言,其中bash是linux默认的语言,并且移植到多平台且相对简单易用,在开发中应用较为广泛。
二 创建及运行shell
mac系统下默认支持shell的开发环境,下面以命令行工具来演示一个hello world程序bash文件的demo
1 创建文件
cd /Users/yangyujing/Documents/bash练习
touch hello.sh
2 查看文件属性
bogon:bash练习 yangyujing$ ls -l hello.sh
-rw-r--r--@ 1 yangyujing staff 50 6 18 10:07 hello.sh
- 关于bash文件的权限问题
分为了4个部分(QQ群为例)
第一部分:文件类型->QQ群类型
第二部分:文件所有者->群主
第三部分:所有者同组用户->管理员
第四部分:其他用户->群成员
创建的bash文件默认都没有可执行权限,所以要加上
bogon:bash练习 yangyujing$ chmod +x ./hello.sh
bogon:bash练习 yangyujing$ ls -l hello.sh
-rwxr-xr-x@ 1 yangyujing staff 50 6 18 10:07 hello.sh
3 用文本编辑工具编辑hello.sh文件
#定义文件声明
#!/bin/bash
echo "hello world"
#!:表示约定标记,他会告诉系统这个脚本需要什么样子的解释器来执行,既是一种脚本体现。
echo:表示命令用于输出文本信息
4 执行脚本
bogon:bash练习 yangyujing$ ./hello.sh
hello world
三 变量
1 定义变量的注意事项
- 定义变量时候,变量名出不需要加"$"符号
- 变量名和等号不能够有空格(和我们的一般语言不一样)
- 变量名首字母必需是字母+下划线(a-z、A-Z)
- 变量名中间不允许有空格
- 不允许使用标点符号
2 只读变量readonly
name="hello 2019" #不能有空格
readonly name
name="hello 2020"
echo ${name}
#执行结果
#./hello.sh: line 9: name: readonly variable
3 删除变量unset
脚本代码:
name="jack"
echo ${name}
unset name
echo ${name}
echo "执行完毕"
执行结果
bogon:bash练习 yangyujing$ ./hello.sh
jack
执行完毕
4 变量类型
- 本地变量
作用域:整个bash进程可以使用
name="jack"
- 局部变量(local)
作用域:当前代码段
local name="jack"
- 环境变量(export)
作用域:当前shell进程及子进程
export name="jack"
- 位置变量
${0}特殊变量,获取文件名
位置参数从1开始获取
fileName=${0} #特殊变量 文件名称
name=${1} #取第一个参数
age=${2}
height=${3}
echo "name:${name} age:${age} height:${height}"
执行脚本
bogon:bash练习 yangyujing$ ./hello.sh jack 28 188
fileName:./hello.sh name:jack age:28 height:188
- 特殊变量
1 ${?} 表示返回上一个命令执行状态返回值
0:表示执行成功
1:程序执行结果
2:表示程序状态返回码(0-255)
系统预留错误(1、2、127)
2 $# 参数个数
3 $* 参数列表
4 $@ 参数列表
5 $$ 获取当前shell进程ID
6 $! 执行上一个命令PID
- ¥@和$的区别?
echo ${*}
echo ${@}
执行脚本
./hello.sh jack 28 188
脚本结果
${}->参数列表:将所有的参数组成一个字符串->“jack 28 188”
${@}->参数列表:分开的->“jack” “28” “188”
四 字符串
字符串可以用单引号也可以用双引号
1 字符串拼接
name="jack"
age='28'
height="188"
string1="${name}${age}${height}"
string2="name:${name} age:${age} height:${height}"
echo ${string1}
echo ${string2}
运行bash
bogon:bash练习 yangyujing$ ./hello.sh
jack28188
name:jack age:28 height:188
2 获取字符串长度
name="jack"
echo ${#name}
执行脚本
bogon:bash练习 yangyujing$ ./hello.sh
4
3 字符串截取
语法:${变量名:开始位置:截取长度}
案例一:从第几个截取几个
string="have a nice day"
echo ${string:2:2}
结果
bogon:bash练习 yangyujing$ ./hello.sh
ve
案例二:从第几个截取到结尾
string="have a nice day"
echo ${string:5}
结果
bogon:bash练习 yangyujing$ ./hello.sh
a nice day
4 字符串删除
语法一:${变量名#删除字符串 正则表达式}
作用:从字符串开头(左边)开始匹配要删除字符串
案例一:
string="have a nice day"
info=${string#nice}
echo ${info}
#执行结果have a nice day
原因:从做匹配第一个不是n,没有匹配成功,所以没有作删除操作。
案例二:匹配左侧第一个匹配成功
string="have a nice day"
info=${string#h}
echo ${info}
#执行结果ave a nice day
案例三:正则*
string="have a nice day"
info=${string#*n}
echo ${info}
#结果:ice day
删除了n以前所有的,
语法二:${变量名##删除字符串 正则表达式}
作用:从字符串结尾(右边)开始匹配要删除字符串
string="have a nice day"
info=${string##*a}
echo ${info}
#输出结果:y
总结:语法一和语法二,都是从左边删除到右边,查找方向不一样
语法三:${变量名%删除字符串 正则表达式}
作用:从字符串结尾开始匹配,从右删除匹配的字符串
案例一:从右侧开始匹配
string="have a nice day"
info=${string%h}
echo ${info}
#输出结果:have a nice day 证明从右开始第一个没有查询到
案例二:
string="have a nice day"
info=${string%y}
echo ${info}
#输出结果:have a nice da 证明从右开始第一个查询到并删除
案例三:从右匹配删除包括自身
string="have a nice day"
info=${string%a*}
echo ${info}
#输出结果:have a nice d
语法四:${变量名%%删除字符串 正则表达式}
作用:从字符串左侧开始查询匹配,从右侧删除
案例一:
string="have a nice day"
info=${string%%a*}
echo ${info}
#输出结果:h
四种语法总结:
- 从左边删除到右边
#->表示查询方向从左到右
##->表示查询方向从右到左 - 从右边删除到左边
%->表示查询方向从右到左
%%->表示查询方向从左到右