shell 编程-03-shell脚本简介和 set 的用法
Posted shark_西瓜甜
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell 编程-03-shell脚本简介和 set 的用法相关的知识,希望对你有一定的参考价值。
文章目录
一、什么是 shell script
https://www.jianshu.com/p/fee2c671585e
shell script 是利用 shell 的功能所写的一个“程序 (program)”,这个程序是使用纯文本文件,将一些 shell 的语法与指令(含外部指令)写在里面, 搭配正则表达式、管道命令与数据流重导向等功能,以达到我们所想要的处理目的。
简单的说,也就是可以使用一个普通的文本,写上多条 shell 命令,一起执行这些命令。
但是,在这个文件中可以添加一些逻辑判断什么的。
二、shell script 规范
- script 的功能;
script 的版本信息;
script 的作者与联络方式;
script 的版权宣告方式;
script 的 History (历史纪录);
script 内较特殊的指令,使用“绝对路径”的方式来下达;
script 运行时需要的环境变量预先宣告与设置。
三、简单脚本练习
vim show-name.sh
#!/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
父进程中执行脚本中代码
sh script
子进程中执行脚本中的代码,相当于打开了一个子 shell ,一个全新的环境。
五、script 的默认变量
位置变量
位置变量也属于预定义的变量
位置变量真对于脚本来说
位置变量是根据命令出现在命令行上的位置来确定的变量,在shell调用过程中,会按参数所在的位置进行调用。
$0 $1 $2 $3 ...$9
例如:
wc /etc/passwd /etc/group
例如:
编辑一个任意文件(这里是 position-arg.sh),写入如下内容
#!/bin/bash
echo "脚本名称是 $0"
echo "第一个参数是 $1"
echo "第二个参数是 $2"
echo "第三个参数是 $3"
此脚本地执行时,使用sh执行即可
sh position-arg.sh a b c d e
假如脚本中使用了一个位置变量,但是执行脚本的时候,传入了多个参数,程序并不会报错。
但是执行的时候只传入了一个参数,同样不会报错,并且 $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"
之意。
#!/bin/bash
echo "脚本名称$0"
echo "第一个参数是 $1"
echo "第一个参数是 $2"
echo "第一个参数是 $3"
echo '所有的参数分别是 $@' "$@"
echo '所有的参数分别是 $*' "$*"
echo "一共有参数 $# 个"
六、set
set -u
当脚本中遇到未定义的变量时,默认是忽略。
有时候这并不是开发者想要的。
假如有未定义的变量,应该报错,并且终止脚本继续运行。
set -u
就可以办到
示例
#!/usr/bin/env bash
set -u
echo $a
echo shark
执行报如下错误
$ bash set.sh
set.sh: line 13: a: unbound variable
分析
注意
set -u
a=`ls |grep 'asfdasdf'`
echo "|$a|"
# -u 只针对未定义的变量有效
# 这种情况,变量的值会是一个空字符串
# 所以脚本会继续执行
set -e
set -e
的作用就是:
在脚本执行中,有任何命令的返回值是非0
的情况,则正在运行的脚本则会退出。
设置 -e 之前
[root@kube-master set]# cat set-e-before.sh
#!/bin/sh
foo
echo "继续执行"
执行结果
[root@kube-master set]# sh set-e-before.sh
set-e-before.sh: line 3: foo: command not found
继续执行
设置 -e 之后
解决办法是在脚本中设置 set -e
[root@kube-master set]# cat set-e-after.sh
#!/bin/sh
set -e
foo
echo "继续执行"
执行结果
[root@kube-master set]# sh set-e-after.sh
set-e-after.sh: line 5: foo: command not found
但是,对于一组含有管道的命令无效,比如:
#!/usr/bin/env bash
set -e
foo | echo "shark" # 注意这里有管道符
echo "程序会继续运行"
执行结果
[root@kube-master set]# sh set-e.sh
shark
set-e.sh: line 2: foo: command not found # 这是报错信息
程序会继续运行
foo
不是 shell 中的命令,执行会报错,但是其后面有个管道,最终管道后的echo
命令执行成功了,这种情况下 脚本会继续执行。
解决办法是使用下面的 set -o pipefail
set -o pipefail
需要和
set -e
配合使用。
如果设置,如果管道中的所有命令都成功退出,整条命令的返回值才是0
。否则返回非0
。
默认情况下禁用此选项
示例脚本内容
# 设置 set -o pipefail 后,此时脚本就会终止运行
set -e
set -o pipefail
foo |echo ''
echo shark
执行效果
[root@kube-master set]# sh set-e-pipefail.sh
set-e-pipefail.sh: line 4: foo: command not found
以上是关于shell 编程-03-shell脚本简介和 set 的用法的主要内容,如果未能解决你的问题,请参考以下文章