配列内のすべての項目を20文字まで空白で埋めようとしていますが、ループが機能しないようです。配列項目を正しく増やすようですが、項目を変更しません。ここで私はどこで間違っていますか?
#!/bin/bash
testArray=( "bish" "bash" "bosh")
padLine () {
array=( "${@}" )
testLength=20
counter=0
##loop begins here##
for i in "${array[@]}";
do
size=${#array[$counter]}
testLength=20
#echo ""
#echo "size: " $size
#echo "Tlength: " $testLength
#echo "count: " ${array[$counter]}
#echo ""
if [ $size -lt $testLength ]
then
offset=$( expr $testLength - $size )
#echo "Offset: " $offset
case $offset in
0)
l0=""
;;
1)
l1=" "
array[$counter]=${array[$counter]/%/$l1};;
2)
l2=" "
array[$counter]="${array[$counter]/%/$l2}";;
3)
l3=" "
array[$counter]=${array[$counter]/%/$l3};;
4)
l4=" "
array[$counter]="${array[$counter]/%/$l4}";;
5)
l5=" "
array[$counter]="${array[$counter]/%/$l5}";;
6)
l6=" "
array[$counter]=${array[$counter]/%/$l6};;
7)
l7=" "
array[$counter]=${array[$counter]/%/$l7};;
8)
l8=" "
array[$counter]=${array[$counter]/%/$l8};;
9)
l9=" "
array[$counter]=${array[$counter]/%/$l9};;
10)
l10=" "
array[$counter]=${array[$counter]/%/$l10};;
11)
l11=" "
array[$counter]=${array[$counter]/%/$l11};;
12)
l12=" "
array[$counter]=${array[$counter]/%/$l12};;
13)
l13=" "
array[$counter]=${array[$counter]/%/$l13};;
14)
l14=" "
array[$counter]=${array[$counter]/%/$l14};;
15)
l15=" "
array[$counter]=${array[$counter]/%/$l15};;
16)
l16=" "
array[$counter]=${array[$counter]/%/$l16};;
17)
l17=" "
array[$counter]=${array[$counter]/%/$l17};;
18)
l18=" "
array[$counter]=${array[$counter]/%/$l18};;
19)
l19=" "
array[$counter]=${array[$counter]/%/$l19};;
*)
esac
fi
counter=$( expr $counter + 1 )
done
}
padLine "${testArray[@]}"
echo -e "${testArray[0]}"
echo -e "${testArray[1]}"
echo -e "${testArray[2]}"
予想出力:
bish #lines end here, padded to 20 chars
bash #
bosh #
実際の出力:
bish# no padding
bash
bosh
ベストアンサー1
出力のみ:
array=( bish bash bosh )
printf '%-20s#\n' "${array[@]}"
これは生産します
bish #
bash #
bosh #
... #
21列に表示されます。
新しい配列を作成して印刷するには:
array=( bish bash bosh )
for elem in "${array[@]}"; do
padarr+=( "$( printf '%-20s#' "$elem" )" )
done
printf '%s\n' "${padarr[@]}"
を使用するには、/bin/sh
以下を印刷してください。
set -- bish bash bosh
printf '%-20s#\n' "$@"
使用/bin/sh
し、$@
所定の位置で修正します。
set -- bish bash bosh
i=0
while [ "$i" -lt "$#" ]; do
set -- "$@" "$( printf '%-20s#' "$1" )"
shift
i=$(( i + 1 ))
done
printf '%s\n' "$@"
フォーマットprintf
文字列は、%-20s
左揃え文字列用に20文字を予約します。
(4.3+) 関数bash
:
pad_array () {
local padlen=$1
local -n localarray=$2
local -a tmp
local elem
for elem in "${localarray[@]}"; do
tmp+=( "$( printf '%-*s#' "$padlen" "$elem" )" )
done
localarray=( "${tmp[@]}" )
}
myarray=( bish bash bosh )
pad_array 20 myarray
printf '%s\n' "${myarray[@]}"
この機能を使用すると、pad_array
充電量を選択することもできます。
配列は名前として渡され、名前参照変数の関数によって受け取られます。つまり、関数内で名前参照にアクセスするたびに、名前付き変数が実際に使用されます。