1.shell 脚本创建与执行(01.sh)
一般都是**.sh
文件
#!
:需要用谁来解析执行该 shell 脚本echo
:打印输出
1 | # 需要用谁来解析执行该 shell 脚本 |
指定一个命令的执行结果返回给变量
soPath=$(pwd)
soPath=pwd
echo “soPath = ${soPath}”1
2
str1=”str1” // str1
str2=str2 // str2
str3=3 // 3
str4=”Hello Shell” // Hello Shell
重新赋值
str4=str4 // str4
$取变量的值
echo “str1 = $str1” // str1 = str1
echo “str2 = $str2” // str2 = str2
echo “str3 = $str3” // str3 = 3
echo “str4 = $str4” // str4 = str4
输出环境变量
echo “CMAKE_PATH = ${CMAKE_PATH}”
指定一个命令的执行结果返回给变量
soPath=$(pwd)
soPath=pwd
// soPath = 当前路径
echo “soPath = ${soPath}”1
2
3
4
5
6
7
8
9
# 3.位置参数变量与预定义变量
## 3.1.获取位置参数(03.sh)
- `$n` 来获取参数,$0 代表程序本身,`$1-$9`代表第一个参数到第九个参数,十以上的参数要用大括号 `${10}`
- `$*` 代表的是命令中的所有参数,`加上引号才会把参数看成一个整体` "$0,$1,$2,$3,$4...$n",否则区别对待
- `$@` 代表命令中的所有参数,但是会把参数区分对待 "$0","$1","$2"..."$n"
- `$#` 代表参数中的个数
echo “$0=$0”
echo “\$1=$1”
echo “\$2=”$2
echo “\$=”$
echo “\$@=”$@
echo “\$#=”$#
每次逻动(删除)第一个参数
shift
echo “\$1=$1”
echo “\$@=”$@
echo “========================================”
for i in $*
do
echo $i
done
echo “========================================”
for i in $@
do
echo $i
done
echo “========================================”
for i in “$@”
do
echo $i
done
echo “========================================”
for i in “$*” // 加上引号才会看成一个整体
do
echo $i
done1
2
3
4
5
6
7
8
9
10
11
12
13
14
## 3.2.预定义变量
定义:是 bash 中已经定义好的,我们可以直接拿过来用,变量的作用都是固定
- `$?`:返回的是上一个执行命令的返回值,执行成功返回 0 ,执行失败返回非0
- `$$`:获取当前脚本的进程号
- `$!`:获取最后一个后台执行的进程号
## 3.3.获取输入的变量(04.sh)
- `read -p "提示" name`:name 代表接受的变量名
- `read -sp "提示" pwd`:`-sp 看不到输入的密码`,pwd 代表接受的变量名
- `read -t 5 -n 1 -p "please input [y|n]" input`:-t 5代表5秒没响应就退出,-n 1 代表只能输入1个字符
获取用户及时输入的参数
read -p “please input your name!” name
echo “name = $name”
输入年龄
read -sp “please input your password” pwd
echo “password=$pwd”
read -t 5 -n 1 -p “please input [y|n]” input
echo “input = $input”1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 4.条件判断(测试指令)(05.sh)
条件判断 `test 表达式` 或者 `[]`
数字计算:
- `num3=$(($num1+$num2))`
- num3=`expr $num1 + $num2` // 执行 expr命令,一定要有空格 传的三个参数
- `test $str1 == $str2` // `==之间一定更要空格`
字符串空判断:
- `[ str ]`: 测试字符串是否不为空,<font color=red>[]中间必须带空格</font>
- `test -n str`: 测试字符串是否不为空
- `test -z str`: 测试字符串是否为空
- `[ str1 = str2 ]`: 是否相等,<font color=red>[]中间必须带空格</font>
数字:
- `[ num1 -eq num2 ]`: 测试是否相等
- `[ num1 -ne num2 ]`: 不等
- `[ num1 -ge num2 ]`: >=
- `[ num1 -gt num2 ]`: >
- `[ num1 -le num2 ]`: <=
- `[ num1 -lt num2 ]`: <
文件:
- `test -d file`:是否是目录
- `test -f file`:是否是普通文件
- `test -e file`:文件是否存在
- `test -L file`:是否是链接
- `test -r file`:是否可读
- `test -w file`:是否可写
- `test -x file`:是否可执行
# 5.流程语句 if (06.sh)
有两种方式:
if [ 表达式 ]; then
if [ 表达式 ]
then1
2
判断有没有输入
if [ -z $1 ]
then
# echo "usage:./build_ogre.sh [build_type]"
# echo "build_type: Release or Debug (must have)"
# exit
error
fi
需要用户去指定编译 Debug 还是 Release
CMAKE_BUILD_TYPE=””
if [ “Debug” = $1 ]; then
CMAKE_BUILD_TYPE=”Debug”
elif [ “Release” = $1 ]; then
CMAKE_BUILD_TYPE=”Release”
else
error arm
fi1
2
3
4
5
6
7
# 6.自定义函数(06.sh)
- 函数需要先定义再使用,`function和()必须有其一`
- 可以直接采用方法名调用,不用加()
- $1 参数不是代表的脚本参数,而是方法传递过来的参数
// function和()可以只有一个
function error(){
echo “usage:./build_ogre.sh [build_type]”
echo “build_type: Release or Debug (must have)”
# 函数需要穿参数 arm $1 参数不是代表的脚本参数,而是方法传递过来的参数
echo "\$1 = $1"
exit
}1
2
3
4
# 7.流程语句 for、while、case (06.sh)
for:
for((i=0;i<10;i++)) do echo $i done 1
2
while:
sum=0
i=1
while(($i<=100))
do
sum=$(($sum+$i))
i=$(($i+1))
done
echo “sum = $sum”1
2
case:
case $2 in
start)
echo “start service”
;;
stop)
echo “stop service”
;;
*)
echo “invalid command”
echo “Usage:{start|stop}”
esac1
2
3
4
5
6
7
8
9
10
# 8.输出重定向(07.sh)
`0:` 标准输入,`1`:标准输出 `2`:标准错误输出
- `echo "Hello Shell!" > log.txt` // 输出日志到 log.txt 中,`>` 代表重新生成
- `echo "Hello Shell!" >> log.txt` // 输出日志到 log.txt 中,`>>` 代表追加
- `exec 1>log.txt`:标准的所有输出,`重新生成`全部添加到log.txt中
- `exec 2>>log.txt`:标准的错误输出,全部`追加`到log.txt中
永久重定向 echo 标准输入:0 标准输出:1 标准错误:2
exec 1>log.txt
exec 2>>log.txt
>> 代表追加,> 代表重新生成
临时重定向
echo “Hello Shell!” > log.txt
echo “Hello Shell!” >> log.txt
echo “Hello Shell”
echo “Hello Shell”
echo “Hello Shell”
```