小编Fra*_*ona的帖子

Bash 函数:有没有办法检查变量是否在本地定义?

假设您有一个带有很多选项的函数,并且您决定动态存储它们的值:

#!/bin/bash
fun() {
    local OPTIND __option

    while getopts ":$(printf '%s:' {a..z} {A..Z})" __option
    do
        case $__option in
        [[:alpha:]])
            # ... 
            local "__$__option=$OPTARG"
        esac
    done

    # here you might get a conflict with external variables:
    [[ ${__a:+1} ]] && echo "option a is set"
    [[ ${__b:+1} ]] && echo "option b is set"
    # etc...
    [[ ${__Z:+1} ]] && echo "option Z is set"
}
Run Code Online (Sandbox Code Playgroud)

有没有办法检查变量是否在本地定义?

bash

6
推荐指数
1
解决办法
552
查看次数

OpenGL SuperSampling抗锯齿?

在办公室,我们正在使用旧的GLX/Motif软件,该软件使用OpenGL的AccumulationBuffer实现抗锯齿以保存图像.我们的问题是Apple从其所有驱动程序中删除了AccumulationBuffer(从OS X 10.7.5开始),而某些Linux驱动程序(如Intel HDxxxx)也不支持它.

然后我想更新软件的抗锯齿代码,使其与大多数实际操作系统和GPU兼容,但保持生成的图像像以前一样漂亮(因为我们需要它们用于科学出版物).

SuperSampling似乎是最古老,质量最好的抗锯齿方法,但我找不到任何不使用AccumulationBuffer的SSAA示例.是否有不同的方法来实现OpenGL/GLX的SuperSampling ???

opengl motif glx

5
推荐指数
0
解决办法
1815
查看次数

Bash - N 以下 3 或 5 的所有倍数之和 - 超时

3我正在尝试计算 bash 中所有等于或5低于的倍数的总和N,但我的尝试在速度基准上失败了。

输入格式说明如下:

第一行是T,表示测试用例的数量,后面几T行,每行包含一个值N
输入示例:

2
10
100
Run Code Online (Sandbox Code Playgroud)

预期输出:

23
2318
Run Code Online (Sandbox Code Playgroud)

这是我的尝试:

  • bc
2
10
100
Run Code Online (Sandbox Code Playgroud)
  • 与纯bash
23
2318
Run Code Online (Sandbox Code Playgroud)

备注:我使用它是t因为输入不以换行符结尾......

这两种解决方案都被评价为“太慢”,但我实在不知道还有什么可以进一步改进的地方。你有好主意吗?

bash

5
推荐指数
1
解决办法
264
查看次数

各种操作系统上的 Bash 补全功能:补全主机时 @ 出现问题

我正在编写一个模仿ssh命令主机完成的函数;xyz.com主要区别在于它使用在中找到的域的主机~/.ssh/known_hosts来完成。

这是函数:

