Shell 脚本学习 2018-05-26

编程是一种思想。

为什么这几天我都是下午才,,无语

续行符

vim escaped03.sh

  1 #!/bin/bash  
  2 echo "foo
  3 what" # 没区别
  4 #foo
  5 #what 
  6 echo
  7 echo 'foo
  8 what' # 续行
  9 #foo
 10 #what
 11 echo foo\
 12 bar  # 与上边一样,\还是作为续行符 
 13 # footbar
 14 echo
 15 echo "foo\
 16 bar"
 17 echo 'foot\
 18 bar' # 由于是强引用,所以\没被解释成续行符
 19 
 20 


2,退出和退出状态

exit 命令被用来结束脚本,就像 C 语言一样.他也会返回一个值来传给父进程,父进程会判断是否可用.每个命令都会返回一个 exit 状态(有时候也叫 return 状态).成功返回 0,如果返回一个非 0 值,通常情况下都会被认为是一个错误码.一个编写良好的 UNIX 命令,程序,和工具都会返回一个 0 作为退出码来表示成功,虽然偶尔也会有例外.

同样的,脚本中的函数和脚本本身都会返回退出状态.在脚本或者是脚本函数中执行的最后的命令会决定退出状态.在脚本中,exit nnn 命令将会把 nnn 退出码传递给 shell(nnn 必须是 10 进制数0-255).当一个脚本以不带参数 exit 来结束时,脚本的退出状态就由脚本中最后执行命令来决定.

读取最后执行命令的退出码.函数返回后,$?给出函数最后执行的那条命令的退出码.这种给函数返回值的方法是 Bash 的方法.对于脚本来说也一样.总之,一般情况下,0 为成功,非 0 失败 W.

vim exit0.sh

 1 #!/bin/bash
 2
 3 echo hello 
 4 echo $? # 返回 0,因为执行成功
 5
 6 lskdf # 不认识的命令.
 7 echo $? # 返回非 0 值,因为失败了.
 8
 9 echo
10
11 exit 113 # 将返回 113 给 shell.
12 # To verify this, type "echo $?" after script terminates.
12 # 为了验证这个,在脚本结束的地方使用"echo $?" 

效果如:


对于测试脚本中的命令的结果特别有用.

注意: !逻辑非操作,将会反转 test 命令的结果,并且这会影响 exit 状态.

 否定一个条件使用! 

vim exit1.sh

1 #!/bin/bash
  2 
  3 true # true 是 shell 内建命令,什么事都不做,就是 shell 返回 0 
  4 echo "exit status of \"true\" = $?" # 0 
  5 
  6 ! true # ! 需要一个空格
  7 echo "exit state of \"! true\" =$?" #1
  8 
  9 # !true 将导致一个"command not found"错误
 10  # 如果一个命令以'!'开头,那么将使用 Bash 的历史机制.就是显示这个命令被使用的历史.
 11 
 12 true
 13 ! true
 14 # 这次就没有错误了.
 15 # 他不过是重复了之前的命令(true). 

效果:

exit status of "true" = 0

exit state of "! true" =1


3,Test 结构

每个完整的合理的编程语言都具有条件判断的功能.Bash 具有 test 命令,不同的[]和()操作,和if/then 结构.

  1 什么情况下为真?

 vim testWtrue.sh

 1 # !/bin/bash
  2 
  3 # 如果不确定一个特定的条件如何判定
  4 # + 在一个 if-test 结构中测试它.
  5 
  6 echo
  7 echo "Testing \"0\"" 
  8 if [ 0 ] # zero
  9 then
 10    echo "0 is true."
 11 else
 12    echo "0 is false."
 13 fi      # 0 is true
 14 
 15 echo
 16 echo "Testing \"1\""
 17 if [ 1 ] # 1
 18 then
 19    echo "1 is true."
 20 else
 21    echo "i is flase,"
 22 fi
 23 
 24 echo
 25 echo "Testing \"-1\""
 26 if [ -1 ]
 27 then
 28    echo "-1 is true."
 29 else
 30   echo "-1 is false"
 31 fi
 32 
 33 echo 
 34 echo "Testing \"NUll\""
 35 if [ ] # NULL (控状态) 
 36 then
 37    echo "NULL is true."
 38 else
 39    echo "NULL is false"
 40 fi
 41 
 42 echo
 43 
 44 echo "Testing \"xyz\""
 45 if [ xyz ] # 字符串
 46 then
 47   echo "Random string is true."
 48 else
 49   echo "Random string is false."
 50 fi # Random string is true.
 51 
 52 echo
 53 
 54 echo "Testing \"\$xyz\""
 55 if [ $xyz ] # 测试$xyz 是否为 null,但是...(明显没人定义么!)
 56 # 只不过是一个未定义的变量
 57 then
 58   echo "Uninitialized variable is true."
 59 else
 echo "Uninitialized variable is false."
 61 fi # Uninitialized variable is false. 
 62 
 63 echo
 64 
 65 echo "Testing \"-n \$xyz\""
 66 if [ -n "$xyz" ] # 更学究的的检查
 67 then
 68    echo "Uninitialized variable is true."
 69 else
 70    echo "Uninitialized variable is false."
 71 fi # Uninitialized variable is false.
 72 
 73 echo
 74 xyz= # 初始化了,但是将其设为空值
 75 
 76 echo "Testing \"-n \$xyz\""
 77 if [ -n "$xyz" ]
 78 then
 79    echo "Null variable is true."
 80 else
 81    echo "Null variable is false."
 82 fi # Null variable is false.
 83 
 84 echo
 85 # 什么时候"flase"为 true?
 86 echo "Testing \"false\""
 87 if [ "false" ] # 看起来"false"只不过是个字符串而已.
 88 then
 89    echo "\"false\" is true." #+ 并且它 test 的结果就是 true.
90 else
 91    echo "\"false\" is false."
 92 fi # "false" is true.
 93 
 94 echo
 95 echo "Testing \"\$false\"" # 再来一个,未声明的变量
 96 if [ "$false" ]
 97 then
 98   echo "\"\$false\" is true."
 99 else
100   echo "\"\$false\" is false."
101 fi # "$false" is false.
102 # 现在我们终于得到了期望的结果
103 
104 # 如果我们 test 这个变量"$true"会发生什么结果?答案是和"$flase"一样,都为空,因为我
105 #+ 们并没有定义它.
106 echo
107 exit 0
Testing "0"
0 is true.

Testing "1"
1 is true.

Testing "-1"
-1 is true.

Testing "NUll"
NULL is false

Testing "xyz"
Random string is true.

Testing "$xyz"
Uninitialized variable is false.

Testing "-n $xyz"
Uninitialized variable is false.

Testing "-n $xyz"
Null variable is false.

Testing "false"
"false" is true.

Testing "$false"
"$false" is false.



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值