音视频:10.Shell脚本-详解Shell脚本基础语法

1.shell 脚本创建与执行(01.sh)

一般都是**.sh文件

  • #!:需要用谁来解析执行该 shell 脚本
  • echo:打印输出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 需要用谁来解析执行该 shell 脚本
#!/bin/bash

# echo 打印输出
echo "Hello Shell!"
```

# 2.自定义变量与环境变量(02.sh)

变量设计规则:

1. 命名跟Java规范一样
2. shell 中`默认都是字符串类`,如果需要用到其他类型,需要额外处理
3. 变量用等号连接,千万注意`不能有空格`
4. 变量的值如果有空格,需要用`单引号`或者`双引号`包括

- `$`:取变量的值
- `echo "CMAKE_PATH = ${CMAKE_PATH}"`:输出环境变量CMAKE_PATH的值
- soPath=`pwd`:记得带上``代表执行命令并返回

指定一个命令的执行结果返回给变量

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
done

1
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 [ 表达式 ]
then

1
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
fi

1
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}”
esac
1
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”
```

-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!
0%