如何从 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 完全是个新手。
我正在编写我的第一个 BASH 脚本,我对 c 和 c# 有一些经验,所以我认为程序的逻辑是正确的..只是语法如此复杂,因为显然有数十亿种方法可以编写相同的内容!
无论如何,这里是脚本:它只是检查参数(字符串)是否包含在某个文件中。如果是这样,它将文件的每一行存储在一个数组中,并将该数组的一项写入文件中。我确信必须有更简单的方法来实现这一点,但我想用 bash 循环做一些练习
#!/bin/bash
NOME=$1
c=0
#IF NAME IS FOUND IN THE PHONEBOOK THANK STORE EACH LINE OF THE FILE INTO ARRAY
#ONCE THE ARRAY IS DONE GET THE INDEX OF MATCHING NAME AND RETURN ARRAY[INDEX+1]
if grep "$NOME" /root/phonebook.txt ; then
echo "CREATING ARRAY"
while read line
do
myArray[$c]=$line # store line
c=$(expr $c + 1) # increase counter by 1
done < /root/phonebook.txt
else
echo "Name not found"
fi
c=0
for …Run Code Online (Sandbox Code Playgroud) 我正在尝试删除数组元素的范围,但失败了..
我的数组
root@ubuntu:~/work# echo ${a[@]}
cocacola.com airtel.com pepsi.com
Run Code Online (Sandbox Code Playgroud)
打印 0-1 数组看起来没问题
root@ubuntu:~/work# echo ${a[@]::2}
cocacola.com airtel.com
Run Code Online (Sandbox Code Playgroud)
现在我正在尝试使用以下方法仅删除这些元素:
root@ubuntu:~/work# unset a[@]::2
root@ubuntu:~/work# echo ${a[@]}
Run Code Online (Sandbox Code Playgroud)
这是删除整个数组..
我做错了什么?
我找到了其他删除数组范围的方法,但为什么上面的东西不起作用?
for ((i=0; i<2; i++)); do unset a[$i]; done
Run Code Online (Sandbox Code Playgroud)
编辑我也试过但没有运气
unset -v 'a[@]::2'
Run Code Online (Sandbox Code Playgroud) 我试图同时弄清楚三到四件事。我最需要帮助的是如何在我之前运行脚本时创建的所有文件中获得最大数量,这创建了一个新的带有(int)标识符的文件。将所有没有元数据的文件分开,将它们单独列出以防止所有文件被覆盖,因为我将它们全部存储在同一个文件夹中。
一个是现在我确定我在元素中获得了正确的值,我只使用一个元素,第一个 [0] 通过从 0 ..... 无穷大的顺序递增来更新文件。我想出使用的增量。
(( array[0]++ ))
Run Code Online (Sandbox Code Playgroud)
最让我困惑的部分是语法以及我如何通过计算机而不是我手动更改其值。我需要弄清楚如何获得脚本在制作它们时停止的最后一个文件中放入的最大数字,然后在我再次启动它时让它开始那个数字+1,这样它就不会从头开始零值只会覆盖它上次运行它时创建的其他文件。
正如人们应该知道的那样,当我关闭失去变量值的计算机时,该值会消失。而不是进入文件并查看只是获取一个脚本来为我做这件事。到目前为止,这是我试图找出如何获得最大数字的方法。这是我如何确保我正确编写它以获取 [0] 元素内的新数字,以从我离开的最后一个数字加一开始?
#!/bin/bash
typeset -i xf mf sn bn hn n snewnum d
let xf=1 mf=0 bn=3 hn=4 n=1 snewnum=0
#to keep track of which lost-song file number I am on
n=0 bn=3 hn=4
lostsongs[0]=2
###################################################
#
# FOR updating the lost song files so as not to
# over write any
####################################
find /home/userx/testscripts/ -type f -name "*.mp3" | while [[ $n -le 4 ]] ; do …Run Code Online (Sandbox Code Playgroud) 我有一个文件,其中包含多行字符串和 base64 编码数据,各行之间用逗号分隔。
例子:
1,meV9ivU4PqEKNpo5Q2u2U0h9owUn4Y8CF83TTjUNWTRQs7dEgVxnsMgf4lvg9kvxcIaM3yB4Ssim
z46M/C7YlovNUmrjOByhV1SCb/bGyv1yL7SYFnw1GHbYjdH0b6UZ7nQzJHU6VmwMo0V77vFNy6nx
rmJZ4KqW9EcjdV1plQmsVXSiZVi61+fNOHCMDmVtJ4q097geWxf4bT0/k/yRyRwi5Zr8BC64htVS
AdwOSo4PIk7xDLOzLywAYOCDQvD/zuErf1L0e8nHGz2LKdApHdEWB7Y2yM3iZyXuQ4sMx0+oX66+
FxwUulvHj+EpXtLJx5rmV7AUjr/GsNw/1aYAGPCfz0S+//Ic5pXX5rY1fZ96oFGw4a9vRiAmxe/w
ZOza6LtwuF+WUHjbIeWTUKKQGgFIM81dwVHHY7xdRnQhK5J0Zf3Xz0GzzZj5/2YFbI8q7lVkJ3ZQ
7Oqt0qdfk3aj+BQhOxmn1F55yACPBZoPUw6K8ExTHHGVGdCEiIDTu5qKHcUwK0hGAZA9Mun5KTO0
gPs9JxF8FJjkQBF7rEa6TP3pH5OwdkATH2uf+Zcmp1t6NbBymXVlsLzWZookVsaT1DNXf1I1H8Xz
8dnfh6Yl63jSr2PAhDrcOqJNM8Z9/XhBGxtlD1ela3nq6N1ErR1Gv1YZKNeNcL7O2Z3Vl2oyyDw=,U2FsdGVkX1/c8rTTO41zVT7gB+KL+n7KoNCgM3vfchOyuvBngdXDGjXTvXTK0jz6
Run Code Online (Sandbox Code Playgroud)
现在,我想将内容拆分为一个数组,以便每个多行字符串都是一个数组元素。
我尝试使用 IFS,但只读取第一行:
filecontent=$(cat myfile)
IFS=',' read -a myarray <<< "$filecontent"
Run Code Online (Sandbox Code Playgroud)
结果:
$myarray[0] = 1
$myarray[1] = meV9ivU4PqEKNpo5Q2u2U0h9owUn4Y8CF83TTjUNWTRQs7dEgVxnsMgf4lvg9kvxcIaM3yB4Ssim
Run Code Online (Sandbox Code Playgroud)
预期的:
$myarray[0] = 1
$myarray[1] = meV9ivU4PqEKNpo5Q2u2U0h9owUn4Y8CF83TTjUNWTRQs7dEgVxnsMgf4lvg9kvxcIaM3yB4Ssim
z46M/C7YlovNUmrjOByhV1SCb/bGyv1yL7SYFnw1GHbYjdH0b6UZ7nQzJHU6VmwMo0V77vFNy6nx
rmJZ4KqW9EcjdV1plQmsVXSiZVi61+fNOHCMDmVtJ4q097geWxf4bT0/k/yRyRwi5Zr8BC64htVS
AdwOSo4PIk7xDLOzLywAYOCDQvD/zuErf1L0e8nHGz2LKdApHdEWB7Y2yM3iZyXuQ4sMx0+oX66+
FxwUulvHj+EpXtLJx5rmV7AUjr/GsNw/1aYAGPCfz0S+//Ic5pXX5rY1fZ96oFGw4a9vRiAmxe/w
ZOza6LtwuF+WUHjbIeWTUKKQGgFIM81dwVHHY7xdRnQhK5J0Zf3Xz0GzzZj5/2YFbI8q7lVkJ3ZQ
7Oqt0qdfk3aj+BQhOxmn1F55yACPBZoPUw6K8ExTHHGVGdCEiIDTu5qKHcUwK0hGAZA9Mun5KTO0
gPs9JxF8FJjkQBF7rEa6TP3pH5OwdkATH2uf+Zcmp1t6NbBymXVlsLzWZookVsaT1DNXf1I1H8Xz
8dnfh6Yl63jSr2PAhDrcOqJNM8Z9/XhBGxtlD1ela3nq6N1ErR1Gv1YZKNeNcL7O2Z3Vl2oyyDw=
$myarray[2] = U2FsdGVkX1/c8rTTO41zVT7gB+KL+n7KoNCgM3vfchOyuvBngdXDGjXTvXTK0jz6
Run Code Online (Sandbox Code Playgroud)
有人可以帮我吗?
#!/usr/bin/env bash
awk '
BEGIN {
arr[A]=1;
arr[B]=1;
arr[C]=1;
arr[E]=1;
arr[J]=8;
arr[Q]=10;
print arr[J]
}'
Run Code Online (Sandbox Code Playgroud)
上面的命令输出 的最新设置值arr['subscript'],在这种情况下10,是arr[Q]之前的值,print而不是8的值arr[J]。
此外,就像在上面的脚本中一样,我不想一次为arr['A'], arr['B'], arr['C'] and arr['E']具有相同值的值分配1一行,而是将一组下标作为参数之一并将公共值作为另一个参数传递给处理给他们赋值的逻辑。
我有一组文件路径,每个文件都有几行文本。我想生成一个数组,其中填充了每个文件的第一行,如下所示:
# this.txt first line is [Test this]
# another.txt first line is [Test another]
paths=(
./this/path/this.txt
./another/path/another.txt
)
for i in ${paths[@]}; do
read -r line < $i
lines+=$line
done
Run Code Online (Sandbox Code Playgroud)
我的数组中最多只有一个值。我似乎无法从 for 循环中获取我正在寻找的数组。我尝试了很多变体,但很难弄清楚我哪里出错了。
在 bash 中,带有一元测试的条件表达式-v myvariable测试变量是否myvariable已设置。请注意,myvariable不应通过在其前面加上美元前缀来扩展,因此不是 $myvariable。\n现在我发现对于数组元素,条件表达式-v myarray[index]也可以很好地工作,无需完整的扩展语法${myarray[$index]}。尝试这个:
myarray[2]=myvalue\n for i in 1 2 3\n do\n [ -v myarray\\[i] ] && echo element $i is set\n done\nRun Code Online (Sandbox Code Playgroud)\n(注意转义\\[以防止通配符,作为使用引号的替代方法)
给出所需的输出:
\n element 2 is set\nRun Code Online (Sandbox Code Playgroud)\n问题\n这种行为可以安全使用吗?又名是这种已记录的行为吗?
\n附录\n阅读答案后https://unix.stackexchange.com/a/677920/376817后,我扩展了我的示例:
\n myarray[1]=val myarray[2]=val myarray[3]=val myarray[4]=val myarray[5]=val myarray[6]="" myarray[2]=""\n unset myarray[3] myarray[4] myarray[5]\n touch myarray4 myarrayi\n myarray4=val myarrayi=val\nRun Code Online (Sandbox Code Playgroud)\n然后
\n for …Run Code Online (Sandbox Code Playgroud) 在 bash 中,是否可以获取数组最后一个元素(可能是稀疏的)的索引,而无需像这样循环遍历整个数组:
a=( e0 e1 ... )
i=0
while [ "$i" -lt $(( ${#a[@]} - 1 )) ]
do
let 'i=i+1'
done
echo "$i"
Run Code Online (Sandbox Code Playgroud)
至少从 bash v 4.2 开始,我可以使用以下命令获取数组中最后一个元素的值
e="${array[-1]}"
Run Code Online (Sandbox Code Playgroud)
但这不会给我带来正索引,因为其他元素可能具有相同的值。