sh

  • 空行报错 3: $'\r': 未找到命令; crlf 改为 lf

实例查看当前项目的根目录下 deploy.sh 文件

Shell 脚本(shell script),是一种为 shell 编写的脚本程序

  • windows 下执行 .sh 文件 可以用 git bash 执行 ./xx.sh 来运行

  • 分号为代码块标识

  • && 左边返回真后右边代码才会执行

  • exit 0 只有 0 表示退出时的状态为成功 其它都为失败

  • echo是回显,即代表回车显示,是自带换行的;而printf只是打印出来,没有换行

  • printf

%s %c %d %f 都是格式替代符,%s 输出一个字符串,%d 整型输出,%c 输出一个字符,%f 输出实数,以小数形式输出。
%-10s 指一个宽度为 10 个字符(- 表示左对齐,没有则表示右对齐),任何字符都会被显示在 10 个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
%-4.2f 指格式化为小数,其中 .2 指保留2位小数。

http://yangtze736.github.io/%E6%8A%80%E6%9C%AF/2018/05/02/shell-tips/

命令替换

输出结果暂时保存,在适当的地方输出

# 语句中需要执行一些命令,用如下方法包裹
$() 和 ``

# `` 嵌套时需要转义

# $() 不是所有的 shell 都能使用

# 执行 变量中的命令
command="ls"
${command}
  • 赋值语句两边不能有空格
#! /bin/sh   #! 告诉系统该脚本需要什么解释器来执行  可以不跟内容,也可以引用其它解释器路径

# 确保脚本抛出遇到的错误
set -e

# 定义变量可以直接写
name=hew  右是命令可以有空格 左边不能有空格
echo $name  用$获取变量值

# 获取工作目录
# pwd (print name of current/working directory)
dir="$(pwd)"
# 返回/e/practice

dir="$0"
# 返回 ./gitT/a.sh

dir="$(dirname "$0")"
# 返回 ./gitT

# 获取绝对地址
dir=$(cd "$(dirname "$0")";pwd)
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

以下两项操作,一般写在 shell 代码逻辑之前
set -x 会在执行每一行 shell 脚本时,把执行的内容输出来
set -e 会在执行出错时结束程序,就像其他语言中的“抛出异常”一样  

接收命令行参数

执行命令 ./some.sh p1 p2

#! /bin/sh

echo "文件名" $0        # 文件名 ./some.sh
echo "参数个数" $#      # 参数个数 2
echo "参数1" $1         # 参数1 p1
echo "参数2" $2         # 参数2 p2
echo "所有参数"$*# 所有参数 【p1 p2】

提交代码的脚本示例

#! /bin/sh
# 确保脚本抛出遇到的错误
set -e

method=${1:-"pull"} # 设置默认参数 注意 $1 的写法,:- 表示为空或未定义  只有 - 没有 : 表示判断未定义

# 如下模块类似 try catch
{ 
    git add -A
    git commit -m 'regular update'
    # 这里后面不要跟语句,否者这个模块的返回就是 true 就不会进入下面的模块执行
} || {
    echo '更改已commit 开始push'
    git push
    echo 'push 完成'
    exit 0
}

echo "commit 完成"
# 这里注意方括号内部两侧需要空格
if [ $method = "push" ]; then
    echo "git push"
    git push
else
    echo "git pull"
    git pull
fi
echo $method "完成"
exit 0

read 命令

# read var # 将用户输入存入 var 变量

# echo 用户输入了: $var

# read
# echo 用户输入了: $REPLY # linux 默认将用户输入放到此变量

# -p  提示信息
# -t  输入时间 单位默认秒
# -s  隐藏用户输入
# -n  输入的长度
# read -p "please input name|age:" 参数放后面
# echo 用户输入了: $REPLY

# 循环读取文件中的每一行
# cat ./deploy/test.sh | while read line;
# do
#     echo $line
# done
Last Updated:
Contributors: Warren, Warren