假设您有一个带有很多选项的函数,并且您决定动态存储它们的值:
#!/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)
有没有办法检查变量是否在本地定义?
在办公室,我们正在使用旧的GLX/Motif软件,该软件使用OpenGL的AccumulationBuffer实现抗锯齿以保存图像.我们的问题是Apple从其所有驱动程序中删除了AccumulationBuffer(从OS X 10.7.5开始),而某些Linux驱动程序(如Intel HDxxxx)也不支持它.
然后我想更新软件的抗锯齿代码,使其与大多数实际操作系统和GPU兼容,但保持生成的图像像以前一样漂亮(因为我们需要它们用于科学出版物).
SuperSampling似乎是最古老,质量最好的抗锯齿方法,但我找不到任何不使用AccumulationBuffer的SSAA示例.是否有不同的方法来实现OpenGL/GLX的SuperSampling ???
3我正在尝试计算 bash 中所有等于或5低于的倍数的总和N,但我的尝试在速度基准上失败了。
输入格式说明如下:
第一行是
T,表示测试用例的数量,后面几T行,每行包含一个值N。
输入示例:Run Code Online (Sandbox Code Playgroud)2 10 100预期输出:
Run Code Online (Sandbox Code Playgroud)23 2318
这是我的尝试:
bc:2
10
100
Run Code Online (Sandbox Code Playgroud)
bash:23
2318
Run Code Online (Sandbox Code Playgroud)
备注:我使用它是t因为输入不以换行符结尾......
这两种解决方案都被评价为“太慢”,但我实在不知道还有什么可以进一步改进的地方。你有好主意吗?
我正在编写一个模仿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) 我有一组可以包含多个“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) 我的一位同事想要运行一个 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可能会中断。这里不用担心,您可以将文件名视为字母数字。
我需要解码;中的大量 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。
例如,对于 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) 你如何解释这一点?这是一个错误还是我忽略了什么?
#!/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)