使用换行符或不使用换行符打印字符串序列
Printing sequence of strings either using a newlines or without
我正在打印一系列字符串,要么在条目之间使用换行符。或者将它们并排打印。
如果可以的话,我想简化一下。
当nwline=1
时,在打印参数之间使用新行。当 nwline=0
时,参数打印在同一行。
nl
确定使用 ctp
.
着色的参数数量
pfm ()
{
nwline=0
nl=3
ctp=$(tput bold)$(tput setaf 39)
if (( nl >= 1 )); then
case $nwline in
1) printf '%s\n' "${ctp}${@:1:nl}${rst}" ;;
*) printf '%s' "${ctp}${@:1:nl}${rst}" ;;
esac
if (( nl + 1 <= $# )); then
case $nwline in
1) printf '%s\n' "${@:nl+1}" ;;
*) printf '%s' "${@:nl+1}" ;;
esac
fi
else
case $nwline in
1) printf '%s\n' "$@" ;;
*) printf '%s' "$@" ;;
esac
fi
}
根据建议我做了以下事情
aggr=("$@")
nk=$((nl-1))
rst=$(tput sgr0) ; ctp=$(tput bold)$(tput setaf 39)
(( nwline == 1 )) && fs=$'\n' || fs=' '
( IFS=$fs ; echo "${ctp}${aggr[*]:0:nk}${rst}" )
(( nl + 1 <= $# )) && ( IFS=$fs ; echo "${aggr[*]:nl}" )
但是当我使用 pfm "Mary" "had" "a" "little" "lamb"
时,我得到
Mary
had
little
lamb
据观察,我缺少 "a"
。
请您尝试以下操作:
pfm ()
{
local nwline=1
local nl=3
local ctp=$(tput bold)$(tput setaf 39)
local rst=$(tput sgr0)
local -a ary=("$@") # make a copy of arguments
local fs # field separator: "\n" or ""
if (( nl > $# )); then nl=$#; fi # limit the value of nl
for (( i = 0; i < nl; i++ )); do # highlight the elements indexed lower than nl
ary[i]="${ctp}${ary[i]}${rst}"
done
(( nwline == 1 )) && fs=$'\n' || fs='' # assign fs to the field separator
(IFS=$fs; echo "${ary[*]}") # execute in subshell not to modify IFS
}
至于是否使用换行符打印元素,我有
使用扩展的数组变量扩展 "${name[*]}"
到由 IFS
.
的第一个字符分隔的数组元素的串联
我正在打印一系列字符串,要么在条目之间使用换行符。或者将它们并排打印。
如果可以的话,我想简化一下。
当nwline=1
时,在打印参数之间使用新行。当 nwline=0
时,参数打印在同一行。
nl
确定使用 ctp
.
pfm ()
{
nwline=0
nl=3
ctp=$(tput bold)$(tput setaf 39)
if (( nl >= 1 )); then
case $nwline in
1) printf '%s\n' "${ctp}${@:1:nl}${rst}" ;;
*) printf '%s' "${ctp}${@:1:nl}${rst}" ;;
esac
if (( nl + 1 <= $# )); then
case $nwline in
1) printf '%s\n' "${@:nl+1}" ;;
*) printf '%s' "${@:nl+1}" ;;
esac
fi
else
case $nwline in
1) printf '%s\n' "$@" ;;
*) printf '%s' "$@" ;;
esac
fi
}
根据建议我做了以下事情
aggr=("$@")
nk=$((nl-1))
rst=$(tput sgr0) ; ctp=$(tput bold)$(tput setaf 39)
(( nwline == 1 )) && fs=$'\n' || fs=' '
( IFS=$fs ; echo "${ctp}${aggr[*]:0:nk}${rst}" )
(( nl + 1 <= $# )) && ( IFS=$fs ; echo "${aggr[*]:nl}" )
但是当我使用 pfm "Mary" "had" "a" "little" "lamb"
时,我得到
Mary
had
little
lamb
据观察,我缺少 "a"
。
请您尝试以下操作:
pfm ()
{
local nwline=1
local nl=3
local ctp=$(tput bold)$(tput setaf 39)
local rst=$(tput sgr0)
local -a ary=("$@") # make a copy of arguments
local fs # field separator: "\n" or ""
if (( nl > $# )); then nl=$#; fi # limit the value of nl
for (( i = 0; i < nl; i++ )); do # highlight the elements indexed lower than nl
ary[i]="${ctp}${ary[i]}${rst}"
done
(( nwline == 1 )) && fs=$'\n' || fs='' # assign fs to the field separator
(IFS=$fs; echo "${ary[*]}") # execute in subshell not to modify IFS
}
至于是否使用换行符打印元素,我有
使用扩展的数组变量扩展 "${name[*]}"
到由 IFS
.