标签: array

Bash 脚本:关联数组仅在给定多个值时识别一个值

这行 Bash (4.0) 脚本

klang=([string_0]='element_0' [string_1]='element_1' [string_2]='element_2')
echo "${klang[*]}"     # should output the all set elements
echo "${#klang[*]}"    # should output the number of set elements
Run Code Online (Sandbox Code Playgroud)

返回(出于某种原因):

element_2
1
Run Code Online (Sandbox Code Playgroud)

此脚本中没有设置其他命令,而且我对 Bash 脚本编写非常陌生。其他元素(Element_0Element_1)发生了什么变化?这确实适用于索引数组和数字以及所有内容,但不适用于文本 - 好吧,除了一个元素比我要求的少一点......我在哪里遗漏了什么?

bash array

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

在函数中声明的 Bash 数组在函数外不可用

在 bash (v4.3.11) 终端上输入:

function FUNCtst() { declare -A astr; astr=([a]="1k" [b]="2k" ); declare -p astr; };FUNCtst;declare -p astr
Run Code Online (Sandbox Code Playgroud)

(下面相同,只是为了更容易在这里阅读)

function FUNCtst() { 
  declare -A astr; 
  astr=([a]="1k" [b]="2k" ); 
  declare -p astr; 
};
FUNCtst;
declare -p astr
Run Code Online (Sandbox Code Playgroud)

将输出这个(在函数之外,数组会丢失它的值,为什么?)

declare -A astr='([a]="1k" [b]="2k" )'
bash: declare: astr: not found
Run Code Online (Sandbox Code Playgroud)

我期待它输出这个:

declare -A astr='([a]="1k" [b]="2k" )'
declare -A astr='([a]="1k" [b]="2k" )'
Run Code Online (Sandbox Code Playgroud)

如何使它工作?

bash array function

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

为什么这个循环中的printf语句会乱序输出数组?

当我执行以下代码时,printf 语句的输出似乎显示数组乱序。在声明语句中,源项在目标之前声明,而在输出中则相反。

YELLOW=$'\e[93m'
declare -A OP=( [Description]="remote to destination" [Source]="/var/www" [Destination]="/foo/bar" [Log]="my.log" [Email]="me@here" );

NO_COLS=`tput cols`
COLS_PER_COL=$(($NO_COLS/3))
PRINT_FORMAT="%"$COLS_PER_COL"s%""s\n"

for i in "${!OP[@]}"; do
    printf $PRINT_FORMAT "$i :" " $YELLOW${OP[$i]}$ENDCOL"
done ;
Run Code Online (Sandbox Code Playgroud)

输出看起来像

         Description : remote to destination
         Destination : /foo/bar
              Source : /var/www
                 Log : my.log
               Email : me@here
Run Code Online (Sandbox Code Playgroud)

谁能告诉我这里发生了什么?或者如何根据数组声明实现正确的顺序?

bash array shell-script

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

如何将数组中的所有值相加

我已经坚持了很长时间了。尝试谷歌搜索,找不到我要找的东西。

我只需要添加一个数组中的所有值。(称为数据包的数组)我已经到了可以添加它们的地步,但是当发生这种情况时,无法在脚本中稍后调用数值。

这是整个脚本,非常简单,只是检查与时间(也就是带宽)相比的数据包数据量。

rawdata=`tcpdump -nn -S -r test.pcap | awk '{print $1" "$NF}'`
time="`echo "$rawdata" | sed -r 's/(.{15}).*/\1/'`"
starttime="`echo "$time" | awk 'NR > 1 { exit }; 1'`"
endtime="`echo "$time" | awk 'END{print}'`"
stime=`date --date="$starttime" +%s`
etime=`date --date="$endtime" +%s`
difftime="echo $(($etime - $stime))"
echo $difftime
echo $addedpackets
echo $sum
echo ------------------------------------
packets="`echo "$rawdata" | awk '{print $2}' | sed 's/[^0-9]*//g'`"
echo ------------------------------------
for i in "${packets[*]}"
do
    plus=$(printf '%d+' ${i})0
    added="echo $(($plus))"
done
echo ------------------------------------
$added
$difftime
bc …
Run Code Online (Sandbox Code Playgroud)

array shell-script bandwidth math

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

处理 bash 中没有文件匹配的通配符

我试图将目录中的文件读取到数组中,但即使文件不存在,它也会保存到数组中。如果文件名不存在,我想排除它。

