第六章 ---- 创建高级 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 脚本中使用编程构造

编写脚本问价的步骤

  1. vi test.sh
  2. 编写脚本
  3. 赋予执行权限 chmod 764 test.sh
  4. 执行脚本 ./test.sh

执行脚本的方式

第一种(需要执行权限)

  1. 绝对路径:当前 shell 中创建子 shell,脚本在子 shell 中运行。
    脚本运行完毕,子 shell 退出,回到父 shell 中
  2. 相对路径./
    当前 shell 中创建子 shell,脚本在子 shell 中运行
    脚本运行完毕,子 shell 退出,回到父 shell 中

第二种(不需要执行权限)
bash sh.sh0
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]
$?是一个内置变量,存储函数,脚本/指令的退出状态:

  1. 创建 function.sh 脚本
  2. 赋予执行权限 chmod 764 function.sh
  3. 执行脚本 ./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:执行脚本的命令,而非函数名

猜你喜欢

转载自blog.csdn.net/qq_52354698/article/details/124404382
今日推荐