我想我最好为此开始一个新的查询,因为我原来的查询已得到完全解答(谢谢!)。
我有两个文件,它们都是 postgresql 命令的输出。第一个 (/tmp/inventory.list) 是我原始查询使用 bash arrays 将表转换为 ini 文件的主题,为此我使用 @choroba 善意建议的 array 命令。鉴于我的第二个文件(/tmp/inventory2.list)的格式与第一个文件非常相似,我认为我可以调整数组脚本来类似地处理这个文件,但我显然把一些事情搞砸了。
我的输入文件 /tmp/inventory2.list 的格式为:
environment1 | hostname1.environment1.domain
environment1 | hostname2.environment1.domain
environment1 | hostname3.environment1.domain
environment2 | hostname4.environment2.domain
environment2 | hostname5.environment2.domain
environment3 | hostname6.environment3.domain
Run Code Online (Sandbox Code Playgroud)
必须以分组格式读入并写入另一个文件:
[environment1]
hostname1.environment1.domain
hostname2.environment1.domain
hostname3.environment1.domain
[environment2]
hostname4.environment2.domain
hostname5.environment2.domain
[environment3]
hostname6.environment3.domain
Run Code Online (Sandbox Code Playgroud)
环境分组之间必须有行空间,组名称必须按字母顺序显示,主机名必须在组内按字母顺序排序。每个环境组可能有多个主机名,但每个组只能显示一次。
让事情变得复杂的是,输入文件末尾有一个空行,我无法让我的 postgresql 查询省略它(-t 或 --tuples-only 删除通常写在末尾的行计数行,但不会' t 删除最后一个空行),因此需要将其删除并且不写入新的输出文件。
我尝试调整 @choroba 的数组命令来读取此文件并正确输出它,但是尽管它对于我的第一个文件完美地工作,但我的调整不起作用。我有:
1 #! /bin/bash
2
3 unset -v envs
4 unset -v hosts
5 declare -A envs
6 declare -A hosts …Run Code Online (Sandbox Code Playgroud) 我正在尝试根据另一个数组中的唯一值创建一个新的变量数组,但没有得到所需的结果。
原始数组
# echo ${owner[*]}
390920ad-2858-e651-a4af-a9eaa6acaebb 390920ad-2858-e651-a4af-a9eaa6acaebb e14c2413-7179-44f8-dfc3-b8624dcb10bb 390920ad-2858-e651-a4af-a9eaa6acaebb e14c2413-7179-44f8-dfc3-b8624dcb10bb 390920ad-2858-e651-a4af-a9eaa6acaebb e14c2413-7179-44f8-dfc3-b8624dcb10bb 390920ad-2858-e651-a4af-a9eaa6acaebb 390920ad-2858-e651-a4af-a9eaa6acaebb 390920ad-2858-e651-a4af-a9eaa6acaebb e14c2413-7179-44f8-dfc3-b8624dcb10bb 390920ad-2858-e651-a4af-a9eaa6acaebb e14c2413-7179-44f8-dfc3-b8624dcb10bb 390920ad-2858-e651-a4af-a9eaa6acaebb 390920ad-2858-e651-a4af-a9eaa6acaebb 390920ad-2858-e651-a4af-a9eaa6acaebb 390920ad-2858-e651-a4af-a9eaa6acaebb 0a452389-5ed2-e46f-ad15-cc538c82650d 4232f23d-ed48-4b14-c0ea-aa911fd24920 8ee1b05f-2473-4c37-bfc5-ae393921b939
Run Code Online (Sandbox Code Playgroud)
我正在使用的命令
uniq=($(printf "%s\n" "${owner[@]}" | sort -u))
Run Code Online (Sandbox Code Playgroud)
问题(它将所有唯一值存储为索引 0 下的单个值)
# echo ${uniq[0]}
0a452389-5ed2-e46f-ad15-cc538c82650d
390920ad-2858-e651-a4af-a9eaa6acaebb
4232f23d-ed48-4b14-c0ea-aa911fd24920
8ee1b05f-2473-4c37-bfc5-ae393921b939
e14c2413-7179-44f8-dfc3-b8624dcb10bb
# echo ${uniq[1]}
#
Run Code Online (Sandbox Code Playgroud)
有人知道从该数组中获取唯一值的更好方法吗?
在 SmartOS 上使用 bash(类似于 Solaris)
编辑
我也尝试了以下方法,它将每个值存储在它自己的索引号下,但它不会删除重复的值:
uniq=($(printf "%s " "${owner[@]}" | sort -u))
Run Code Online (Sandbox Code Playgroud) 我有一个变量VARNAME,其中包含另一个变量的名称。我想在不使用 的情况下分配给另一个变量eval。我怎样才能做到这一点?
我不想使用的原因eval如下。首先假设一个用于前置变量的函数foo:
% prepend_foo() { foo=("$@" $foo) }
% foo=(1 2)
% print -l $foo
1
2
% prepend_foo x 'a b c' y
% print -l $foo
x
a b c
y
1
2
%
Run Code Online (Sandbox Code Playgroud)
现在考虑一个附加到任何变量的通用函数:
% prepend() { var=$1; shift; eval "$var=($@ ${(P)var})" }
% foo=(1 2)
% print -l $foo
1
2
% prepend foo x 'a b c' y
% print -l $foo
x
a
b
c …Run Code Online (Sandbox Code Playgroud) 我试图创建一个循环输入并执行命令的函数 - 无论它们如何分隔。
function loop {
# Args
# 1: Command
# 2: Inputs
for input in "$2" ; do
$1 $input
done
}
Run Code Online (Sandbox Code Playgroud)
declare -a arr=("1" "2" "3")
$ loop echo "$arr[@]"
1
$ loop echo 1 2 3
1
$ loop echo $arr
1
Run Code Online (Sandbox Code Playgroud)
然而,根据这个答案,for .. in ..适用于数组:
for item in "${arr[@]}" ; do
echo "$item"
done
Run Code Online (Sandbox Code Playgroud)
它也适用于空格分隔的值:
for item in 1 2 3 ; do
echo "$item"
done
Run Code Online (Sandbox Code Playgroud)
简而言之,我如何在传递参数时获得"${arr[@]}"和的效果。1 2 …
如何按修改日期对 zsh 数组进行排序?
files=( ~/a ~/b ~/c )
# how to sort files by date?
Run Code Online (Sandbox Code Playgroud)
PS:这是我的确切用例,(fz几乎fzf)
v () {
local files
files=()
command rg '^>' ~/.viminfo | cut -c3- | while read line
do
[ -f "${line/\~/$HOME}" ] && files+="$line"
done
test -f ~/.emacs.d/.cache/recentf && {
command rg --only-matching --replace '$1' '^\s*"(.*)"$' ~/.emacs.d/.cache/recentf | while read line
do
[ -f "$line" ] && files+="$line"
done
}
files="$(<<<"${(F)files}" fz --print0 --query "$*")" || return 1
files="${files//\~/$HOME}"
local …Run Code Online (Sandbox Code Playgroud) 我需要有关 bash 扩展的帮助。
我想检索数组值,GNU bash 5.1.0。数组名称应该是一个变量。“只是”引用 bash 中的变量。
我有一个名为“armin”的数组,其名称位于变量 $gral 中(工作正常):
gral="armin"
Run Code Online (Sandbox Code Playgroud)
赋值:
declare -a ${gral}[1]="milk"
declare -a ${gral}[2]="cow"
declare ${gral}[7]="budgie"
declare ${gral}[9]="pla9ne"
Run Code Online (Sandbox Code Playgroud)
美好的。
数组存在:
$ echo ${armin[@]}
milk cow budgie pla9ne
Run Code Online (Sandbox Code Playgroud)
数组索引存在:
$echo ${!armin[@]}
1 2 7 9
Run Code Online (Sandbox Code Playgroud)
数组和索引都很好。
我想通过引用数组的名称作为变量来检索数组,而不是手动。有很多...
变量之前已设置和使用:
$ echo $gral
armin ## name of our bash array
Run Code Online (Sandbox Code Playgroud)
很好——到目前为止。
只是为了显示差异而不使用变量:
echo ${armin[@]}
milk cow budgie pla9ne
Run Code Online (Sandbox Code Playgroud)
现在尝试引用变量(gral)来调用名称(armin):
$ echo ${$gral[@]}
-bash: ${$gral[@]}: wrong substitution.
$echo ${"$gral"[@]}
-bash: ${"$gral"[@]}: wrong substitution.
echo ${"gral"[@]}
-bash: ${"gral"[@]}: …Run Code Online (Sandbox Code Playgroud) 使用以下代码:
#! /bin/bash
declare -a arr=("element1"
"element2" "element3"
"element4" )
echo "1"
echo "${arr[@]}"
echo "2"
echo ${arr[*]}
Run Code Online (Sandbox Code Playgroud)
输出是:
1
element1 element2 element3 element4
2
element1 element2 element3 element4
Run Code Online (Sandbox Code Playgroud)
所以输出是一样的。
那么什么时候强制使用一种方法而不是另一种方法呢?
显然我做得不对,但我认为预期的结果很明确(${#arr[@]}=3)
$ readarray -d "\t" arr < <(printf "%s\t%s\t%s" "x" "y" "z"); echo "${#arr[@]}"
> 1
Run Code Online (Sandbox Code Playgroud) 我有一个场景,我必须将文件 .txt 的行放入数组中,文件内容的示例;
type of host
|
| first host
| |
| | second host
| | |
| | | same ip address
| | | |
HOST_A_B=192.168.0.1
Run Code Online (Sandbox Code Playgroud)
我必须把它放在 bash 的数组中
#echo $Array[0]
HOST_A=192.168.0.1
#echo $Array[1]
HOST_B=192.168.0.1
Run Code Online (Sandbox Code Playgroud)
有时这些线路没有第二个主机,例如
HOST_A_B=192.168.0.1
HOST_C=192.168.0.2
HOST_DEF_G=192.168.0.3
Run Code Online (Sandbox Code Playgroud)
echo 命令输出应该如下所示:
#echo $Array[1]
HOST_A=192.168.0.1
#echo $Array[2]
HOST_B=192.168.0.1
#echo $Array[3]
HOST_C=192.168.0.2
#echo $Array[4]
HOST_DEF=192.168.0.3
#echo $Array[5]
HOST_G=192.168.0.3
Run Code Online (Sandbox Code Playgroud)
任何想法?
我想将数组传递给 bash 函数,但出现bad substitution错误
mapfile -t ray < <(parallel -j 0 echo ::: {1..10})
declare -p ray
declare -a ray=([0]="2" [1]="1" [2]="3" [3]="4" [4]="5" [5]="6" [6]="7" [7]="8" [8]="9" [9]="10")
arrLen() {
echo "${#$1[@]}"
}
arrLen ray
-bash: ${#$1[@]}: bad substitution
Run Code Online (Sandbox Code Playgroud)
那么是否不可能将参数传递给 bash 数组呢?