unset array[0]
supprime l'élément, mais quand je fais echo ${array[0]}
j'obtiens une valeur nulle et il y a d'autres façons de le faire mais si un élément d'un tableau contient des espaces comme ci-dessous
array[0]='james young' array[1]='mary' array[2]='randy orton'
mais ceux-ci échouent aussi à faire le travail
array=${array[@]:1} #removed the 1st element
maintenant je veux que le nouveau tableau soit comme
array[0]='mary' array[1]='randy orton'
Les espaces provoquent le problème après l'affectation et le tableau actuel devient comme avec la substitution.
array=(mary randy orton)
Utilisez simplement la syntaxe de tableau sur l'affectation et citez votre variable:
array=("${array[@]:1}") #removed the 1st element
Modifier selon la question dans le commentaire. Pour $@
vous pouvez l'utiliser comme ceci:
set -- "${@:2}" #removed the 1st parameter
Cela m'a fait réfléchir. Le problème avec Sed / awk / queue est qu'ils sont ligne par ligne. Après avoir effacé la première ligne, vous devez écrire toutes les deux lignes de l'espace des motifs vers le file.
Supprimez la première ligne lorsqu'elle est renvoyée dans le file.
readarray -t aLargeFile < <(cat largefile) echo "${aLargeFile[@]:1}" >largefile
Il suffit de changer le grand file au nom de votre file.
#!/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[@]} ~ ~