我期待
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 手册页描述了使用${!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)
当然,假设元素不包含空格。
坚持使用 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) 我正在尝试做一些简单的事情,但是我不确定如何在这里实现我的目标。
我正在尝试提取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。我读到的每个示例都非常好地使用了范围之外的变量,但我似乎不能。
假设我有存储在数组中的文件路径名列表
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)
我在想
sortbasename 数组。谢谢。
给定一个字符串数组,我想根据每个元素的长度对数组进行排序。
例如...
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即使它们的长度相同,也是在之前排序的。但这不是一个“硬”要求,如果它过于复杂解决方案)。
如果数组是就地排序的(即“数组”被修改)或者如果创建了一个新的排序数组,这都可以。
我有 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 脚本,它检查存储在数组中的所有目录是否存在。如果没有,脚本应该创建它。这是一个正确的方法吗?
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) 如何从 Zsh 数组中删除所有空字符串?
a=('a' '' 'b' 'c')
# remove empty elements from array
echo ${(j./.)a}
Run Code Online (Sandbox Code Playgroud)
应该输出 a/b/c
我需要用 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 完全是个新手。