第六章 ---- 创建高级 Shell 脚本
使用命令替换
expr 命令
Shell 中所有的变量都会被视为字符串
var=25
而 expr
命令可以用来计算算术表达式
加号的两边必须都有一个空格
expr
命令支持的运算符包括:+、-、*、/ 和 % 。
但是在使用 * 时,前面要加上反斜杠(\)。否则 Shell 会将其解释为通配符。
上述命令显示2,而不是2.5.小数部分被直接忽略。
报错原因:2.5 中的小数点被 Shell 视为句号,因此 expr 将不会把变量 varl 的值视为数字。
expr 命令不支持小数点
test 命令
test
命令评估一个表达式,并返回“真(0)”或“假(1)”。
test
关键字还可以由 [] (方括号)替换。
test
和 [] 的语法分别是:
test expression
[expression]
test
命令可以用于比较变量的值。
"$var1" = "$var2"
如果 var1 和 var2 相同返回真
"$var1" != "$var2"
如果不同返回假
如果是 [] (方括号),[ 之后和 ] 之前必须有一个空格。
字符串和变量名可以加引号,也可以不加。
在 Shell 脚本中使用编程构造
编写脚本问价的步骤
vi test.sh
- 编写脚本
- 赋予执行权限
chmod 764 test.sh
- 执行脚本
./test.sh
执行脚本的方式
第一种(需要执行权限)
- 绝对路径:当前 shell 中创建子 shell,脚本在子 shell 中运行。
脚本运行完毕,子 shell 退出,回到父 shell 中 - 相对路径:
./
当前 shell 中创建子 shell,脚本在子 shell 中运行
脚本运行完毕,子 shell 退出,回到父 shell 中
第二种(不需要执行权限)
bash sh.sh
0
sh sh.sh
当前 shell 中创建子 shell,脚本在子 shell 中运行
脚本运行完毕,子 shell 退出,回到父 shell 中
第三种:在当前脚本中执行(不需要执行权限)
. sh.sh
if 构造
a=10
b=20
if [ $a == $b ]
then
echo "a 等于 b"
elif [ $a -gt $b ]
then
echo "a 大于 b"
else
echo "a 小于 b"
fi
elif
代表 else if
fi
知识构造的结尾
case … esac 构造
read -p "请输入1到4之间的整数" num
echo 你输入的数字为: $num
case $num in
"1")
echo 你选择了1
;;
"2")
echo 你选择了2
;;
"3")
echo 你选择了3
;;
*)
echo 你选择其他
esac
while 构造
int=1;
while(($int <= 5))
do
echo $int
let "int++"
done
until 构造
until构造
当条件不满足时,进入循环
until [ condition ] == while [ ! condition ]
do
程序段
done
a=0
until [ !$a -lt 10 ]
do
echo $a
a = $[ ${a} + 1 ]
done
for 构造
当变量名var的值在 in中,执行程序段
for var in con1 con2 con3 ...
do
程序段
done
for var in 1 2 3 4 5 11
do
echo the value is $var
done
continue
跳出当前循环,进入下一个循环
break
结束循环
continue 和 break 都不能在 if 构造中使用,只能在 while for until 循环构造中使用
处理 Shell 脚本中的参数
echo 命令本身为: $0
echo 第一个参数为: $1
echo 第二个参数为: $2
echo 第二个参数为: ${2}
echo 第九个参数为: $9
echo 第十个参数为: $10
echo 第十个参数为: ${10}
echo 第十一个参数为: ${11}
echo 参数的个数为: $#
echo 所有参数为: $*
执行脚本文件最多有9个参数
$0
:获取脚本命令本身
$1-9
:执行脚本的参数$1 == 第一个参数
如果参数超过了10个
通过${n}
来进行获取n>=10${10} == 第十个参数
$#
:获取参数的个数
$*
:获取所有的参数 参数格式:["$1c$2c$3c$4"]
c
代表空格
shift num
:参数偏移量为正整数 num >= 1,默认为1,参数的个数必须是 num 的整数倍,否则进入死循环
until [ $# -eq 0 ]
do
echo 第一个参数为: $1 参数的总个数为: $#
shift
done
调回 Shell 脚本
function 函数
函数在绝大多数情况下,我们在脚本 shell 中写函数
脚本的执行顺序是?
自上而下,自左而右
所以我们在编写脚本时,必须先创建函数,再调用函数(创建函数必须要在调用函数的前面)
[function] funname [()]{ action [return int] }
funname() {} (推荐) == function funname{}
[return int]
可以省略
1 . 如果省略,函数的返回值为函数中的最后一条指令的退出状态
2 . 如果不省略,int 的取值范围为 [0-255]
$?
是一个内置变量,存储函数,脚本/指令的退出状态:
- 创建
function.sh
脚本 - 赋予执行权限
chmod 764 function.sh
- 执行脚本
./function.sh
functionDemo(){
echo two num add
echo num1
read num1
echo num2
read num2
echo the num is $num1 and $num2
return $[${num1}+${num2}]
}
functionDemo
echo the sum is $?
functionWithParams(){
echo 命令本身为:$0
echo 第一个参数为:$1
echo 一共有 $# 个参数
echo 参数为:$*
}
functionWithParams 1 2 3 4 5 6
echo the return is $?
echo 命令本身为:$0
:执行脚本的命令,而非函数名