对于想了解“if”语句在计算机上如何工作?的读者,本文将是一篇不可错过的文章,我们将详细介绍计算机中if语句,并且为您提供关于Bash中“if”语句的“and”运算符、bash中的“cat的有价值信息
对于想了解“if”语句在计算机上如何工作?的读者,本文将是一篇不可错过的文章,我们将详细介绍计算机中if语句,并且为您提供关于Bash 中“if”语句的“and”运算符、bash 中的 “cat << EOF” 如何工作?、c – “for”循环中的“if”语句、c# – 将括号放在与单行“if”语句的语句相同的行上是不好的形式吗?的有价值信息。
本文目录一览:- “if”语句在计算机上如何工作?(计算机中if语句)
- Bash 中“if”语句的“and”运算符
- bash 中的 “cat << EOF” 如何工作?
- c – “for”循环中的“if”语句
- c# – 将括号放在与单行“if”语句的语句相同的行上是不好的形式吗?
“if”语句在计算机上如何工作?(计算机中if语句)
如何解决“if”语句在计算机上如何工作??
编程中“如果”背后的逻辑是什么? cpu端是如何处理的?计算机做了哪些事情来比较两个变量?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)
Bash 中“if”语句的“and”运算符
我正在尝试创建一个简单的 Bash 脚本来检查网站是否已关闭,并且由于某种原因“and”运算符不起作用:
#!/usr/bin/env bashWEBSITE=domain.comSUBJECT="$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" $EMAILIDfi
“-a”运算符也不起作用:
if [ $STATUS -ne 200 ] -a [[ "$STRING" != "$VALUE" ]]
能否请您告知何时使用:
- 单方括号和双方括号
- 插入语
?
答案1
小编典典你所拥有的应该工作,除非${STATUS}
是空的。这样做可能会更好:
if ! [ "${STATUS}" -eq 200 ] 2> /dev/null && [ "${STRING}" != "${VALUE}" ]; then
或者
if [ "${STATUS}" != 200 ] && [ "${STRING}" != "${VALUE}" ]; then
很难说,因为您没有向我们确切展示您的脚本出了什么问题。
个人意见:永远不要使用[[
. 它抑制重要的错误消息,并且不能移植到不同的 shell。
bash 中的 “cat << EOF” 如何工作?
我需要编写脚本以将多行输入输入到程序( psql
)。
经过一番谷歌搜索,我发现以下语法有效:
cat << EOF | psql ---params
BEGIN;
`pg_dump ----something`
update table .... statement ...;
END;
EOF
这样可以正确构造多行字符串(从 BEGIN;
到 END;
,包括两端),并将其作为输入传递给 psql
。
但是我不知道它如何 / 为什么起作用,请解释一下吗?
我主要是指 cat << EOF
,我知道 >
输出到文件, >>
追加到文件, <
从文件读取输入。
<<
到底是做什么的?
并且有手册页吗?
#1 楼
当在 Bash 中处理多行文本时, cat <<EOF
语法非常有用。 将多行字符串分配给 shell 变量,文件或管道时。
Bash 中 cat <<EOF
语法用法的示例:
1. 将多行字符串分配给 shell 变量
$ sql=$(cat <<EOF
SELECT foo, bar FROM db
WHERE foo=''baz''
EOF
)
现在, $sql
变量也包含换行符。 您可以使用 echo -e "$sql"
进行验证。
2. 将多行字符串传递到 Bash 中的文件
$ cat <<EOF > print.sh
#!/bin/bash
echo \$PWD
echo $PWD
EOF
现在, print.sh
文件包含:
#!/bin/bash
echo $PWD
echo /home/user
3. 将多行字符串传递到 Bash 中的管道
$ cat <<EOF | grep ''b'' | tee b.txt
foo
bar
baz
EOF
b.txt
文件包含 bar
和 baz
行。 将相同的输出打印到 stdout
。
#2 楼
这称为 heredoc 格式,以将字符串提供给 stdin。 有关更多详细信息,请参见 https://en.wikipedia.org/wiki/Here_document#Unix_shells 。
来自 man bash
:
这里文件
这种重定向指示外壳程序从当前源读取输入,直到看到仅包含单词(无尾随空格)的行。
直到该点为止的所有行都将用作命令的标准输入。
此处文档的格式为:
<<[-]word here-document delimiter
没有对 word 执行参数扩展,命令替换,算术扩展或路径名扩展。 如果对 word 中的任何字符加引号,则定界符是对 word 删除引号的结果,并且本文档中的行不会扩展。 如果未引用 word ,则此文档的所有行都将进行参数扩展,命令替换和算术扩展。 在后一种情况下,字符序列
\\<newline>
被忽略,并且必须使用\\
来引用字符\\
,$
和`
。如果重定向运算符是
<<-
,则从输入行和包含定界符的行中除去所有前导制表符 。 这允许外壳脚本中的此处文档以自然方式缩进。
#3 楼
在您的情况下,“EOF” 被称为 “此处标签”。 基本上, <<Here
告诉外壳程序您将要输入多行字符串,直到 “tag” Here
为止。 您可以根据需要命名此标签,通常是 EOF
或 STOP
。
有关 Here 标记的一些规则:
- 标签可以是任何字符串,可以是大写或小写,尽管大多数人习惯上都使用大写。
- 如果该行中还有其他单词,则该标签将不被视为 Here 标签。 在这种情况下,它将仅被视为字符串的一部分。 标签本身应位于单独的行上,才能视为标签。
- 标签在该行中不应包含任何前导或尾随空格,才能将其视为标签。 否则,它将被视为字符串的一部分。
例:
$ cat >> test <<HERE
> Hello world HERE <-- Not by itself on a separate line -> not considered end of string
> This is a test
> HERE <-- Leading space, so not considered end of string
> and a new line
> HERE <-- Now we have the end of the string
#4 楼
POSIX 7
kennytm 引用了 man bash
,但是其中大多数也是 POSIX 7: http ://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_07_04:
重定向操作符 “<<” 和 “ <<-” 都允许将外壳程序输入文件(称为 “ here-document”)中包含的行重定向到命令的输入。
此处文档应被视为一个单词,该单词从下一个单词开始,一直持续到一行仅包含定界符和 a,且中间没有字符。 然后,下一个此处文档开始(如果有)。 格式如下:
[n]<<word here-document delimiter
其中可选的 n 表示文件描述符号。 如果省略该数字,则本文参考标准输入(文件描述符 0)。
如果在单词中引用了任何字符,则应通过对单词执行引号删除来形成分隔符,并且此处文档行不得扩展。 否则,定界符应为单词本身。
如果单词中没有引用任何字符,则应扩展本文档的所有行,以进行参数扩展,命令替换和算术扩展。 在这种情况下,输入中的 in 表现为内部双引号(请参见 Double-Quotes)。 但是,除非在 “$()”,“``'''' 或 “ $ {}” 中出现双引号,否则本文中的双引号字符(''“'')不应作特殊处理。
如果重定向符号为 “<<-”,则应从输入行和包含尾部定界符的行中删除所有前导的
<tab>
字符。 如果在一行上指定了多个 “<<” 或 “ <<-” 运算符,则与第一个运算符关联的此处文档应由应用程序首先提供,并由外壳程序首先读取。当从终端设备读取此处文档并且外壳是交互式的时,它将在读取输入的每一行之前将按外壳变量中所述进行处理的变量 PS2 的内容写入标准错误,直到识别出定界符为止。
例子
一些例子尚未给出。
引号防止参数扩展
不带引号:
a=0
cat <<EOF
$a
EOF
输出:
0
带引号:
a=0
cat <<''EOF''
$a
EOF
或(难看但有效):
a=0
cat <<E"O"F
$a
EOF
输出:
$a
连字符删除前导选项卡
没有连字符:
cat <<EOF
<tab>a
EOF
其中 <tab>
是文字选项卡,可以使用 Ctrl + V <tab>
插入
输出:
<tab>a
带连字符:
cat <<-EOF
<tab>a
<tab>EOF
输出:
a
当然,这是存在的,因此您可以像周围的代码那样缩进您的 cat
,这更易于阅读和维护。 例如:
if true; then
cat <<-EOF
a
EOF
fi
不幸的是,这不适用于空格字符:POSIX 倾向于在此处使用 tab
缩进。 kes。
#5 楼
使用 tee 代替 cat
并非完全是对原始问题的答案,但是我还是想分享一下:我需要在需要根权限的目录中创建配置文件。
以下情况不适用于这种情况:
$ sudo cat <<EOF >/etc/somedir/foo.conf
# my config file
foo=bar
EOF
因为重定向是在 sudo 上下文之外处理的。
我最终改用了这个:
$ sudo tee <<EOF /etc/somedir/foo.conf >/dev/null
# my config file
foo=bar
EOF
c – “for”循环中的“if”语句
for(i = 0; i < large_n; i++) { if( i % (large_n)/1000 == 0) { printf("We are at %ld \n",i); } // Do some other stuff }
我想知道这是否会对性能造成太大影响(先验),如果有更聪明的替代方案就是这种情况.谢谢提前.
解决方法
int T = ...; // times to check the condition,make sure large_n % T == 0 for(int t = 0; t < T; ++t) { for(int i = large_n/T * t; i < large_n/T * (t+1); ++i) { // other stuff } printf("We are at %ld \n",large_n/T * (t+1)); }
c# – 将括号放在与单行“if”语句的语句相同的行上是不好的形式吗?
if(something == true) DoSomething(); DoSomethingElse();
当快速编辑代码时,如果不放大括号.
这样的事情呢?
if(something == true) { DoSomething(); }
这样你仍然会占用更少的线路(IMO增加了可读性),但仍然不太可能意外地从上面犯错误?
我问,因为我不相信我以前曾经看过这个样式,如果或循环,但我确实看到它用于C#属性中的getter和setter,如:
public string Name {get;set;}
不要问什么是最好的,因为这太主观了,而只是这是否被认为是可接受的风格,如果不是,为什么不这样做.
解决方法
if (something == true) DoSomething();
它快速,容易,节省空间.
今天的关于“if”语句在计算机上如何工作?和计算机中if语句的分享已经结束,谢谢您的关注,如果想了解更多关于Bash 中“if”语句的“and”运算符、bash 中的 “cat << EOF” 如何工作?、c – “for”循环中的“if”语句、c# – 将括号放在与单行“if”语句的语句相同的行上是不好的形式吗?的相关知识,请在本站进行查询。
本文标签: