Shell使用说明书
2016-06-29 » iOS开发基础1.关于Shell
1.Shell 脚本的基本元素
- 指定命令解读器 如:#!/bin/bash
- 注释 :说明某些代码的功能
- 可执行语句 :功能语句
2.指定命令解读器
一个.sh脚本执行的时候会先检查用户是否拥有该程序的执行权限
无:”Permission denied“ 提示
有:创建一个新的进程并执行语句
但是,Mac OSX 也是基于Unix 的 通常会同时安装多个Shell程序(sh,bash,csh等)
而不同的Shell程序语法有一定区别,到底使用哪个来执行代码系统无法正确判断,或者会默认调用执行导致执行结果并非我们期待的结果。
所以,Shell规定 “#!” 标识后面指定解释器的绝对路径 以方便创建指定解释器进程,解释并执行当前脚本。
3.Shell脚本中的注释和风格
Shell只支持单行注释 表示方法是#号
但是并不是说就只能用单行注释了 通过:« 后面写参数 ,但是要和结尾部分的参数想同 成对。
:<<xxx
echo "-----"
xxx
4.如何执行Shell程序
- 授权,直接执行 [ “chmod +x setup.sh” 然后 “./setup.sh” ]
- 调用Shell脚本的解释器来执行 [ /bin/bash setup.sh ]
- 通过source命令执行 [ source setup.sh ]
5.Shell程序的退出状态
每个命令都会返回一个退出状态码 退出状态码是一个整数,有效范围是0~255,通常情况下,成功的命令返回0,而不成功的命令返回非0值。
我们也可以根据逻辑判断 主动exit 错误码到shell。
2.Shell脚本的参数
变量名称 | 说明 |
---|---|
$n | 表示传递给脚本的第n个参数,例如$1表示传人的第一个参数 |
$# | 命令行参数个数 |
$0 | 当前脚本的名称 |
$* | 以 ”参数1 参数2 参数3“ 的格式返回所有参数的值 |
$@ | 以 ”参数1“ ”参数2“ ”参数3“ 的格式返回所有参数的值 |
$_ | 保存之前执行的命令的最后一个参数 |
代码:
#!/usr/bin/env bash
echo "$@"
结果:
Mac $ ./setup.sh a "b,c"
a b,c
3.参数扩展
OPTIND,反映下一个要处理的参数索引 OPTARG 参数值
当我们需要更多的参数时 例如 :xx.sh -p 这种
echo "OPTIND start at $OPTIND"
while getopts ":pq:" optname;
do
case "$optname" in
"p" )
echo "Option $optname is specified"
;;
"q" )
echo "Option $optname has value $OPTARG"
;;
"?" )
echo "Unknown option $OPTARG"
;;
":" )
echo "No argument value for option $OPTARG"
;;
* )
echo "Unknown error"
;;
esac
echo "OPTIND is now $OPTIND"
done
1.getopts 允许把选项堆叠在一起(如 -ms)
2.如要带参数,须在对应选项后加 :(如h后需加参数 h:ms)。此时选项和参数之间至少有一个空白字符分隔,这样的选项不能堆叠。
3.如果在需要参数的选项之后没有找到参数,它就在给定的变量中存入 ? ,并向标准错误中写入错误消息。否则将实际参数写入特殊变量 :OPTARG
4.另外一个特殊变量:OPTIND,反映下一个要处理的参数索引,初值是 1,每次执行 getopts 时都会更新。
3.Shell的变量和引用
1.认识Shell中的变量
path=”/bin/xxx” Shell中给变量赋值,请别在等号两边留空白。
Shell语言中 变量名的大小写是敏感的。
变量的类型:
-
不分数据类型 (Shell是动态弱类型语言)
-
不需要声明数据类型:x=123 统一按照字符串存储,根据变量上下文允许执行不同的操作。
例如:x=123 let “x+=1” echo $x 得到124
定义变量的时候只需要写明变量名称,使用变量的时候$ 符号后跟变量名称,或者${变量名称}
变量的作用域:
-
9、shell
当前目录 path=$(pwd)
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数。
$0 : ./test.sh,即命令本身,相当于C/C++中的argv[0]
$1 : -f,第一个参数.
输出到文本 echo -e “alias codelog=’./spacecommander/code-log.sh’” »~/.bash_profile
字符串拼接 ${DIR}”/Format-objc-file.sh”
1、从左边第几个字符开始以及字符的个数,用法为:start:len,例如: str=’123456’ echo ${var:0:5} 结果:”12345”
2.路径截取,使用 # 号操作符。用途是从左边开始删除第一次出现子字符串即其左边字符,保留右边字符。用法为#substr,例如: str=’/file/text.txt’ echo ${str#/} 结果 “file/text.txt”
3.路径截取,使用 ## 号操作符。用途是从左边开始删除最后一次出现子字符串即其左边字符,保留右边字符。用法为##substr,例如: str=’/file/text.txt’ echo ${str##/} 结果 “text.txt”
shell中判断前一个命令是否执行成功
if [ $? -ne 0 ]; then
echo "fail"
else
echo "success"
fi
if [ $? -eq 0 ]; then
echo "success"
else
echo "fail"
fi
-eq 等于
-ne 不等于
-gt 大于
-lt 小于
ge 大于等于
le 小于等于
为开发更便捷而去写脚本,自动化处理
1.部署alias
1.项目自动 打tag并发布到podspec
#!/usr/bin/env bash
if [[ -d ".git" ]]; then
if [[ $# == 1 ]]; then
git add .
git commit -m "addTag : $1"
echo "---------->>> commit end"
git push
echo "---------->>> push end"
git tag $1
git push origin $1
echo "---------->>> addTag:$1 end"
elif [[ $# == 3 ]]; then
git add .
git commit -m "addTag : $1"
echo "---------->>> commit end"
git push
echo "---------->>> push end"
git tag $1
git push origin $1
echo "---------->>> addTag:$1 end"
pod repo push $2 $3 --verbose --allow-warnings
if [[ $? == 0 ]]; then
echo -e "\033[32m---------->>> pod repo push succeed !!!\033[0m\n"
else
echo -e "\033[31m---------->>> pod repo push failed !!!\033[0m\n"
fi
else
echo "Illegal Argument List"
fi
else
echo "Not a git repository"
fi
exit 0
2.快速提交
#!/usr/bin/env bash
if [[ -d ".git" ]]; then
if [[ $# == 1 ]]; then
git add .
git commit -m "feat : $1"
echo "---------->>> commit end"
git push
echo "---------->>> push end"
elif [[ $# == 2 ]]; then
git add .
git commit -m "$1 : $2"
echo "---------->>> commit end"
git push
echo "---------->>> push end"
else
echo "Illegal Argument List"
fi
else
echo "Not a git repository"
fi
exit 0
2.代码自动校验