변수를 사용하고 싶습니다.
i=1
스크립트에 대한 참조로 전달된 위치 변수의 값입니다. 예:
x=101
y=201
z=301
foo(){
echo "$1"
echo "$2"
echo "$3"
}
foo x y z
산출:
101
201
301
i
인덱스별로 각 매개변수를 참조하는 대신 인덱스 변수를 사용하여 증가시키려면 어떻게 해야 합니까 ?
밝히다:
foo() {
local i=1
echo "$i" #echo first paramter
(( i+=1 ))
echo "$i" #echo second parameter
#etc.
}
이 부분의 구문은 무엇입니까 echo "$i"
?
@Eric 답변 후 업데이트됨
~$ t=5
~$ foo() { i=1; echo "${!i}"; }
~$ foo t
t
~$
업데이트 #2
간단히 말해서, 내 방법을 작동시킬 수 있는 유일한 방법은 다음과 같습니다.
foo() { #assuming 3 parameters
i=0
(( i+=1 ))
var="${!i}"
echo "${!var}"
(( i+=1 ))
var="${!i}"
echo "${!var}"
(( i+=1 ))
var="${!i}"
echo "${!var}"
}
답변1
이것은 SO 질문과 유사합니다여기, 이는 @costas 댓글과 유사합니다. 다음을 사용하여 $#
매개변수 수를 얻을 수 있습니다 .간접 참조${!i}
이름으로 변수에 액세스하는 것과 같습니다. 예는 다음과 같습니다.
f() {
for((i=1; i<=$#; i++)); do
printf "%d %s\n" "$i" "${!i}"
done
}
f a b c
인쇄:
1 a
2 b
3 c
이제 변수 이름을 위치 인수로 전달하려는 경우 다음과 같이 간접 참조 레이어를 추가할 수 있습니다.
a=first
b=second
c=third
f() {
for((i=1; i<=$#; i++)); do
var="${!i}"
printf "%d %s\n" "$i" "${!var}"
done
}
f a b c
인쇄
1 first
2 second
3 third
이를 통해 각 매개변수를 변수 이름으로 처리하고 거기에 저장할 수 있습니다 var
. 그렇다면 우리는 printf
…
한 번에 한 수준의 간접 참조만 얻을 수 있으며 중첩은 효과가 없습니다. 그러므로 한번에 다 하려고 하면 ${!${!i}}
처음부터 {
확장이 시작되고 나머지는 확장되는 PARAMETER 값으로 처리되기 때문에 소용이 없습니다. 첫 번째 문자는 !
나머지 문자를 우리가 원하는 매개변수 이름을 포함하는 PARAMETER 이름으로 처리하지만 ${!i}
유효한 매개변수 이름은 아니므로 bad substitution
단 두 단계만으로 이 문제를 피할 수 있습니다.
답변2
를 사용하면 shift
다음을 수행할 수 있습니다.
num_args="$#"
for (( i = 1; i <= "$num_args"; i++ )); do
echo "$1"
shift
done
여기서 shift
명령은변화스크립트에 전달된 인수의 각 다음 인수는 의 값입니다 $1
.
예를 들어:
$ ./myscript one two three four five six
one
two
three
four
five
six
여기서 루프의 첫 번째 실행에서는 $1 = "one"
, 루프의 두 번째 실행에서는 , $1 = "two"
마지막 인수까지 계속됩니다.
편집하다:순서 없이 스크립트 매개변수에 액세스하려는 경우. 두 번째와 네 번째 인수를 모두 사용하는 한 가지 방법은 다음과 같이 bash 배열을 사용하는 것입니다.
# Initialize the array 'myargs' with all script arguments
myargs=( "$@" )
for (( i = 0; i < "$#"; i++ )); do
echo "${myargs[$i]}"
done
i
여기에서 양식을 사용하여 지정된 인덱스가 있는 모든 매개변수에 액세스할 수 있습니다 "${myargs[$i]}"
.