Shell script: 如果变量没定义

1 使用未定义变量的风险

文章[1]中给出了一个例子,

chroot=$1
...
rm -rf $chroot/usr/share/doc

运行这段代码,如果用户忘了输入参数,则系统目录下的文档全部被删掉了。

2 对策

set -u
或
set -o nounset 
前者是缩写,后者是完整表达方式。

使用“set -u”,可以使脚本在遇到未定义变量时终止运行。

3 在不确定变量是否被定义时,为其赋缺省值

格式:

变量名=${变量名:-[缺省值]}

例如:

a.sh:

#!/bin/bash

set -o nounset

# 因为VAR没定义,所以VAR被复制为缺省值abc
VAR=${VAR:-abc}
echo "\$VAR="$VAR

# 使用未定义的变量VAR,因为使用了set -o nounset,脚本被终止。
unset VAR
echo "\$VAR="$VAR

运行:

$ ./a.sh
$VAR=abc
./a.sh: line 9: VAR: unbound variable

如果不写缺省值,这下面的语句执行后,VAR为空字符串。

VAR=${VAR:-}

参考文献

1. Writing Robust Bash Shell Scripts
2. Shell script spec

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,384评论 19 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 47,054评论 6 342
  • 1.建立和运行shell程序 什么是shell程序呢? 简单的说shell程序就是一个包含若干行shell或者li...
    运维阿文阅读 5,351评论 0 9
  • 说明,本文所使用的机器是:SUSE Linux Enterprise。 问题定位 这看起来像是环境变量引起的问题,...
    lework阅读 8,009评论 6 11
  • Shell是什么? shell本身是一个命令解释器,介于操作系统的内核(kernel)态和用户态之间,可以执行系统...
    echoworlding阅读 28,201评论 11 81