我已经看到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) 我正在尝试创建一个简单的bash脚本来检查网站是否已关闭,并且由于某种原因"and"运算符不起作用:
#!/usr/bin/env bash
WEBSITE=domain.com
SUBJECT="$WEBSITE DOWN!"
EMAILID="an@email.com"
STATUS=$(curl -sI $WEBSITE | awk '/HTTP\/1.1/ { print $2 }')
STRING=$(curl -s $WEBSITE | grep -o "string_to_search")
VALUE="string_to_search"
if [ $STATUS -ne 200 ] && [[ "$STRING" != "$VALUE" ]]; then
echo "Website: $WEBSITE is down, status code: '$STATUS' - $(date)" | mail -s "$SUBJECT" $EMAILID
fi
Run Code Online (Sandbox Code Playgroud)
"-a"运算符也不起作用:
if [ $STATUS -ne 200 ] -a [[ "$STRING" != "$VALUE" ]]
Run Code Online (Sandbox Code Playgroud)
你能告诉我什么时候使用:
我有dockerfile
FROM centos:7
ENV foo=42
Run Code Online (Sandbox Code Playgroud)
然后我建立它
docker build -t my_docker .
Run Code Online (Sandbox Code Playgroud)
并运行它.
docker run -it -d my_docker
Run Code Online (Sandbox Code Playgroud)
是否可以从命令行传递参数并在Dockerfile中使用if else?我的意思是
FROM centos:7
if (my_arg==42)
{ENV=TRUE}
else:
{ENV=FALSE}
Run Code Online (Sandbox Code Playgroud)
并使用此参数构建.
docker build -t my_docker . --my_arg=42
Run Code Online (Sandbox Code Playgroud) 我想在Bash脚本中引发错误,消息"Test cases Failed !!!".在Bash中如何做到这一点?
例如:
if [ condition ]; then
raise error "Test cases failed !!!"
fi
Run Code Online (Sandbox Code Playgroud) 我试图编写一个使用if语句的Bash脚本.
if [$CHOICE -eq 1];
Run Code Online (Sandbox Code Playgroud)
剧本是给我的错误,直到我后得到的空间[和之前]如下所示:
if [ $CHOICE -eq 1 ];
Run Code Online (Sandbox Code Playgroud)
我的问题是,为什么方括号周围的空间在Bash中如此重要?
在Bash中,我希望能够同时获取脚本并执行该文件.什么是Bash相当于Python的if __name__ == '__main__'?
我没有在Stackoverflow上找到关于这个主题的现成问题/解决方案(我怀疑我的问题是这样的方式与现有的问题/答案不符,但这是我能想到的最明显的方式.问题是因为我的Python经验).
ps关于可能的重复问题(如果我有更多时间,我会写一个更短的回复):
该链接到问题问:"如何检测如果脚本正在采购",但这个问题是问"你怎么创建一个bash脚本,既可以是采购和运行的脚本?".这个问题的答案可能会使用上一个问题的某些方面,但有其他要求/问题如下:
在Bash中,有一种简单的方法可以测试一个字符串是否按字典顺序小于或等于另一个字符串?
我知道你可以这样做:
if [[ "a" < "b" ]]
Run Code Online (Sandbox Code Playgroud)
用于测试严格的不平等,或
if [[ 1 -le 1 ]]
Run Code Online (Sandbox Code Playgroud)
对于数字.但-le似乎没有使用字符串,并使用<=给出语法错误.
我想重新创建这样的东西
if ( arg1 || arg2 || arg 3) {}
Run Code Online (Sandbox Code Playgroud)
我到目前为止,但我收到以下错误
line 11: [.: command not found
if [ $char == $';' -o $char == $'\\' -o $char == $'\'' ]
then ...
Run Code Online (Sandbox Code Playgroud)
我尝试了不同的方法,但似乎没有人尝试过我试过的一些方法
这可能已经回答了,但无论如何我都会问它.我有两个版本的脚本(comp.sh) -
#!/bin/sh
export tDay=$(date '+%Y%m%d')
newfile="filename_$tDay"
filename="filename_20120821100002.csv"
echo $newfile $filename
if [ $filename = *$newfile* ]
then
echo "Matched"
else
echo "Not Matched!"
fi
Output:
$ ./comp.sh
filename_20120821 filename_20120821100002.csv
Not Matched!
Run Code Online (Sandbox Code Playgroud)
和
#!/bin/sh
export tDay=$(date '+%Y%m%d')
newfile="filename_$tDay"
filename="filename_20120821100002.csv"
echo $newfile $filename
if [[ $filename = *$newfile* ]]
then
echo "Matched"
else
echo "Not Matched!"
fi
$ comp.sh
filename_20120821 filename_20120821100002.csv
Matched
Run Code Online (Sandbox Code Playgroud)
有人可以解释我为什么不同?
另外 - 在什么情况下应该[ ]使用vs. [[ ]]反之亦然?
我有一个包含两个多行字符串的脚本。我想知道它们是否相等。我还没有找到执行此操作的方法,因为尽管比较容易,但将变量的值传递给比较对象并不容易。我尚未成功将其传递给diff,但这可能是我的无能(我尝试过的很多事情都导致“文件名太长”错误)。一种解决方法是用一些稀有字符替换换行符,但是遇到了同样的问题。有任何想法吗?
bash ×9
if-statement ×5
shell ×3
syntax ×3
string ×2
docker ×1
dockerfile ×1
linux ×1
pipe ×1
scripting ×1