Shell脚本-详解Shell脚本基础语法
1.shell 脚本创建与执行(01.sh)
一般都是**.sh
文件
#!
:需要用谁来解析执行该 shell 脚本echo
:打印输出
# 需要用谁来解析执行该 shell 脚本
#!/bin/bash
# echo 打印输出
echo "Hello Shell!"
2.自定义变量与环境变量(02.sh)
变量设计规则:
- 命名跟Java规范一样
- shell 中
默认都是字符串类
,如果需要用到其他类型,需要额外处理 - 变量用等号连接,千万注意
不能有空格
- 变量的值如果有空格,需要用
单引号
或者双引号
包括
$
:取变量的值echo "CMAKE_PATH = ${CMAKE_PATH}"
:输出环境变量CMAKE_PATH的值- soPath=`pwd`:记得带上``代表执行命令并返回
#指定一个命令的执行结果返回给变量
#soPath=$(pwd)
soPath=`pwd`
echo "soPath = ${soPath}"
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}"
3.位置参数变量与预定义变量
3.1.获取位置参数(03.sh)
$n
来获取参数,$0 代表程序本身,$1-$9
代表第一个参数到第九个参数,十以上的参数要用大括号${10}
$*
代表的是命令中的所有参数,加上引号才会把参数看成一个整体
“$0,$1,$2,$3, 4... 4... 4...n”,否则区别对待$@
代表命令中的所有参数,但是会把参数区分对待 “$0”,"$1",“ 2 " . . . " 2"..." 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
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"
4.条件判断(测试指令)(05.sh)
条件判断 test 表达式
或者 []
数字计算:
num3=$(($num1+$num2))
- num3=`expr $num1 + $num2` // 执行 expr命令,一定要有空格 传的三个参数
test $str1 == $str2
//==之间一定更要空格
字符串空判断:
[ str ]
: 测试字符串是否不为空,[]中间必须带空格test -n str
: 测试字符串是否不为空test -z str
: 测试字符串是否为空[ str1 = str2 ]
: 是否相等,[]中间必须带空格
数字:
[ 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
# 判断有没有输入
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
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
}
7.流程语句 for、while、case (06.sh)
for:
for((i=0;i<10;i++))
do
echo $i
done
while:
sum=0
i=1
while(($i<=100))
do
sum=$(($sum+$i))
i=$(($i+1))
done
echo "sum = $sum"
case:
case $2 in
start)
echo "start service"
;;
stop)
echo "stop service"
;;
*)
echo "invalid command"
echo "Usage:{start|stop}"
esac
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"