unset array[0]
요소를 제거하지만 여전히 echo ${array[0]}
null 값을 얻는 경우이 작업 을 수행하는 다른 방법이 있지만 배열의 요소에 아래와 같은 공백이 있으면
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)
답변
할당에 배열 구문을 사용하고 변수를 인용하십시오.
array=("${array[@]:1}") #removed the 1st element
의견의 질문에 따라 편집하십시오 . 들어 $@
당신은 다음과 같이 사용할 수 있습니다 :
set -- "${@:2}" #removed the 1st parameter
답변
이것은 나를 생각하게했다. sed / awk / tail의 문제점은 라인 단위라는 것입니다. 첫 번째 행을 삭제 한 후에는 패턴 공간에서 파일로 다른 모든 행을 작성해야합니다.
- 다음 명령을 사용하여 몇 초 안에 원하는 것을 수행 할 수 있습니다.
- 전체 파일을 배열에 씁니다.
-
파일로 다시 덤프 할 때 첫 번째 행을 제거하십시오.
readarray -t aLargeFile < <(cat largefile) echo "${aLargeFile[@]:1}" >largefile
largefile
파일 이름으로 변경 하십시오.
답변
특정 인덱스에서 요소를 제거하기 unset
위해 다른 배열로 복사 한 다음 사용할 수 있습니다 . unset
이 경우 에만 필요하지 않습니다. unset
요소를 제거하지 않기 때문에 null 문자열을 배열의 특정 색인으로 설정합니다.
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
답변
#!/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[@]}
~
~