Shell使用说明书

2016-06-29 » iOS开发基础

1.关于Shell

1.Shell 脚本的基本元素

  1. 指定命令解读器 如:#!/bin/bash
  2. 注释 :说明某些代码的功能
  3. 可执行语句 :功能语句

2.指定命令解读器

一个.sh脚本执行的时候会先检查用户是否拥有该程序的执行权限

无:”Permission denied“ 提示

有:创建一个新的进程并执行语句

但是,Mac OSX 也是基于Unix 的 通常会同时安装多个Shell程序(sh,bash,csh等)

而不同的Shell程序语法有一定区别,到底使用哪个来执行代码系统无法正确判断,或者会默认调用执行导致执行结果并非我们期待的结果。

所以,Shell规定 “#!” 标识后面指定解释器的绝对路径 以方便创建指定解释器进程,解释并执行当前脚本。

3.Shell脚本中的注释和风格

Shell只支持单行注释 表示方法是#号

但是并不是说就只能用单行注释了 通过:« 后面写参数 ,但是要和结尾部分的参数想同 成对。

:<<xxx
echo "-----"
xxx

4.如何执行Shell程序

  1. 授权,直接执行 [ “chmod +x setup.sh” 然后 “./setup.sh” ]
  2. 调用Shell脚本的解释器来执行 [ /bin/bash setup.sh ]
  3. 通过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语言中 变量名的大小写是敏感的。

变量的类型:

  1. 不分数据类型 (Shell是动态弱类型语言)

  2. 不需要声明数据类型: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.代码自动校验