【问题标题】:Why is this bash script fetching http headers为什么这个 bash 脚本会获取 http 标头
【发布时间】:2017-11-28 13:29:30
【问题描述】:

我不确定这是否是发布此内容的合适位置,不过如此:我正在开发一个脚本来否定匹配 git 分支,但是当这部分运行时,它试图获取 HTTP 标头... .谁能解释这是怎么回事?

test.sh

#!/bin/bash
array_not_contains()
{
    local array="$1[@]"
    local seeking=$2
    local in=0
    for element in "${!array}"; do
        echo $element #Commenting out this echo will stop it from fetching headers
        if [[ $element =~ $seeking ]]; then
            in=1
            break
        fi
    done
    return $in
}

exclude=() #array that will exclude the following matches from deletion
exclude+=(HEAD)
exclude+=(master)
exclude+=(develop)
exclude+=(example.*)


if $(array_not_contains exclude $1); then
    echo "win"
else
    echo "fail"
fi

像这样运行它: ./test.sh 鲍勃 将返回标题

【问题讨论】:

标签: linux git bash


【解决方案1】:

它最终将 HEAD 评估为命令。

bash$ type -all HEAD
HEAD is /usr/bin/HEAD

您可能误解了if $(command) 的作用。它运行command,然后将其输出作为命令运行,并检查其退出代码。

解决方法很简单:你的意思是

if array_contains exclude "$1"; then

虽然我可能会重构代码以更显着地降低其复杂性。

正如numerous times 指出的那样,if 语句运行命令并检查其退出代码。

bash$ flase () { echo "flase."; return 1; }

bash$ ture () { echo "ture."; return 0; }

bash$ if ture; then echo It is true.; else echo It is not.; fi
ture.
It is true.

bash$ if flase; then echo It is not false.; else echo It is false.; fi
flase.
It is false.

【讨论】:

  • 你有没有在 macOS 上测试过这个? HEAD 通常不是命令,但 HFS+ 是保留大小写的,这意味着它不会区分 headHEAD 作为文件名,但会在调用中保留大小写。
  • 我链接了 HEAD 手册页 - 这是一个 libwww-perl 命令,它仍然安装在很多地方。
  • 糟糕,抱歉。不喜欢 HFS+ 的默认大小写处理的另一个原因。
  • 我正在使用一个数组来存储正则表达式匹配规则,这些规则最终可能会从脚本之外的某个地方获取,因此降低复杂性有点困难(这也是一个简化的 sn-p 代码,未显示该功能的实际使用方式)。让它运行 array_not_contains 函数的目的是运行该函数,然后评估其退出代码(回声仅用于调试目的)。您的修复不允许该函数运行,这意味着 if 在正匹配时不会失败...击败脚本的全部要点
  • 不允许函数运行怎么办?你测试了吗?? if 的参数是由 shell 运行的命令行。
猜你喜欢
  • 1970-01-01
  • 2022-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-24
  • 2014-09-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多