标签: array

在 Bash 中将默认数组写入变量

我期待

excludes="${excludes:-( ${default_excludes[@]} )}"
Run Code Online (Sandbox Code Playgroud)

如果$excludes为空,则为数组。不幸的是,后面的东西:-被认为是一个字符串。我是否错过了一些语法扭曲,或者我必须使用笨重的

if [ -z "${excludes:-}" ]
then
    excludes=( "${default_excludes[@]}" )
fi
Run Code Online (Sandbox Code Playgroud)

?

bash array

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

间接返回数组中的所有元素

Bash 手册页描述了使用${!a}返回名称为a(间接级别)内容的变量的内容。

我想知道如何使用这个返回数组中的所有元素,即,

a=(one two three)
echo ${a[*]}
Run Code Online (Sandbox Code Playgroud)

返回

one two three
Run Code Online (Sandbox Code Playgroud)

我想要:

b=a
echo ${!b[*]}
Run Code Online (Sandbox Code Playgroud)

返回相同。不幸的是,它没有,而是返回0

更新

鉴于回复,我现在意识到我的例子太简单了,因为当然,像:

b=("${a[@]}")
Run Code Online (Sandbox Code Playgroud)

将完全实现我所说的我需要的。

所以,这就是我想要做的:

LIST_lys=(lys1 lys2)
LIST_diaspar=(diaspar1 diaspar2)

whichone=$1   # 'lys' or 'diaspar'

_LIST=LIST_$whichone
LIST=${!_LIST[*]}
Run Code Online (Sandbox Code Playgroud)

当然,仔细阅读 Bash 手册页表明这不会按预期工作,因为最后一行只是返回“数组”的索引$_LIST(根本不是数组)。

在任何情况下,以下应该做的工作(如所指出的):

LIST=($(eval echo \${$_LIST[*]}))
Run Code Online (Sandbox Code Playgroud)

或者......(我最终走的路线):

LIST_lys="lys1 lys2"
...
LIST=(${!_LIST})
Run Code Online (Sandbox Code Playgroud)

当然,假设元素不包含空格。

bash array

10
推荐指数
2
解决办法
5346
查看次数

Gawk:将数组传递给函数

坚持使用 GNU awk 3.1.6 并认为我已经解决了它的数组错误,但在 600 行 awk 程序中仍然存在范围问题。需要验证对 awk 中数组范围的理解才能找到我的错误。

鉴于这个说明性的 awk 代码......

function foo(ga) {
  ga[1] = "global result"
}

garray[1] = "global"
foo(garray)

print garray[1]
Run Code Online (Sandbox Code Playgroud)

将打印...

global result
Run Code Online (Sandbox Code Playgroud)

由于数组总是通过引用传递给函数,因此所有数组总是全局的。无法创建本地数组。这样对吗?一直无法找到明确说明这一点的文档。

由于我正在调试,并且 3.1.6 本身在这方面有已知的错误,我试图确定 awk 的错误从哪里停止,我的错误从哪里开始。

补充:为什么 ga[] 在函数内部工作呢?

首先,将数组传递给函数 withfoo(ga)实际上是不必要的。只需garray[]在函数内部访问它。然而,这样做并没有可衡量的性能损失,它有助于调试和错误报告。

在使用中foo(ga)ga[]是全局数组的同义词garray[]。它不是 的本地副本garray[],而是简单的指向 的指针garray[],就像符号链接是指向文件的指针一样,因此可以使用多个名称访问同一个文件(或数组)。

补充:澄清格伦杰克曼的回答

虽然在函数外部创建的数组对函数来说是全局的,并且可以传递给它或只是在函数内部被引用,但函数内部创建的数组确实对函数保持局部并且在函数外部不可见。修改杰克曼先生的例子说明了这一点......

