使用换行符或不使用换行符打印字符串序列

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.

的第一个字符分隔的数组元素的串联