unset array[0]
删除元素,但如果我这样做,echo ${array[0]}
我仍然会得到一个空值,而且还有其他方法可以做到这一点,但如果数组的元素包含如下所示的空格
array[0]='james young'
array[1]='mary'
array[2]='randy orton'
但这些也无法完成这项工作
array=${array[@]:1} #removed the 1st element
现在我希望新的数组是这样的
array[0]='mary'
array[1]='randy orton'
空格会在分配后引起麻烦,并且实际的数组变得像替换一样。
array=(mary randy orton)
答案1
只需在赋值时使用数组语法并引用您的变量:
array=("${array[@]:1}") #removed the 1st element
编辑根据评论中的问题。因为$@
你可以像这样使用它:
set -- "${@:2}" #removed the 1st parameter
答案2
这让我思考。 sed/awk/tail 的问题是它们是逐行的。删除第一行后,您必须将模式空间中的每隔一行写入文件。
- 您可以使用以下命令在几秒钟内完成您想要的操作。
- 这会将整个文件写入数组。
删除第一行,因为它会将其转储回文件中。
readarray -t aLargeFile < <(cat largefile) echo "${aLargeFile[@]:1}" >largefile
只需将 更改largefile
为您的文件名即可。
答案3
要删除特定索引处的元素,我们可以使用unset
然后复制到另一个数组。只是unset
在这种情况下不需要。因为unset
不删除元素,所以它只是将空字符串设置为数组中的特定索引。
declare -a arr=('aa' 'bb' 'cc' 'dd' 'ee')
unset 'arr[1]'
declare -a arr2=()
i=0
for element in ${arr[@]}
do
arr2[$i]=$element
((++i))
done
echo ${arr[@]}
echo "1st val is ${arr[1]}, 2nd val is ${arr[2]}"
echo ${arr2[@]}
echo "1st val is ${arr2[1]}, 2nd val is ${arr2[2]}"
输出是
aa cc dd ee
1st val is , 2nd val is cc
aa cc dd ee
1st val is cc, 2nd val is dd
答案4
#!/bin/bash
q=( one two three four five )
echo -e "
(remove) { [:range:] } <- [:list:]
| [:range:] => return list with range removed range is in the form of [:digit:]-[:digit:]
"
function remove {
if [[ $1 =~ ([[:digit:]])(-([[:digit:]]))? ]]; then
from=${BASH_REMATCH[1]}
to=${BASH_REMATCH[3]}
else
echo bad range
fi;shift
array=( ${@} )
local start=${array[@]::${from}}
local rest
[ -n "$to" ] && rest=${array[@]:((${to}+1))} || rest=${array[@]:((${from}+1))}
echo ${start[@]} ${rest[@]}
}
q=( `remove 1 ${q[*]}` )
echo ${q[@]}
~
~