从循环内改变数组元素值不会按预期工作

By simon at 2018-02-28 • 0人收藏 • 23人看过

我有一个shell脚本打印功能,如下所示:

print_status()
{
 echo "$1|$2|$3|$4"
 paramArr=("$@")
 for i in "${#paramArr[@]}"
 do
   if [[ -z ${paramArr[i]} ]];
   then
       paramArr[i]="Unknown"
   fi
 done
 echo "${paramArr[*]}"
}
该函数应该打印4个值,“|”作为分隔符。我有 将print声明保留在函数的顶部,只是为了说明如何 要打印的实际值。 我也是nted来检查每个参数来到这个函数,如果是 空白值(即变量实际上不包含任何内容)打印 “未知”。我想通过上面的数组paramArr来完成此操作。但 它没有按预期工作。 示例:
Output1:
Running|162.103.172.46|3.345|-0.076
Running 162.103.172.46 3.345 -0.076 Unknown

Expected Output 1:
Running|162.103.172.46|3.345|-0.076
Running 162.103.172.46 3.345 -0.076 <-- With a "|" instead of space


Output2:
Not Running|||
Not Running    Unknown

Expected Output2:
Not Running|||
Not Running Unknown Unknown Unknown <-- With a "|" instead of space
什么是错误/缺少我的功能?

2 个回复 | 最后更新于 2018-02-28
2018-02-28   #1

你有几个问题。首先你要计数从0到数组的索引 元素的数量。当这是4时,你去from 0 - 4,即5 元素,所以你得到一个额外的。当它少于4时,它不会添加 '未知',因为你是没有足够的迭代。 其次,当你在报价单内使用[*]打印数组时, 元素之间的分隔符是the $IFS的第一个字符,由 默认是空格:

print_status()
{
    echo "$1|$2|$3|$4"
    paramArr=("$@")

    for ((i=0; i < 4; i++))
    do
        if [[ -z ${paramArr[i]} ]];
        then
            paramArr[i]="Unknown"
        fi
    done

    oldIFS="$IFS"
    IFS='|'
    echo "${paramArr[*]}"
    IFS="$oldIFS"
}

print_status Running 162.103.172.46 3.345 -0.076
print_status 'Not Running'
得到:
Running|162.103.172.46|3.345|-0.076
Running|162.103.172.46|3.345|-0.076
Not Running|||
Not Running|Unknown|Unknown|Unknown

2018-02-28   #2

你有几个问题。首先你要计数从0到数组的索引 元素的数量。当这是4时,你去from 0 - 4,即5 元素,所以你得到一个额外的。当它少于4时,它不会添加 '未知',因为你是没有足够的迭代。 其次,当你在报价单内使用[*]打印数组时, 元素之间的分隔符是the $IFS的第一个字符,由 默认是空格:

print_status()
{
    echo "$1|$2|$3|$4"
    paramArr=("$@")

    for ((i=0; i < 4; i++))
    do
        if [[ -z ${paramArr[i]} ]];
        then
            paramArr[i]="Unknown"
        fi
    done

    oldIFS="$IFS"
    IFS='|'
    echo "${paramArr[*]}"
    IFS="$oldIFS"
}

print_status Running 162.103.172.46 3.345 -0.076
print_status 'Not Running'
得到:
Running|162.103.172.46|3.345|-0.076
Running|162.103.172.46|3.345|-0.076
Not Running|||
Not Running|Unknown|Unknown|Unknown

登录后方可回帖

Loading...