最近在一次代码审查中,一位同事声称该[[ ]]构造比[ ]在类似的构造中更受欢迎
if [ "`id -nu`" = "$someuser" ] ; then
echo "I love you madly, $someuser"
fi
Run Code Online (Sandbox Code Playgroud)
他无法提供理由.有吗?
我想编写一个bash函数来检查文件是否具有某些属性并返回true或false.然后我可以在我的脚本中使用它"if".但是我该怎么回事呢?
function myfun(){ ... return 0; else return 1; fi;}
Run Code Online (Sandbox Code Playgroud)
然后我像这样使用它:
if myfun filename.txt; then ...
Run Code Online (Sandbox Code Playgroud)
当然这不起作用.如何实现这一目标?
我已经看到bash脚本以两种不同的方式测试非零长度字符串.大多数脚本使用-n选项:
#!/bin/bash
# With the -n option
if [ -n "$var" ]; then
# Do something when var is non-zero length
fi
Run Code Online (Sandbox Code Playgroud)
但是-n选项并不是真正需要的:
# Without the -n option
if [ "$var" ]; then
# Do something when var is non-zero length
fi
Run Code Online (Sandbox Code Playgroud)
哪种方式更好?
同样,这是测试零长度的更好方法:
if [ -z "$var" ]; then
# Do something when var is zero-length
fi
Run Code Online (Sandbox Code Playgroud)
要么
if [ ! "$var" ]; then
# Do something when var is zero-length
fi
Run Code Online (Sandbox Code Playgroud) 我已经定义了以下变量:
myVar=true
Run Code Online (Sandbox Code Playgroud)
现在我想按照以下方式运行:
if [ myVar ]
then
echo "true"
else
echo "false"
fi
Run Code Online (Sandbox Code Playgroud)
上面的代码确实有效,但如果我尝试设置
myVar=false
Run Code Online (Sandbox Code Playgroud)
它仍将输出真实.可能是什么问题?
编辑:我知道我可以做一些表格
if [ "$myVar" = "true" ]; then ...
Run Code Online (Sandbox Code Playgroud)
但它有点尴尬.
谢谢
在下面的简单示例中,如果脚本中未设置CONDITION ,则运行脚本将打印“True”。然而,人们会期望它打印“False”。这种行为的原因是什么?
# Set CONDITION by using true or false:
# CONDITION=true or false
if $CONDITION; then
echo "True"
else
echo "False"
fi
Run Code Online (Sandbox Code Playgroud) 我试图在循环中调用一个函数,并在它抛出时优雅地处理和继续。
如果我省略|| handle_error它只会像人们期望的那样停止整个脚本。
如果我离开|| handle_error那里,它将foo is fine在错误发生后打印并且根本不会执行handle_error。这也是预期的行为,这就是它的工作方式。
#!/bin/bash
set -e
things=(foo bar)
function do_something {
echo "param: $1"
# just throw on first loop run
# this statement is just a way to selectively throw
# not part of a real use case scenario where the command(s)
# may or may not throw
if [[ $1 == "foo" ]]; then
throw_error
fi
# this line should not be executed when $1 is …Run Code Online (Sandbox Code Playgroud) 这是一个场景 - 您开发 terraform 模块以供您的研发组织使用。它们已经被一两个微服务使用,相当于十几个 Pod。您确定了一个重构机会,例如将一些功能提取到自己的 terraform 模块中。太好了,但是现在你必须更新十几个 terraform 状态,因为这是 terraform 代码重构的代价。
经过一次这样的重构后,我发现自己花了 8 个小时来更新所有 terraform 状态。我以一种临时的方式来做这件事——使用 powershell 脚本包装各种 terraform 状态命令。如果经常这样做,一个人很快就会失去理智。
当然,我们可以说——不要重构。但这是不可能的,因为 terraform 代码是……代码。那么,有没有更好的方法呢?某种可以提供帮助的工具,不知何故?
如何编写if then语句,以便在这些变量之间切换,例如:
if(switch){
server_var_shortname=$server_shared_shortname
server_var=$server_shared
server_var_bare=$server_shared_bare
} else {
server_var_shortname=$server_vps_shortname
server_var=$server_vps
server_var_bare=$server_vps_bare
}
Run Code Online (Sandbox Code Playgroud)
我不熟悉bash语法,基本上只需要布尔值上的if / else语句。还可以这样使用true / false值吗?另外我该怎么做else语句?
$switch=true;
if $switch
then
server_var_shortname=$server_shared_shortname
server_var=$server_shared
server_var_bare=$server_shared_bare
fi
Run Code Online (Sandbox Code Playgroud) 在这个问题中,已经展示了如何在bash中使用整齐的布尔变量.有没有办法用这些变量执行逻辑运算?例如,如何得到这个:
var1=true
var2=false
# ...do something interesting...
if ! $var1 -a $var2; then <--- doesn't work correctly
echo "do sth"
fi
Run Code Online (Sandbox Code Playgroud) 我有一个像这样的詹金斯风格的脚本:
freeStyleJob(“test”) {
properties { githubProjectUrl(‘…’) }
description(‘’’job description’’’.stripMargin('|'))
logRotator{ numToKeep(100) }
parameters {
stringParam(’STRINGP1’, "", “STRINGP1 description”)
stringParam('STRINGP2’, "", “StringP2 description”)
booleanParam(‘b1’, false)
booleanParam(‘b2’, false)
booleanParam(‘b3’, false)
stringParam("EMAIL_LIST", "", "Emails")
}
scm {
github(‘repo’, '${STRINGP1}', 'git', ‘giturl’)
}
steps {
shell '''|#!/bin/bash
|ARGS=""
|fi
|if [[ ‘${b1}’ ]]; then
| ARGS=$ARGS" —-p b1”
|fi
|if [[ ‘${b2}’ ]]; then
| OS_ARGS=$ARGS" —-p b2”
|fi
|if [[ ‘${b3}’ ]]; then
| ARGS=$ARGS" —-p b3”
|fi
|echo ${ARGS}'''.stripMargin('|')
}
publishers { …Run Code Online (Sandbox Code Playgroud) 代码:
first=true
mountpoint=" "
partlist=`df -h | grep "^/dev"` # get partition info
for i in $partlist # loop through info
do
if [[ ${i:0:1} = "/" ]] # items starting with / are what I'm interested in
then
if [[ $first ]] # The first instance in each pair is the device name
then
mountdev=$i
mountpoint=" "
first=false
else # The second instance is the device mount point
mountpoint=$i
first=true
fi
if [[ $mountpoint != " " ]] # …Run Code Online (Sandbox Code Playgroud)