相关疑难解决方法(0)

检查环境变量是否在Unix shell脚本中设置的简洁方法是什么?

我有一些Unix shell脚本,我需要在开始做之前检查某些环境变量是否已设置,所以我做了这样的事情:

if [ -z "$STATE" ]; then
    echo "Need to set STATE"
    exit 1
fi  

if [ -z "$DEST" ]; then
    echo "Need to set DEST"
    exit 1
fi
Run Code Online (Sandbox Code Playgroud)

这是很多打字.是否有更优雅的习惯用于检查是否设置了一组环境变量?

编辑:我应该提到这些变量没有有意义的默认值 - 如果有任何未设置,脚本应该出错.

unix bash shell

484
推荐指数
9
解决办法
37万
查看次数

将"test"的结果分配给变量

我正在编写一个脚本,我需要在几个地方使用文件测试的输出,包括shell函数内部.我想将文件存在分配给shell变量,如下所示:file_exists=[ -f $myfile ].

为了确保我已经覆盖了我的基础,我首先触摸一个文件,并测试它的存在:

file='a'
touch $file
if [ -f $file ]
then
    echo "1 -- '$file' exists"
fi
Run Code Online (Sandbox Code Playgroud)

输出:

1 -- 'a' exists
Run Code Online (Sandbox Code Playgroud)

该文件已成功创建 - 没有惊喜,但至少我知道我没有处理任何权限问题或任何事情.

接下来我测试以确保我可以在变量中存储布尔表达式:

mytest=/bin/true

if $mytest
then
    echo "2 -- \$mytest is true"
fi
Run Code Online (Sandbox Code Playgroud)

输出:

2 -- $mytest is true
Run Code Online (Sandbox Code Playgroud)

所以,我已经掌握了一些基本覆盖-条件表达式应该发出相同的输出/bin/true/bin/false...但是这不是我所看到的:

mytest=[ -f $file ]
if $mytest
then
    echo "3 -- \$mytest is true [expect true]"
else
    echo "3 -- \$mytest is false [expect true]"
fi
Run Code Online (Sandbox Code Playgroud)

此操作失败,并显示以下错误:

-f: …
Run Code Online (Sandbox Code Playgroud)

bash

16
推荐指数
2
解决办法
1万
查看次数

为什么测试"$?" 一个反模式,看一个命令是否成功?

在这里看到测试是否$?是零(成功)或其他东西(失败)是反模式,但我无法在其他任何地方找到它.

坚持维基百科反模式的定义:"反模式(或反模式)是对反复出现的问题的常见反应,这种反复出现的问题通常是无效的,并且可能会产生极大的反作用." 为什么这会是反模式?

bash shell sh

8
推荐指数
1
解决办法
476
查看次数

标签 统计

bash ×3

shell ×2

sh ×1

unix ×1