GVKun编程网logo

“if”语句在计算机上如何工作?(计算机中if语句)

22

对于想了解“if”语句在计算机上如何工作?的读者,本文将是一篇不可错过的文章,我们将详细介绍计算机中if语句,并且为您提供关于Bash中“if”语句的“and”运算符、bash中的“cat的有价值信息

对于想了解“if”语句在计算机上如何工作?的读者,本文将是一篇不可错过的文章,我们将详细介绍计算机中if语句,并且为您提供关于Bash 中“if”语句的“and”运算符、bash 中的 “cat << EOF” 如何工作?、c – “for”循环中的“if”语句、c# – 将括号放在与单行“if”语句的语句相同的行上是不好的形式吗?的有价值信息。

本文目录一览:

“if”语句在计算机上如何工作?(计算机中if语句)

“if”语句在计算机上如何工作?(计算机中if语句)

如何解决“if”语句在计算机上如何工作??

编程中“如果”背后的逻辑是什么? cpu端是​​如何处理的?计算机做了哪些事情来比较两个变量?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

Bash 中“if”语句的“and”运算符

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” 如何工作?

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 文件包含 barbaz 行。 将相同的输出打印到 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 为止。 您可以根据需要命名此标签,通常是 EOFSTOP

有关 Here 标记的一些规则:

  1. 标签可以是任何字符串,可以是大写或小写,尽管大多数人习惯上都使用大写。
  2. 如果该行中还有其他单词,则该标签将不被视为 Here 标签。 在这种情况下,它将仅被视为字符串的一部分。 标签本身应位于单独的行上,才能视为标签。
  3. 标签在该行中不应包含任何前导或尾随空格,才能将其视为标签。 否则,它将被视为字符串的一部分。

例:

$ 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”语句

c – “for”循环中的“if”语句

通常当我有一个大的for循环时,我把消息告诉我程序的哪个部分,例如:
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”语句的语句相同的行上是不好的形式吗?

c# – 将括号放在与单行“if”语句的语句相同的行上是不好的形式吗?

所以我知道,如果只有一个以下语句,它们是可选的,因此总是包含大括号,因为如果,等等,因为它更容易意外地执行以下操作:
if(something == true)
    DoSomething();
    DoSomethingElse();

当快速编辑代码时,如果不放大括号.

这样的事情呢?

if(something == true)
{   DoSomething(); }

这样你仍然会占用更少的线路(IMO增加了可读性),但仍然不太可能意外地从上面犯错误?

我问,因为我不相信我以前曾经看过这个样式,如果或循环,但我确实看到它用于C#属性中的getter和setter,如:

public string Name 
    {get;set;}

不要问什么是最好的,因为这太主观了,而只是这是否被认为是可接受的风格,如果不是,为什么不这样做.

解决方法

当我遇到一行if语句时,我通常会跳过卷曲并将所有内容保持在同一行上:
if (something == true) DoSomething();

它快速,容易,节省空间.

今天的关于“if”语句在计算机上如何工作?计算机中if语句的分享已经结束,谢谢您的关注,如果想了解更多关于Bash 中“if”语句的“and”运算符、bash 中的 “cat << EOF” 如何工作?、c – “for”循环中的“if”语句、c# – 将括号放在与单行“if”语句的语句相同的行上是不好的形式吗?的相关知识,请在本站进行查询。

本文标签: