2015-01-11 4 views
1

저는 몇 달 동안 배쉬를 가르쳐 왔으며 변수에서 요소를 제거하는 동작에 대해 혼란스러워합니다. 여기 'shuf'를 사용하여 배열 요소를 지우는 데 혼란이 있음

테스트이다

array=("one" "two" "three" "four"); 
unset array[`shuf -i 0-4 -n1`]; 
echo ${#array[@]} 

I 가지는 문제, I는 해당 시험을 반복하면, 일반적으로, 그러나 동일한 반복, 3 (배열의 요소 수)을 초래할 것 인 일을 여러 번 (보통 20 개 미만)하면 결과는 4이됩니다. 업데이트 :이 경우 실제로 아무것도 제거하지 않습니다.

내가 사용하는 경우 :

v=${array[`shuf -i 0-4 -n1`]} 
echo $v 
array=(${array[@]/$v/}) 
echo ${#array[@]} 

나는 똑같은 문제를 얻는다. 경우에 따라 배열이 완전히 사라지고 ${#array[@]}3을 반환하고 요소가 있던 곳이 없습니다. 드물지만 4을 반환하며 값은 비어 있습니다. 테스트 echo $v은 때때로 null 값을 반환하며 대개 예상대로 작동하고 숫자를 반환합니다. 문제가있는 곳은 여기에 있지만 왜 일어나는지 알 수는 없지만 요소의 수가 변경되지 않는 이유는 분명합니다.

내가 알고있는 문제는 shuf입니다. 그냥 경우 :

unset array[2] #specify, instead of using 'shuf' to randomize

요소는 항상 사라지고 요소의 수는 항상 줄일 수 있습니다. 또한 shuf에 대한 질문에는 일반적으로 사용법이 관련되어 있습니다.

누구에게도 익숙합니까? 사용법을 잘못 이해했거나 버그입니까? 어떤 단서 이유가 shuf 특히이 문제가 발생할 수 있습니까?

내가 알 수있는 한 shuf은 유효한 숫자를 안정적으로 반환하므로 이론적으로 항상 올바른 숫자가 삭제됩니다. 그 이후의 동작은 무작위이지만 배열을 생성하려면 shuf을 사용할 때만 중요한 이유를 아직 이해하지 못했습니다. 그래서 변수에 전달할 때 어떻게 든 인식 할 수없는 문자 나 무언가를 얻는 것처럼 보이고 null이 될 수 있습니다.

내가 마지막으로, 나는 한 테스트하려면 : 잠시 동안

while [ true ]; do v=`shuf -i 0-4 -n1`; echo $v; done 

, 나는 유효한 번호를. 그래서 변수에 전달할 때 어떻게 든 인식 할 수없는 문자 나 무언가를 얻는 것처럼 보입니다.

+0

나는 작업에서 껍질을 벗긴 하나 이상의 컴퓨터에서이 작업을 시도했습니다. 하드웨어 문제는 아닙니다. –

답변

2

예제에는 4 개의 배열 요소가 있습니다.

array=("one" "two" "three" "four"); 
declare -p array 

출력 :

declare -a array='([0]="one" [1]="two" [2]="three" [3]="four")' 

귀하의 shuf -i 0-4 -n1 생산 다섯 다른 번호 (0,1,2,3,4).

사용

unset array[`shuf -i 0-3 -n1`] 

또는

unset array[$RANDOM%4] 
+0

따옴표를 사용하는 것이 좋습니다 :'unset 'array [$ RANDOM % 4]''그렇지 않으면 명령이 경로명 확장의 영향을받습니다. (그리고 네, 이것은 작은 따옴표입니다). –

+0

@gniourf_gniourf :이 힌트를 가져 주셔서 감사합니다. – Cyrus

0

아! 도움을 주셔서 감사합니다, 당신은 내 자신의 대답을 날 때렸다. 나는 그것 위에서 잤다. 그리고 나의 귀여운 (지금) 명백한 오류는 마침내 나에게 날이 새었다.

bash에서 간단한 카드 게임을 쓰고 있습니다. (나와 함께가는 것에 대해 묻지 말고) 0- 인덱서 $ {deck [51]}을 잊어 버렸습니다. 직관적으로 1-52 번 뒤섞을 때 바로 거기에 문제가 있습니다.

아니면 내가이 예를 들어 위의 한 (그리고 모든 지적)로 내 배열이 4 개 요소였다) 나는 추가 5.

검색되었습니다 exec 2> /tmp/45s.log exec 1>&2 set -x

의 시작 부분에서 내 스크립트가 마침내 내 오류를 알 수있었습니다. 도움을 주신 모든 분들께 감사드립니다. 나는 잠시 동안 걷는 것이 나를 도왔을 것입니다.