_xyzssh() {
    COMPREPLY=()

    local arg="${COMP_WORDS[COMP_CWORD]}"

    [[ $arg != -* ]] || return 0

    [ -f ~/.ssh/known_hosts ] || return 0

    local -a known_hosts
    read -d '' -a known_hosts < <(awk '{
        n = split($1,arr,",");
        for (i = 1; i <= n; i++)
            if (arr[i] ~ /\.xyz\.com$/)
                print arr[i] 
    }' ~/.ssh/known_hosts)

    if [[ $arg == *@* ]]
    then
        known_hosts=( ${known_hosts[@]/#/${arg%%@*}@} )
    fi

    COMPREPLY=( $(compgen -W "${known_hosts[*]}" -- $arg) )

    return 0
}
complete …
Run Code Online (Sandbox Code Playgroud)

linux macos bash solaris

4
推荐指数
1
解决办法
226
查看次数

如何恢复N选2的组合?

我有一组可以包含多个“N 选择 2”组合的结果的对:

inputs = {
    ('id1', 'id2'), ('id1', 'id3'), ('id1', 'id4'),
    ('id2', 'id3'), ('id2', 'id4'),
    ('id3', 'id4'), ('id3', 'id5'),
    ('id4', 'id5'),
    ('id5', 'id6'),
}
Run Code Online (Sandbox Code Playgroud)

我想颠倒这些组合,如下所示:

recombinations = [
    ('id1', 'id2', 'id3', 'id4'),
    ('id3', 'id4', 'id5'),
    ('id5', 'id6'),
]
Run Code Online (Sandbox Code Playgroud)

我设法使用暴力来做到这一点:

ids = list(sorted( {i for i in itertools.chain(*inputs)} ))

excludes = set()
recombinations = {tuple(i) for i in map(sorted, inputs)}

for i in range(3, len(ids)+1):
    for subset in itertools.combinations(ids, i):
        for j in range(i-1, len(subset)):
            combs = set(itertools.combinations(subset, j))
            if …
Run Code Online (Sandbox Code Playgroud)

python

3
推荐指数
1
解决办法
121
查看次数

如何使用仅输出顺序的模糊程序对大量文件进行排序

我的一位同事想要运行一个 FORTRAN 程序,该程序接受文件参数并根据某些生物物理化学标准输出它们的顺序(最好是第一个)。他需要的是最好的10个结果。

虽然文件不大,但问题是他有一个bash: /home/progs/bin/ardock: Argument list too long,所以我创建了文件的 6 位长符号链接并将它们用作参数,这有效;-)

现在,如果文件数量确实太大,上述技巧无法发挥作用,那么您可以采取什么措施来从所有文件中获得 10 个最好的文件呢?您是否必须按块对文件进行排序,并使用类似的方法将最好的与最好的进行比较?

#!/bin/bash

best10() { ardock "$@" | head -n 10; }
export -f best10

find . -name '*.dat' -exec bash -c 'best10 "$@"' _ {} + |
xargs bash -c 'best10 "$@"' _ |
xargs bash -c 'best10 "$@"' _ |
xargs bash -c ... | ... | ...
Run Code Online (Sandbox Code Playgroud)

这里的问题是,需要的数量xargs是事先不知道的,那么如何使其成为一个循环呢?

注意:由于程序正在输出以换行符分隔的文件路径流,我知道这xargs可能会中断。这里不用担心,您可以将文件名视为字母数字。

bash xargs

2
推荐指数
1
解决办法
114
查看次数

使用 POSIX awk 解码 Base64 编码文本

我需要解码;中的大量 base64 编码的文本字符串。awk因为我不想大量分叉不可移植的二进制base64文件,所以我编写了一个awk函数来进行解码:

function base64_decode(str,    out,i,n,v) {
    out = ""
    if ( ! ("A" in _BASE64_DECODE_c2i) )
        for (i = 1; i <= 64; i++)
            _BASE64_DECODE_c2i[substr("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",i,1)] = i-1
    i = 0
    n = length(str)
    while (i <= n) {
        v = _BASE64_DECODE_c2i[substr(str,++i,1)] * 262144 + \
            _BASE64_DECODE_c2i[substr(str,++i,1)] * 4096 + \
            _BASE64_DECODE_c2i[substr(str,++i,1)] * 64 + \
            _BASE64_DECODE_c2i[substr(str,++i,1)]
        out = out sprintf("%c%c%c", int(v/65536), int(v/256), v)
    }
    return out
}
Run Code Online (Sandbox Code Playgroud)

效果很好:

printf '%s\n' SmFuZQ== …
Run Code Online (Sandbox Code Playgroud)

awk base64 posix openldap

1
推荐指数
1
解决办法
406
查看次数

使用不同风格的“awk”将反斜杠的数量加倍

我正在寻找一种可移植的方法来转义字符串中的反斜杠awk

例如,对于 GNU 和 BSD,您可以编写:

echo '\ \\ \\\' | command -p awk '{gsub(/\\/,"\\\\"); print}'
Run Code Online (Sandbox Code Playgroud)

但在其他 NIX 上你必须这样写:

echo '\ \\ \\\' | command -p awk '{gsub(/\\/,"\\\\\\\\"); print}'
Run Code Online (Sandbox Code Playgroud)

如果您无法访问 AIX/HP-UX/Solaris/etc...,我认为可以awk通过以下方式用 GNU/BSD 模拟该问题:

echo '\ \\ \\\' | awk '{gsub(/\\/, ... ); print}'

echo '\ \\ \\\' | awk --posix '{gsub(/\\/, ... ); print}'
Run Code Online (Sandbox Code Playgroud)

其中...两个命令相同;两者都应该产生:

\\ \\\\ \\\\\\
Run Code Online (Sandbox Code Playgroud)

awk

1
推荐指数
1
解决办法
93
查看次数

Bash 的 printf '%(%F %T)T' 的奇怪结果

你如何解释这一点?这是一个错误还是我忽略了什么?

#!/bin/bash

printf '%(%F %T)T\n' 3 2 1 0 -1 -2 -3
Run Code Online (Sandbox Code Playgroud)
1970-01-01 00:00:03
1970-01-01 00:00:02
1970-01-01 00:00:01
1970-01-01 00:00:00
2023-08-16 19:31:33
2023-08-14 22:56:58
1969-12-31 23:59:57
Run Code Online (Sandbox Code Playgroud)

bash printf date

1
推荐指数
1
解决办法
125
查看次数

标签 统计

bash ×5

awk ×2

base64 ×1

date ×1

glx ×1

linux ×1

macos ×1

motif ×1

opengl ×1

openldap ×1

posix ×1

printf ×1

python ×1

solaris ×1

xargs ×1