2017-12-28 22 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'を使うと、文字列がカットされ、省略記号が追加されたことがわかりますが、' 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 
関連する問題