awk '
    function bar(x,y) {
      split("hello world", y)
      print "x[1] inside: …
Run Code Online (Sandbox Code Playgroud)

array awk function

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

Bash - 多维数组和从输出中提取变量

我正在尝试做一些简单的事情,但是我不确定如何在这里实现我的目标。

我正在尝试提取w控制台上的命令给出的:USER、TTY 和 FROM 值。在 bash 中,我试图获取此输出并将这些值放入一个多维数组(或只是一个带有空格分隔符的数组)中。

#!/bin/bash
w|awk '{if(NR > 2) print $1,$2,$3}' | while read line
do
     USERS+=("$line")
     echo ${#USERS[@]}
done
echo ${#USERS[@]}
Run Code Online (Sandbox Code Playgroud)

我已经找到了在单个数组中逐行读取值的方法,但是我似乎无法将 USERS 数组值排除在 while 循环的范围之外。它在循环后打印值 1,2,3,4 和 0。我读到的每个示例都非常好地使用了范围之外的变量,但我似乎不能。

bash array

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

按基本名称对文件的路径名数组进行排序

假设我有存储在数组中的文件路径名列表

filearray=("dir1/0010.pdf" "dir2/0003.pdf" "dir3/0040.pdf" ) 
Run Code Online (Sandbox Code Playgroud)

我想根据文件名的基名按数字顺序对数组中的元素进行排序

sortedfilearray=("dir2/0003.pdf" "dir1/0010.pdf" "dir3/0040.pdf") 
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

我只能对它们的基本名称部分进行排序:

basenames=()
for file in "${filearray[@]}"
do
    filename=${file##*/}
    basenames+=(${filename%.*})
done
sortedbasenamearr=($(printf '%s\n' "${basenames[@]}" | sort -n))
Run Code Online (Sandbox Code Playgroud)

我在想

  • 创建一个关联数组,其键是基名,值是路径名,因此对路径名的访问始终通过基名完成。
  • 仅为 basename 创建另一个数组,并应用于sortbasename 数组。

谢谢。

bash array filenames sort

9
推荐指数
5
解决办法
4745
查看次数

Bash根据元素长度对数组进行排序?

给定一个字符串数组,我想根据每个元素的长度对数组进行排序。

例如...

    array=(
    "tiny string"
    "the longest string in the list"
    "middle string"
    "medium string"
    "also a medium string"
    "short string"
    )
Run Code Online (Sandbox Code Playgroud)

应该排序...

    "the longest string in the list"
    "also a medium string"
    "medium string"
    "middle string"
    "short string"
    "tiny string"
Run Code Online (Sandbox Code Playgroud)

(作为奖励,如果列表按字母顺序对相同长度的字符串进行排序会很好。在上面的示例medium string中,middle string即使它们的长度相同,也是在之前排序的。但这不是一个“硬”要求,如果它过于复杂解决方案)。

如果数组是就地排序的(即“数组”被修改)或者如果创建了一个新的排序数组,这都可以。

bash array shell-script sort

9
推荐指数
2
解决办法
3387
查看次数

在 Bash 数组上使用参数替换

我有 file.txt 需要读入 Bash 数组。然后我需要删除每个条目中的空格、双引号和除第一个逗号之外的所有内容。这是我已经走了多远:

$ cat file.txt
10,this
2 0 , i s
30,"all"
40,I
50,n,e,e,d,2
60",s e,e"

$ cat script.sh
#!/bin/bash
readarray -t ARRAY<$1
ARRAY=( "${ARRAY[@]// /}" )
ARRAY=( "${ARRAY[@]//\"/}" )
for ELEMENT in "${ARRAY[@]}";do
    echo "|ELEMENT|$ELEMENT|"
done

$ ./script.sh file.txt
|ELEMENT|10,this|
|ELEMENT|20,is|
|ELEMENT|30,all|
|ELEMENT|40,I|
|ELEMENT|50,n,e,e,d,2|
|ELEMENT|60,se,e|
Run Code Online (Sandbox Code Playgroud)

除了逗号情况外,这很好用。我知道有多种方法可以给这只猫剥皮,但由于脚本较大,这是其中的一部分,我真的很想使用参数替换来到达这里:

|ELEMENT|10,this|
|ELEMENT|20,is|
|ELEMENT|30,all|
|ELEMENT|40,I|
|ELEMENT|50,need2|
|ELEMENT|60,see|
Run Code Online (Sandbox Code Playgroud)

这可以通过参数替换吗?

bash array parameter shell-script variable-substitution

9
推荐指数
5
解决办法
3511
查看次数

Bash 检查目录是否存在。如果不是用数组创建

我想编写一个 Bash 脚本,它检查存储在数组中的所有目录是否存在。如果没有,脚本应该创建它。这是一个正确的方法吗?

array1=(
/apache
/apache/bin
/apache/conf
/apache/lib
/www
/www/html
/www/cgi-bin
/www/ftp
)
if [ ! -d “$array1” ]; then
  mkdir $array1
else 
  break
fi
Run Code Online (Sandbox Code Playgroud)

bash directory array

9
推荐指数
2
解决办法
3621
查看次数

从 Zsh 中的数组中删除所有空字符串

如何从 Zsh 数组中删除所有空字符串?

a=('a' '' 'b' 'c')
# remove empty elements from array
echo ${(j./.)a}
Run Code Online (Sandbox Code Playgroud)

应该输出 a/b/c

zsh array

9
推荐指数
3
解决办法
1902
查看次数

如何使用 bash 创建多维数组或类似的数组?

我需要用 bash 创建一个多维数组,我读到 bash 中没有多维数组之类的东西。

这是我可能的数据,它们是什么样的以及我需要什么。这不是 bash 数组:

DATACOL = [
    "1"=>("Santiago","Barcelona","AWG","6792992","Male"),
    "2"=>("Santi","Texas","BGG","6792992","Male"),
    "3"=>("Tiago","Rio","GHA","6792992","Female") 
]
Run Code Online (Sandbox Code Playgroud)

我怎样才能用一个简单的脚本做类似的事情?我对 bash 完全是个新手。

bash array

9
推荐指数
2
解决办法
8233
查看次数