我试图用空格将数组的所有项目填充到 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]}"
Run Code Online (Sandbox Code Playgroud)
预期输出:
bish #lines end here, padded to 20 chars
bash #
bosh #
Run Code Online (Sandbox Code Playgroud)
实际输出:
bish# no padding
bash
bosh
Run Code Online (Sandbox Code Playgroud)
仅用于输出:
array=( bish bash bosh )
printf '%-20s#\n' "${array[@]}"
Run Code Online (Sandbox Code Playgroud)
这会产生
bish #
bash #
bosh #
Run Code Online (Sandbox Code Playgroud)
...#出现在第 21 列的地方。
要创建一个新数组(并打印它):
array=( bish bash bosh )
for elem in "${array[@]}"; do
padarr+=( "$( printf '%-20s#' "$elem" )" )
done
printf '%s\n' "${padarr[@]}"
Run Code Online (Sandbox Code Playgroud)
使用/bin/sh,只需打印:
set -- bish bash bosh
printf '%-20s#\n' "$@"
Run Code Online (Sandbox Code Playgroud)
使用/bin/sh,$@就地修改:
set -- bish bash bosh
i=0
while [ "$i" -lt "$#" ]; do
set -- "$@" "$( printf '%-20s#' "$1" )"
shift
i=$(( i + 1 ))
done
printf '%s\n' "$@"
Run Code Online (Sandbox Code Playgroud)
该printf格式化字符串%-20s储量20个字符左对齐字符串。
作为bash(4.3+) 函数:
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[@]}"
Run Code Online (Sandbox Code Playgroud)
pad_array此处的功能还允许您选择填充量。
该数组按其名称传递,并由名称引用变量中的函数接收。这意味着无论何时在函数中访问名称引用,都会实际使用命名变量。