2017-12-28 1 views
1

제 스크립트에서 사용자에게 입력을 요청하고 변수에 저장하십시오. 변수에 문자열을 사용하기 전에 길이가 너무 길면 끝에 잘라 버리고 끝에 줄임표를 추가하십시오. 그래서 모든 변수를 배열에 넣고 루프와 if 문을 통해 보내고 배열의 변수에 새 값을 재 할당합니다. 나는 많은 방법을 시도했지만 아무도 일하지 못했습니다. 다음은 예입니다 :배열을 통해 반복, 배열의 변수에 새 값을 할당하십시오.

preset1="Short string" 
preset2="Not long very string" 
preset3="A very long string here which we will then cut" 

presets=("${preset1}" "${preset2}" "${preset3}") 

for x in "${presets[@]}"; do 
    if [[ "${#x}" -gt 20 ]]; then 
     y="${x:0:20}..." 
     presets[$x]="$y" 
    fi 
done 

도와주세요!

답변

1

당신은 값을 변경하기 위해 배열의 인덱스를 통해 루프가 있습니다

for x in "${!presets[@]}"; do 
    str=${presets[$x]} 
    ((${#str} > 20)) && presets[$x]="${str:0:20}..." 
done 

연관 및 스파 스 배열의 작품뿐만 아니라입니다.


다양한 들어, 당신은 또한이 같은 매개 변수 확장을 사용할 수 있습니다

for x in "${!presets[@]}"; do 
    str=${presets[$x]} 
    suffix=${str:20} 
    presets[$x]=${str:0:20}${suffix:+...} 
done 
+0

이와 다음 해결책 작업이지만, 예 :'$ {preset3}'변수는 변경되지 않습니다. 'bash -x'를 사용하면 문자열이 잘리고 ellipsis가 추가 된 것을 볼 수 있습니다 만,'echo $ {preset3}'하면 변수의 값이 갱신되지 않는 것을 볼 수 있습니다. – vato

+0

@vato 그리고 정확히 왜 그렇게하고 싶습니까? 배열 항목을 충분히 변경하지 않습니까? – PesaThe

+0

@vato 또한 배열을'read'와 함께 직접 사용할 수 있습니다 :'IFS = read -r 'array [0]''. 변수가 전혀 필요하지 않습니다. 배열이 더 편리하면 그냥 보관하십시오. – PesaThe

1

을 당신은 배열 요소에 할당 할 array[i] 구문을 사용해야합니다

for ((i = 0; i < ${#presets[@]}; ++i)); do 
    x=${presets[i]} 
    if [[ "${#x}" -gt 20 ]]; then 
     y="${x:0:20}..." 
     presets[i]="$y" 
    fi 
done 
관련 문제