Shell-脚本简介和set用法

#一、什么是 shell script
shell script 是利用 shell 的功能所写的一个“程序 (program)”,这个程序是使用纯文本文件,将一些 shell 的语法与指令(含外部指令)写在里面, 搭配正则表达式、管道命令与数据流重导向等功能,以达到我们所想要的处理目的。

简单的说,也就是可以使用一个普通的文本,写上多条 shell 命令,一起执行这些命令。
但是,在这个文件中可以添加一些逻辑判断什么的。

#二、shell script 规范
script 的功能;
script 的版本信息;
script 的作者与联络方式;
script 的版权宣告方式;
script 的 History (历史纪录);
script 内较特殊的指令,使用“绝对路径”的方式来下达;
script 运行时需要的环境变量预先宣告与设置。

#三、简单脚本练习

#!/bin/bash
# Program:
#    User inputs 2 integer numbers; program will cross these two numbers.
# History:
# 2015/07/16    VBird    First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo -e "You SHOULD input 2 numbers, I will multiplying them! \n"
read -p "first number:  " firstnu
read -p "second number: " secnu
total=$((   ${firstnu}   *    ${secnu}  ))
echo -e "\nThe result of ${firstnu} x ${secnu} is ==> ${total}"

#四、执行脚本方式 (source script, sh script, ./script)

  • 父进程中执行脚本中代码
    source script = ./script
  • 子进程中执行脚本中的代码,相当于打开了一个子 shell ,一个全新的环境
    sh script

#五、script 的默认变量
###位置变量
位置变量也属于预定义的变量
位置变量真对于脚本来说
位置变量是根据命令出现在命令行上的位置来确定的变量,在shell调用过程中,会按参数所在的位置进行调用。

#####命令(shell脚本名) 参数1 参数2 参数3

$0    $1     $2     $3  ...$9

示例:

[root@localhost ~]# vim weizhi.sh
[root@localhost ~]# cat weizhi.sh
#!/bin/bash
echo "脚本名称是 $0"
echo "第一个参数是 $1"
echo "第二个参数是 $2" 
echo "第三个参数是 $3"

[root@localhost ~]# sh weizhi.sh
脚本名称是 weizhi.sh
第一个参数是 
第二个参数是 
第三个参数是

[root@localhost ~]# sh weizhi.sh a b c 
脚本名称是 weizhi.sh
第一个参数是 a
第二个参数是 b
第三个参数是 c

[root@localhost ~]# sh weizhi.sh a
脚本名称是 weizhi.sh
第一个参数是 a
第二个参数是 
第三个参数是

假如脚本中使用了一个位置变量,但是执行脚本的时候,传入了多个参数,程序并不会报错。
但是执行的时候只传入了一个参数,同样不会报错,并且 $1 $2 不会被赋值

###特殊变量

$# :代表后接的参数“个数”
$@ :代表 "$1" "$2" "$3" "$4" 之意,每个变量是独立的(用双引号括起来);
$* :代表"$1<u>c</u>$2<u>c</u>$3<u>c</u>$4",其中 <u>c</u> 为分隔字符,这个分为空白键, 所以本例中代表 "$1 $2 $3 $4"之意。
[root@localhost ~]# vim weizhi.sh
[root@localhost ~]# cat weizhi.sh
#!/bin/bash
echo "脚本名称$0"
echo "第一个参数是 $1"
echo "第一个参数是 $2"
echo "第一个参数是 $3"
echo '所有的参数分别是 $@'  "$@"
echo '所有的参数分别是 $*'  "$*"
echo "一共有参数 $# 个"

[root@localhost ~]# sh weizhi.sh 1 2 3 4 5 6 7 8 9 0 
脚本名称weizhi.sh
第一个参数是 1
第一个参数是 2
第一个参数是 3
所有的参数分别是 $@ 1 2 3 4 5 6 7 8 9 0
所有的参数分别是 $* 1 2 3 4 5 6 7 8 9 0
一共有参数 10 个

#六、set
###set -u

当脚本中遇到未定义的变量时,默认是忽略。
有时候这并不是开发者想要的。
假如有未定义的变量,应该报错,并且终止脚本继续运行。
set -u 就可以办到

示例:

[root@localhost ~]# vim set-u.sh
[root@localhost ~]# cat set-u.sh
#!/usr/bin/env bash
set -u

echo $a
echo chen

[root@localhost ~]# sh set-u.sh        
set-u.sh:行4: a: 未绑定变量

执行报错如上:变量a未定义报错,并且脚本停止运行


注意:
set -u

a=`ls |grep 'asfdasdf'`
echo "|$a|"

# -u  只针对未定义的变量有效
# 这种情况,变量的值会是一个空字符串
# 所以脚本会继续执行

###set -e

set -e 的作用就是:
在脚本执行中,有任何命令的返回值是非 0 的情况,则正在运行的脚本则会退出。

示例:

- 设置-e之前
[root@localhost ~]# vim set-e.sh
[root@localhost ~]# cat set-e.sh
#!/bin/sh

foo
echo "继续执行"

[root@localhost ~]# sh set-e.sh
set-e.sh:行3: foo: 未找到命令
继续执行

- 设置-e之后
[root@localhost ~]# vim set-e.sh
[root@localhost ~]# cat set-e.sh
#!/bin/sh

set -e

foo
echo "继续执行"

[root@localhost ~]# sh set-e.sh
set-e.sh:行5: foo: 未找到命令

执行报错如上:没有foo命令,并且脚本停止运行


注意:
对于一组含有管道的命令无效
[root@localhost ~]# vim set-e.sh
[root@localhost ~]# cat set-e.sh
#!/usr/bin/env bash

set -e

foo | echo "chen" 
echo  "程序会继续运行"

[root@localhost ~]# sh set-e.sh
chen
set-e.sh:行3: foo: 未找到命令
程序会继续运行

foo 不是 shell 中的命令,执行会报错,但是其后面有个管道,最终管道后的 echo 命令执行成功了,这种情况下 脚本会继续执行。

###set -o pipefail

需要和 set -e 配合使用。
如果管道中的所有命令都成功退出,整条命令的返回值才是 0。否则返回非 0。
默认情况下禁用此选项

示例:

[root@localhost ~]# vim set-o.sh
[root@localhost ~]# cat set-o.sh
set -e
set -o pipefail
foo |echo ''
echo chen

[root@localhost ~]# sh set-o.sh
set-o.sh:行3: foo: 未找到命令
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值