首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在bash中合并长命令的bash命令/simplification

在bash中合并长命令的bash命令/simplification
EN

Stack Overflow用户
提问于 2022-04-29 16:10:13
回答 2查看 73关注 0票数 0

嗨,我正在做一个脚本,我想它,通过一个命令,它将有可能作出一个更复杂的命令或功能。问题是,我有三个码头集装箱,其名称相同,但只有数字变化。只有码头容器在日志中只有一个条目,而这正是正确的Cloudflared URL,我需要让它通过这个子命令或函数,而不是1次。因为我有三个码头集装箱,所以logs.和都有不同的url

我知道这是通过经典的方式进行的!唯一的问题是,如果我重复相同的命令,它会在脚本中造成一些混乱(至少这就是我的感觉)。

代码语言:javascript
复制
#!/bin/bash
function test {
    docker_container_proxy_name="cloudflared"
    real_domain_of_cloudflared="https://([a-z0-9]{1,60})(-[a-z0-9]{1,60})(-[a-z0-9]{1,60})(-[a-z0-9]{1,60}).trycloudflare.com"
    docker_container_1_uri_outside="$(docker logs ${docker_container_proxy_name}1 2>&1 | grep -Eo $real_domain_of_cloudflared | tail -n 1)"
    docker_container_2_uri_outside="$(docker logs ${docker_container_proxy_name}2 2>&1 | grep -Eo $real_domain_of_cloudflared | tail -n 1)"
    docker_container_3_uri_outside="$(docker logs ${docker_container_proxy_name}3 2>&1 | grep -Eo $real_domain_of_cloudflared | tail -n 1)"
}
test

是否有任何方法可以使简化,就像整个long命令一样,但只有停靠容器数字更改。像这样(在我眼里更干净):

代码语言:javascript
复制
#!/bin/bash
function test {
    docker_container_proxy_name="cloudflared"
    real_domain_of_cloudflared="https://([a-z0-9]{1,60})(-[a-z0-9]{1,60})(-[a-z0-9]{1,60})(-[a-z0-9]{1,60}).trycloudflare.com"
    command="$(docker logs ${docker_container_proxy_name} 2>&1 | grep -Eo $real_domain_of_cloudflared | tail -n 1)"
    docker_container_1_uri_outside="${command}1"
    docker_container_2_uri_outside="${command}2"
    docker_container_3_uri_outside="${command}3"
}
test

我很乐意得到答复。也许类似的问题已经存在,但我承认我没有去寻找它,直接写了我的问题,我很抱歉,也许这将是一个类似的帖子。

码头集装箱:

代码语言:javascript
复制
$ docker container ps | grep "cloudflared"
<id_of_container> cloudflare/cloudflared:2022.4.1-amd64 "cloudflared --no-au…" 11 days ago Up 2 days cloudflared3
<id_of_container> cloudflare/cloudflared:2022.4.1-amd64 "cloudflared --no-au…" 11 days ago Up 2 days cloudflared2
<id_of_container> cloudflare/cloudflared:2022.4.1-amd64 "cloudflared --no-au…" 11 days ago Up 2 days cloudflared1

#1 for XFCE_noVNC
#2 for filebrowser
#3 for code-server
#i want this services in my "pocket/everywhere" without my public ipv4.
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-04-29 17:57:36

变量用于存储数据,而不是可执行代码。通常,存储可执行代码的最佳方法是在一个函数中:

代码语言:javascript
复制
#!/bin/bash
get_container_uri() {
    docker_container_proxy_name="cloudflared"
    real_domain_of_cloudflared="https://([a-z0-9]{1,60})(-[a-z0-9]{1,60})(-[a-z0-9]{1,60})(-[a-z0-9]{1,60}).trycloudflare.com"
    docker logs "${docker_container_proxy_name}${1}" 2>&1 | grep -Eo "$real_domain_of_cloudflared" | tail -n 1
}

docker_container_1_uri_outside="$(get_container_uri 1)"
docker_container_2_uri_outside="$(get_container_uri 2)"
docker_container_3_uri_outside="$(get_container_uri 3)"

注意,函数只是直接运行docker logs ...命令,而不是捕获它的输出;这样,命令的输出就变成了函数的输出,这正是我们想要的。

此外,还有一些一般的脚本建议:您应该(几乎)总是将变量引用放在双引号(例如grep -Eo "$real_domain_of_cloudflared")中,以防止shell以意外的方式解析它们。function关键字是非标准的;定义函数的标准方法是将()放在名称后面(正如我在这里所做的)。不要使用test作为函数的名称,因为这是一个相当重要的内置命令的名称,而重写它可能会破坏其他东西。

shellcheck.net将指出其中的一些(以及许多其他常见的错误)。我建议您在其中运行脚本并修复它所指出的内容。

票数 2
EN

Stack Overflow用户

发布于 2022-04-29 17:32:18

几乎正确:

建议:

代码语言:javascript
复制
#!/bin/bash
docker_container_proxy_name="cloudflared"
real_domain_of_cloudflared="https://([a-z0-9]{1,60})(-[a-z0-9]{1,60})(-[a-z0-9]{1,60})(-[a-z0-9]{1,60}).trycloudflare.com"

function command {
    echo "$(docker logs "${docker_container_proxy_name}$1" 2>&1 | grep -Eo "$real_domain_of_cloudflared" | tail -n 1)"
}

function test {
    docker_container_1_uri_outside=$(command 1)
    docker_container_2_uri_outside=$(command 2)
    docker_container_3_uri_outside=$(command 3)
}
test
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72060817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档