首页 > 解决方案 > 将 bash 中的正斜杠添加到变量字符串输出

问题描述

这几天我一直在拉头发..非常烦人..

我知道这与 utf-8 和字符串没有输出正确的格式有关,但无法弄清楚是什么..

这是代码:

#!/bin/bash
#test
REGURL=http://bugs.ws
CHECKURL=$(curl -m 3 -sk --head "$REGURL" | grep -i "location" | awk '{print $2}')

if [[ "${CHECKURL: -1}" != *'/'* ]] # if redirected url does not contain / at end, we need to add it
then
    CHECKURL+='/'
    echo "$CHECKURL"
fi

这是在做一些字符替换,而不是简单地在 URL 之后添加“/”。它在没有管道 curl、grep 的情况下工作,所以我知道这是处理 grep 或 curl 的东西。

基本上结果必须在末尾有一个正斜杠,例如:http ://bugs.ws 最终会有一个https://alphaterminte.com的位置重定向,但我需要在 " 的末尾添加一个 '/' alphatermite.com”,我已经尝试了所有方法,我只是无法让正斜杠跟随变量结果..它一直用它代替 grepped 结果的第一个字符.. UGHHHH(是的,这个测试代码需要在bash中)

标签: bash

解决方案


is的输出curl使用回车 + 换行结束符;unix 工具只需要换行,并将回车视为行内容的一部分。最终结果:CHECKURL末尾有一个不正常可见的回车符,这让一切都感到困惑。

具体来说,CHECKURL最终包含“ https://alphatermite.com<carriage return>/”,它会打印如下内容:

https://alphatermite.com
/

...除了只有回车(没有换行)之间,“/”打印在“https”中的“h”之上。

解决方案:您可以添加| tr -d '\r'到管道中创建CHECKURL,但我只需awk一步完成所有操作:

CHECKURL=$(curl -m 3 -sk --head "$REGURL" | awk '/^[Ll]ocation:/ {sub("\r", "", $2); print $2}')

说明:该/^[Ll]ocation:/"部分使其仅打印位置(或“位置”)标题,并在打印之前sub("\r", "", $2)删除回车符。$2

顺便说一句,我会用它来测试字符串末尾的“/”:

if [[ "${CHECKURL}" != *'/' ]]

您可以提取最后一个字符并查看它是否为“/”,或者使用通配符模式检查它是否以“/”结尾;无需两者都做。

顺便说一句,我还建议使用小写或混合大小写的变量名称,以避免意外使用许多具有特殊含义的全大写名称之一(因此会产生意想不到的后果)。


推荐阅读