我在StackOverflow上找到了一个很棒的答案,它解释了如何将关联数组传递给函数.有人能够帮我弄清楚${1#*=}下面代码中的语法是什么?(从借来的答案被jaypal辛格):
#!/bin/bash
declare -A weapons=(
['Straight Sword']=75
['Tainted Dagger']=54
['Imperial Sword']=90
['Edged Shuriken']=25
)
function print_array {
eval "declare -A arg_array="${1#*=}
for i in "${!arg_array[@]}"; do
printf "%s\t%s\n" "$i ==> ${arg_array[$i]}"
done
}
print_array "$(declare -p weapons)"
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止的猜测(纠正我,如果我错了任何这些):
- 1意味着传递给函数($1或${1})的第一个参数
- #意味着索引$1,因为$1是一个关联数组,使得#键$1
- *表示#关联数组中键的值$1
离开了=.这意味着什么?这是一种表明你想要的方式,#并且*是指关联数组的键和值吗?
----编辑----
将脚本名称从更改pacsearch为pacdot.
显然yaourt -Ssaq这样做,所以这个脚本没有我想象的那么必要.虽然,我仍然发现使用pacdot -w在文本文档中打开结果很有帮助.
- - /编辑 - -
这不是一个问题,但我认为其他人可能会觉得这很有用.有人可能最终会在stackoverflow上试图找到这样的解决方案.
在Arch Linux上,我一直在寻找自己用pacman或yaourt搜索并希望我能得到包名,而不是所有额外的东西.例如,我希望能够跑步yaourt -Sa $(yaourt -Ssa package).奇怪的是,pacman和yaourt似乎没有这个选项(至少我不能说),所以我写了一个python脚本来做到这一点.如果你愿意,可以复制它.你可以把它命名为你想要的,但我会把它称为pacdot.py.
pacdot.py package将yaourt -Ssa package只是列出包名称.
我添加了一些额外的选项:
pacdot.py -o package 只列出官方Arch存储库的结果,而不是AUR.pacdot.py -i package将安装所有找到的包.如果你曾经想过运行类似的东西yaourt -Sa $(yaourt -Ssa package),那就是这个命令的作用.
pacdot.py -w package 将:
- 创建一个名为'the-package-you-searching.txt'的文件,
- 编写一个可以安装找到的包的示例命令,
(yaourt -Sa all-of-results),- 将每个结果写在一个新行上,然后
- 为您打开文件(使用默认文本编辑器).
这是代码:
#!/bin/python3
import argparse
import re
from subprocess import Popen, PIPE, call
from collections import deque
desc = ''.join(('Search the …Run Code Online (Sandbox Code Playgroud) 在Python 3.4.2中,是否有一种方法可以在列表推导中使用"if ...或..."语句?
例:
filtered_list = [x for x in other_list
if not ' ' in x or ' ' in other_list[int(other_list.index(x) -1)]]
#^item just before "x" in "other_list"
Run Code Online (Sandbox Code Playgroud)
我知道这个命令不起作用.我知道这个也不是:
filtered_list = [x for x in other_list
if not (' ' in x) or (' ' in other_list[int(other_list.index(x) -1)])]
#^item just before "x" in "other_list"
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?一个"for"循环会更容易阅读,但我试图推动我对列表理解的理解.提前致谢.
(奇怪的是,我在stackoverflow上找不到像这样的先前问题.)
是否有一种方法Bash,使一个指针的值的关键在一个关联数组?像这样:
declare -A mapp
mapp=( ["key"]="${value}" )
for k in "${!mapp[@]}"; do
pointer="${mapp["${k}"]}" # How do I do this?
done
Run Code Online (Sandbox Code Playgroud)
通常,您不需要使用指针,但我很想知道是否有办法制作指针.
在更简单的情况下(即,对于普通/字符串变量),我会做一个像这样的指针:
pointer=b
read -p "Enter something: " b
eval pointer=\$${pointer}
Run Code Online (Sandbox Code Playgroud)
我如何为关联数组执行此操作?这不起作用(跳过strikethroughed代码):
declare -A mapp
mapp=( ["first"]="${a}" ["second"]="${b}" )
for k in "${!mapp[@]}"; do
v=mapp["${k}"]
read -p "Enter ${k}: " new
eval v=\$${v} # Doesn't work
done
Run Code Online (Sandbox Code Playgroud)
declare -A mapp
mapp=( ["first"]="${a}" ["second"]="${b}" )
for k in "${!mapp[@]}"; do
v=mapp["${k}"] …Run Code Online (Sandbox Code Playgroud) 如何检查文件是否是Go中的硬链接?os.FileMode只有符号链接模式,而不是硬链接.
我有一个想法,不幸的是不起作用:
package main
func main() {
filename := os.Args[1]
var hardlink bool
link, _ := os.Readlink(filename)
fi, _ := os.Stat(filename)
mode := string(fi.Mode().String()[0])
if link != "" && mode != "L" {
hardlink = true
}
fmt.Printf("%v is hard link? %v\n", filename, hardlink)
}
Run Code Online (Sandbox Code Playgroud)
这^不起作用,因为os.Readlink只读符号链接,而不是硬链接.
我发现了一个有点相关的答案:
计数硬链接在Go文件
,但这个答案显示了如何找到数的硬链接到一个文件,而不是是否一个文件本身的硬链接.
我猜这个答案中使用的系统调用包,或者更好的是,sys包有一种方法来测试文件是否是硬链接.有谁知道这样做?(我很难理解这些包,因为它们太低了.)
我应该补充我想检查这个的原因.我正在尝试创建一个函数来创建目录[using filepath.Walk()] 的tar存档.在此函数中,当我*tar.Header为文件创建时,我将值设置为*tar.Header.Typeflag.
例如,if fi是文件的*os.FileInfo …