a=(/tmp/nofileexists) && echo ${#a[@]} && echo ${a[@]}
1
/tmp/nofileexists
Run Code Online (Sandbox Code Playgroud)

路径可能包含通配符。

a=(/tmp/nofileexists*.pdf) && echo ${#a[@]} && echo ${a[@]}
Run Code Online (Sandbox Code Playgroud)

bash array wildcards

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

从“读取”拆分单词并存储到数组?

如何从 获取输入read,将单词按空格拆分,然后将这些单词放入数组中?

我想要的是:

$ read sentence
this is a sentence
$ echo $sentence[1]
this
$ echo $sentence[2]
is
(and so on...)
Run Code Online (Sandbox Code Playgroud)

我正在使用它来处理文本冒险的英语句子。

shell array read

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

使用 IFS 循环读取文件仅在不使用数组时才有效

使用以下代码,我试图将文件读入数组:

GROUPS=()

while IFS=: read -r g1 g2 g3 g4
do
    GROUPS+=("$g3")
    echo "$g3"
done < /etc/group
Run Code Online (Sandbox Code Playgroud)

这不起作用,它甚至不输出任何内容,但是,如果我只留下回声,它会打印文件的内容。只要循环中某处存在添加到数组的指令,就不会打印任何内容。这似乎很奇怪,因为我可以毫无问题地对其他文件执行此操作。

知道是什么原因造成的吗?我用 bash -x 进行了检查,当存在有问题的指令时,它甚至没有进入循环。

另外,如果相关,我以 root 身份运行它。

bash array

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

将 ls 写入数组(按换行符拆分)

我希望我的目录列表输出在一个数组中。

readarray x < <( ls -la )
printf "%s" ${x[@]}
Run Code Online (Sandbox Code Playgroud)

所以我写了这个,它可以工作,但它按空格而不是换行符分开。我在 readarray 手册中找不到“换行符”参数,所以我很好奇是否有一种巧妙的方法来解决该请求。请不要建议使用find(我被限制使用ls -la)。

我使用 bash 4.3。

ls bash array

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

读取数组值作为用户输入会给出错误的数组长度,只有 -a 或 -p 可用于读取

问题1:我想在运行时获取数组项作为用户输入;打印项目并打印数组长度。这就是我所拥有的:

read -a myarray
echo "array items" ${myarray[@]}
echo "array length" ${#myarray[@]}
Run Code Online (Sandbox Code Playgroud)

在运行时,我给出了以下作为输入,

$ ("apple fruit" "orange" "grapes")
Run Code Online (Sandbox Code Playgroud)

输出是,

array items "apple fruit" "orange" "grapes"
array length 4
Run Code Online (Sandbox Code Playgroud)

这是不正确的。

如果我不要求用户输入而是使用作为代码的一部分声明和初始化的数组 myarray=("apple fruit" "orange" "grapes")数组长度回显为 3。所以,似乎我对 read 命令的使用不正确。

问题2:如果我在read命令中添加如下提示,

read -p "enter array items: " myarray
Run Code Online (Sandbox Code Playgroud)

第一项“苹果水果”被打印为水果“并且长度也是错误的。

如果我删除提示并添加 -a,一切都很好。如果我将 a 和 p 结合起来并将其作为 read -ap,则根本不会弹出提示。它等待没有任何消息的值。为什么会这样?有人可以向我解释什么是错的吗?

bash array shell-script read

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

为什么这段代码可以在 bash v4.4 中运行,而不能在 bash v3.2 中运行?

我有以下 bash 脚本:

#!/bin/bash

encl0=( 0,0 0,1 0,2 0,3 0,4 0,5 0,7 0,8 0,9 0,10 0,11 0,12 0,13 0,14 0,15 )
MISSING_DISKS=()
OLDIFS=$IFS
IFS=$'\n'
MISSING_DISKS+=($({ printf '0 %s\n' {0..15}; printf '0 %s\n' "${encl0[@]#0,}"; } | sort | uniq -u))
IFS=$OLDIFS
echo "$({ printf '0 %s\n' {0..15}; printf '0 %s\n' "${encl0[@]#0,}"; } | sort | uniq -u)"
echo "${MISSING_DISKS[@]}"
if ((${#MISSING_DISKS[@]}>1)); then
    echo "Greater than 1"
else
    echo "Success"
fi
Run Code Online (Sandbox Code Playgroud)

当我使用 bash v4.4 运行它时,它按我的预期工作:

$ /usr/local/bin/bash test.sh
0 6
0 6 …
Run Code Online (Sandbox Code Playgroud)

bash array shell-script

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

标签 统计

array ×10

bash ×8

shell-script ×4

read ×2

bandwidth ×1

function ×1

ls ×1

math ×1

shell ×1

wildcards ×1