今天,我遇到了奇怪的野蛮行为,我做了一个简单的例子:
#!/bin/bash
if true or ! true; then
echo a;
else
echo b;
fi
if true -o ! true; then
echo a;
else
echo b;
fi
if true || ! true; then
echo a;
else
echo b;
fi
if true or
! true; then
echo a;
else
echo b;
fi
if true -o
! true; then
在下面的简单示例中,如果脚本中没有设置条件,则运行脚本输出"True“。然而,人们会期望它打印“假”。这种行为的原因是什么?
# Set CONDITION by using true or false:
# CONDITION=true or false
if $CONDITION; then
echo "True"
else
echo "False"
fi
在将应用于某些bash代码时,我了解到我并不确切地知道如何确定函数的退出状态。特别是,我想知道是否有任何成功的bash函数返回状态0,还是只有某些命令才能确保它返回状态0。
给出的例子如下:
#######################################
# Delete a file in a sophisticated manner.
# Arguments:
# File to delete, a path.
# Returns:
# 0 if thing was deleted, non-zero on error.
######################
我无意中发现了这段代码片段,并问自己它的意义:
if `getopt -T >/dev/null 2>&1` ; [ $? = 4 ]
then
#do a thing
else
#do the other thing
fi
让我恼火的是$?=4。这看起来像是对最后一个命令的退出代码的测试,因为“做一件事”和“做另一件事”与如何处理不同版本的getopt有关,但是它甚至有评估吗?如果是这样的话,是怎么做的?在if关键字之后,我从未见过这样的声明。
谢谢!
如果其中任何一个失败,如何让这个脚本检查命令的状态并退出:
#!/bin/sh
echo JFFS2 Preparation
cd /root
/root/config 1 > /root/formatted
if grep "PAR_JFFS2_FORMATTED = -1" /root/formatted; then
echo Need to Format MTD2
rm -f /root/formatted
flash_eraseall -j /dev/mtd2
echo Marking file system as formatted
在吉特钩-我想检查jshint错误和纱线完整性检查前推送,所以我增加了以下预推。所以就像这样-
# Pre-push hooks
# Lint stuff before committing
grunt jshint eslint tslint
# Verifies that versions and hashed value of the package contents
in the project’s package.json matches that of yarn’s lock file.
yarn check --integri
具有以下bash脚本:
#!/bin/bash
set -e
function foo() {
# commands that might fails and I want to exit my script
...
echo "result I need as output"
}
my_var=$(foo)
echo "I don't want this if there is an error inside foo"
使用set -e (在bash 4.4.19中)似乎不适用于子still,即仍然在执行最后一个echo命令)。如果
我正在写一个脚本,将在不同的服务器上自动执行命令,我试图记录它的所有内容和输出。我在重定向和命令状态输出方面有困难。这意味着该命令是否成功,其输出是什么? 我尝试过很多方法,比如将命令输出重定向到函数或文件。我尝试了一个简单的if语句。两人都为这些受人尊敬的功能工作。但是,当我尝试将它们组合在一起时,脚本总是返回成功的命令。在某种程度上是这样的。 #!/bin/bash
function Executing(){
if [ "$1" != "" ]; then
if [ $DEBUG = "true" ]; then