배열을 반복하고 아직 포함되지 않은 경우 주어진 값을 삽입하는 함수를 만들고 싶습니다. 이 함수를 코드의 두 부분에서 사용하고 있으므로 다른 배열을 사용해야합니다. 따라서 함수에 배열 이름을 전달하고 있습니다. 이제이 위치에 요소를 저장하기 위해 배열의 슬롯을 할당하는 방법을 알 수 없습니다.
내 코드는 다음과 같습니다.
name=("hello" "world")
function f {
array_name=$2[@]
array=("${!array_name}")
length=${#array_name[@]}
for (( i = 0; i <= $length; i++ )); do
if [[ "${array[i]}" = "$1" ]];
break;
fi
if [[ "$i" = "$length" ]]; then
${2[$length+1]=$1};
fi
done
}
f "test" "name"
편집 : 배열이 주어진 값을 추가하기를 원합니다.
for i in ${name[@]}
do
echo $i
done
이 출력은 다음과 같습니다.
hello
world
test
그러나 분명히 "${2[$length+1]=$1}"
작동하지 않습니다.
(배열 전달에 대한 아이디어는 여기에서 : 배열을 함수에 인수로 전달하는 방법 bash )
이 값이 아직 배열에 없으면 배열에 값을 추가하고 싶지만 배열 이름 이 함수에 전달 된다는 것을 올바르게 이해하면 배열에 값을 추가하고 싶습니다 .
한 가지 가능성은 다른 관점에서 문제를 보는 것입니다. 삽입 할 값과 전체 배열을 함수에 전달할 수 있으며, 함수는 실행 후 복구 할 전역 변수를 설정합니다. 테스트 예에서는 다음을 사용합니다.
array=( hello world "how are you today?" )
우리는 삽입하려고합니다 test
및 hello
(수 있도록 hello
삽입되지 않습니다)를 :
f() {
# This function will set the global variable _f_out to an array obtained from
# the positional parameters starting from position 2, with $1 appended if and
# only if $1 doesn't appear in the subsequent positional parameters
local v=$1 i
shift
_f_out=( "$@" )
for i; do [[ $i = $v ]] && return; done
_f_out+=( "$v" )
}
그것을 사용합시다 :
$ array=( hello world "how are you today?" )
$ f test "${array[@]}"
$ array=( "${_f_out[@]}" )
$ printf '%s\n' "${array[@]}"
hello
world
how are you today?
test
$ f hello "${array[@]}"
$ array=( "${_f_out[@]}" )
$ printf '%s\n' "${array[@]}"
hello
world
how are you today?
test
효과가있다.
말. 나는 for i; do
. 에 대한 좋은 바로 가기입니다 for i in "$@"; do
.
당신은 정말로 유사 포인터를 가지고 다니고 제자리에 추가를하고 싶어합니다. (이것은 실제로 Bash의 정신이 아니기 때문에 약간 서투른 것입니다). 이를위한 도구는 printf
다음 -v
옵션 과 함께 사용 하는 것입니다. from help printf
:
-v var assign the output to shell variable VAR rather than display it on the standard output
좋은 점은 배열 필드에서도 작동한다는 것입니다.
경고 : eval
. 전염병처럼 그들을 피하십시오!
f() {
local array_name=$2[@] i
local array=( "${!array_name}" )
for i in "${array[@]}"; do [[ $i = $1 ]] && return; done
# $1 was not found in array, so let's append it
printf -v "$2[${#array[@]}]" '%s' "$1"
}
시도해 보겠습니다.
$ array=( hello world "how are you today?" )
$ f test array
$ printf '%s\n' "${array[@]}"
hello
world
how are you today?
test
$ f hello array
$ printf '%s\n' "${array[@]}"
hello
world
how are you today?
test
그것도 작동합니다.
노트. 두 방법 모두 return
함수 코드를 매우 쉽게 가질 수 있습니다. 예를 들어 0
값이 삽입 된 경우 (성공) 1
, 값이 이미 존재하는 경우 (또는 그 반대의 경우) (실패)-적응은 간단하며 다음과 같이 남아 있습니다. 운동. 이는 array
반환 된 값 으로 업데이트해야하는지 여부를 결정하는 방법 1에서 유용 할 수 있습니다 _f_out
. 이 경우 값이 이미 배열에있을 때 f
설정되지 않도록 약간만 수정할 수도 있습니다 _f_out
.
경고. 표시된 두 방법 모두에서 배열에 0에서 시작하는 연속 인덱스가 있다고 가정했습니다 (예 : 비 희소 배열). 여기에서 안전한 가정이라고 생각합니다. 그러나 그렇지 않은 경우 이러한 메서드는 손상됩니다. 첫 번째 메서드는 (재 할당 후) 배열을 희소하지 않은 것으로 변환하고 두 번째 메서드는 필드를 덮어 쓸 수 있습니다 (배열의 a
경우 ${#a[@]}
다음 개수로 확장 됨). 배열에서 발견 된 가장 높은 인덱스 + 1이 아닌 배열의 요소).
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다