1.基础示例
说明:第一行是脚本使用的Shell,即/bin/bash路径的Bash程序。
#!/bin/bash
echo "Hello World"
2.将指定信息存储到log文件中
#!/bin/bash
echo "Hello World" > log
uname -a >> log
3.参数
test.sh
#!/bin/bash
echo "第1个参数 $0"
echo "第2个参数 $1"
echo "第3个参数 $2"
echo "第4个参数 $3"
运行:
sh test.sh Hello World
输出:
第1个参数 test.sh
第2个参数 Hello
第3个参数 World
第4个参数
4.脚本返回码
如果脚本中出现exit
命令,脚本会在这一行停止并返回返回码。
test.sh
#!/bin/bash
echo "第1个参数 $0"
echo "第2个参数 $1"
exit 1
echo "第3个参数 $2"
echo "第4个参数 $3"
运行:
sh test.sh Hello World
输出:
第1个参数 test.sh
第2个参数 Hello
运行:返回脚本的返回码
echo $?
输出:
1
5.函数
函数可以实现程序复用。一个函数可以包含多行脚本命令,调用时执行。
#!/bin/bash
function foo() {
echo hello 111
echo hello > log
uname -a >> log
}
foo
函数传参数。
#!/bin/bash
function foo() {
echo $1
echo $1 > log
uname -a >> log
}
foo hello
6.跨脚本调用
使用source命令实现跨脚本调用。source命令的作用是在同一个进程中执行另一个文件中的脚本。
下面的示例运行main.sh时,source命令执行test.sh文件,所以在后续使用时就可以调用test.sh中的foo函数。
test.sh
#!/bin/bash
function foo() {
echo $1
echo $1 > log
uname -a >> log
}
main.sh
#!/bin/bash
source test.sh
foo hello
7.逻辑判断
test命令后跟判断表达式,其中-gt
表示大于,所以3大于2成立,命令的返回代码是0;
#!/bin/bash
test 3 -gt 2;
echo $?
输出:
0
-lt
表示小于,所以3小于2不成立,命令的返回代码是1;
也可以进行文本值判断,其中a=b不成立,返回1;其中a!=b成立,返回0;
#!/bin/bash
test 3 -lt 2;
echo $?
test a = b;
echo $?
test a != b;
echo $?
输出:
1
-eq
表示等于
-ne
表示不等于
-ge
表示大于等于
-le
表示小于等于
判断文件状态:
文件是否存在:test -e file.out
文件是否存在,而且是普通文件:test -f file.txt
文件是否存在,而且是目录文件:test -d file
文件是否可读:test -r file.txt
文件是否可写:test -w file.txt
文件是否可执行:test -x file.txt
连接多个逻辑判断
非
:!exp
与
:exp -a exp
或
:exp -o exp
if [[ 3 > 2 && 4 > 2 ]]; then
echo 'success'
fi
//等价于
if [ 3 -gt 2 -a 4 -gt 2 ]; then
echo 'success'
fi
8.选择判断
[]
里边是判断表达式; fi
表示判断的结束。
#!/bin/bash
a = "abc"
if [ $a == "root" ]; then
echo 'root'
elif [ $a == "abc" ]; then
echo 'abc'
else
echo ''
fi
//判断文件是否存在
file = $1
if [ -e $file ]; then
echo '文件存在'
else
echo '文件不存在'
fi
case
判断。
语法规则:
case ${VAR} in
pattern1)
commands1
;;
pattern2)
commands2
;;
esac
示例:
*
代表任何多个或者0个普通字符;?
代表任意一个普通字符;[]
范围内一个字符。
#!/bin/bash
VAR="AABB"
case "${VAR}" in
*AB*)
echo "MATCH"
;;
*)
echo "UNMATCH"
;;
esac
输出:
MATCH
多选一
其中*AB
不匹配;*BB
匹配。
#!/bin/bash
VAR="AABB"
case "${VAR}" in
AB* | *BB)
echo "MATCH"
;;
*)
echo "UNMATCH"
;;
esac
输出:
MATCH
9.循环结构
while
循环。
#!/bin/bash
count=0
while [ $count -lt 10]
do
echo "$count"
let count+=1
done
for
循环。
命令ls log*将返回所有以log开头的文件名。循环时每个文件赋值给变量var。
#!/bin/bash
for var in `ls log*`
do
rm $var
done
//seq命令生成一个等差数列,后边可以跟三个参数,第一个参数表示整数数列的开始数字,第二个参数表示每次增加多少,第三个参数表示结束数字。
total=0
for number in `seq 1 1 100`
do
total=$(( $total + $number ))
done
echo $total
for
循环数组:@
表示所有参数
list=("a" "b" "c")
for i in ${list[@]}
do
echo $i
done
其中可以使用break
和continue
语句。
10.使用sh实现git自动化提交
#!/bin/bash
echo "build environment:$1";
echo "commit :$2";
branch=`git branch | grep "*"` # 获取分支名
br=${branch:2} # 去除多余的*
echo "branch $br"
msg="$2:default commit"
echo "git autopush start..."
git add .
git commit -m $msg
git push origin $br
echo "git autopush end..."