前言
Bash(或叫 shell)脚本是 Unix 和类 Unix 操作系统的一种常用脚本,提供了一种强大的方法来自动执行重复性任务,如果能好好加以利用可以为我们开发人员节省大量时间。作为 iOS 开发人员,使用 Bash 脚本可以帮助执行各种重复性的任务,例如自动化构建过程、管理文件系统、运行测试或部署应用等等。今天就来介绍一下。
编写和运行第一个 Bash 脚本
每个 Bash 脚本文件都以 #!/bin/bash 开头的。这主要是告诉计算机使用哪种类型的代码解释器。
我们新建一个名为 test.sh 的文件,用文本编辑器打开,输入以下代码:
#!/bin/bash
echo "Hello world!"
要运行这个脚本文件,只需要在终端中输入这个文件的路径:
/你的路径/test.sh
首次运行你可能会看到一个报错:
zsh: permission denied: /你的路径/test.sh
这是因为它没有权限执行,先运行命令:
chmod +x /你的路径/test.sh
然后再次运行这个脚本,就会看到终端中打印出了 Hello world!,这样,你的第一个 Bash 脚本就完成了。
基本语法
我们学习任何一种语言都要先学习其基本语法,下面是一些常用的 Bash 基础语法和示例:
解释器指令
前面也介绍过了,Bash 脚本通常以 #!/bin/bash 开始,表示使用 Bash 解释器来执行脚本。
注释:使用 # 开头的行表示注释,用于解释代码的作用和用途,不会被执行。
#!/bin/bash
# 这是一个示例的 Bash 脚本
echo "Hello, World!" # 打印 Hello, World!
变量:使用变量来存储和引用数据。变量名不需要声明,直接赋值即可。
#!/bin/bash
name="John"
echo "My name is $name." # 打印 My name is John.
输入输出:使用 echo 命令输出文本,使用 read 命令从用户处获取输入。
#!/bin/bash
echo "请输入你的名字?"
read name
echo "你好, $name!"
这段代码会先输出 请输入你的名字?,然后等待用户输入内容,输入完成后打印 你好, {输入的内容}!
条件语句:使用条件语句来进行条件判断和分支执行。
#!/bin/bash
echo "输入一个数字:"
read num
if [ $num -gt 10 ]; then
echo "输入的数字大于 10."
else
echo "输入的数字不大于 10."
fi
这里的 -gt 是一个表达式,用来判断输入的数字是否大于 10,除了 -gt,Bash 还提供了其他一些常用的比较运算符:
-eq:等于(equal)
-ne:不等于(not equal)
-lt:小于(less than)
-le:小于等于(less than or equal)
-gt:大于(greater than)
-ge:大于等于(greater than or equal)
循环:使用循环结构来重复执行一段代码。
for 循环:用于遍历列表或范围。
#!/bin/bash
for i in 1 2 3 4 5
do
echo $i
done
while 循环:在给定条件为 true 时重复执行代码块。
#!/bin/bash
i=1
while [ $i -le 5 ]
do
echo $i
((i++))
done
函数语法
函数是一种可重复使用的代码块,用于执行特定任务。其实只要学会了上边的基本语法,你就可以自己写一些简单的脚本了,但是要想用好 Bash,还是要学函数。
定义函数:使用 function 关键字或直接使用函数名来定义函数都可以。函数体要由 {} 包围。
#!/bin/bash
# 堆代码 duidaima.com
# 使用 function 关键字定义函数
function greet {
echo "Hello, World!"
}
# 直接使用函数名定义函数
bye() {
echo "Goodbye!"
}
调用函数:使用函数名后跟一对 () 来调用函数。
#!/bin/bash
greet # 调用 greet 函数
bye # 调用 bye 函数
函数参数:函数可以接受参数,参数通过 $1、$2、$3 等方式引用。
#!/bin/bash
# 定义带参数的函数
greet() {
echo "Hello, $1!"
}
# 调用 greet 函数,并传递参数
greet "Alice" # 输出 Hello, Alice!
greet "Bob" # 输出 Hello, Bob!
返回值:函数可以使用 return 语句返回一个值。返回值通过 $? 来获取。
#!/bin/bash
# 定义带返回值的函数
add() {
result=$(( $1 + $2 ))
return $result
}
# 调用 add 函数,并获取返回值
add 5 3
echo "结果为 $?" # 输出 结果为 8
脚本参数
在 Bash 脚本中,可以通过执行脚本时提供输入参数,以便脚本可以根据这些参数进行操作。
位置参数:位置参数是指在命令行上传递给脚本的参数。它们通过 $1、$2、$3 等方式引用,其中 $1 表示第一个位置参数,$2 表示第二个位置参数,以此类推。
#!/bin/bash
# 获取位置参数并打印
echo "第一个参数为: $0"
echo "第二个参数为: $1"
echo "第三个参数为: $2"
执行脚本时,可以通过空格分隔的方式传递位置参数,第一个参数 $0 默认为脚本路径:
./Test.sh 参数2 参数3
终端将会输出:
第一个参数为: ./Test.sh
第二个参数为: 参数2
第三个参数为: 参数3
特殊参数:Bash 还提供了一些特殊的变量来引用脚本的参数。
$#:表示传递给脚本的参数个数。
$*:表示所有位置参数的列表。
$@:表示所有位置参数的列表,每个参数都被引用为一个独立的字符串。
$?:表示上一个命令的退出状态。
#!/bin/bash
# 获取参数个数和参数列表
echo "参数个数: $#"
echo "参数分别为: $*"
# 遍历并打印参数
for arg in "$@"; do
echo $arg
done
echo "上一个命令的退出状态: $?"
默认值:可以使用 ${变量:-默认值} 的形式,为脚本参数设置默认值。如果变量没有被设置或为空,则使用默认值。
#!/bin/bash
# 使用默认值打印参数
name=${1:-"World"}
echo "Hello, $name!"
如果没有传递位置参数,则使用默认值 "World"。
$ bash script.sh
Hello, World!
写一个 iOS 开发相关的脚本
最后我们利用上边学到的知识,写一个 iOS 项目自动打包的脚本:
#!/bin/bash
# 定义变量
workspace="YourApp.xcworkspace"
scheme="YourScheme"
archivePath="YourArchivePath.xcarchive"
exportOptionsPlist="YourExportOptionsPlist.plist"
exportPath="YourExportPath"
# 定义函数
installDependencies() {
echo "开始安装 pod 依赖..."
pod install
echo "pod 依赖安装完成🍺"
}
buildIPA() {
echo "开始打包 IPA..."
xcodebuild archive -workspace $workspace -scheme $scheme -archivePath $archivePath
xcodebuild -exportArchive -archivePath $archivePath -exportOptionsPlist $exportOptionsPlist -exportPath $exportPath
echo "IPA 打包完成🍺🍺"
}
openFolder() {
echo "打开 IPA 文件夹..."
open $exportPath
}
# 调用函数
installDependencies
buildIPA
openFolder
echo "脚本执行完成."
在这个脚本中,我们先是安装 pod 依赖,然后开始打包 ipa,打包完成之后打开 ipa 所在的文件夹。学会了 Bash 脚本,你就可以用它来做很多重复性的事情,从而节省你宝贵的时间了。