Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 从循环内更改数组元素值无法按预期工作_Arrays_Bash_Shell_Scripting - Fatal编程技术网

Arrays 从循环内更改数组元素值无法按预期工作

Arrays 从循环内更改数组元素值无法按预期工作,arrays,bash,shell,scripting,Arrays,Bash,Shell,Scripting,我有一个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语句保留在函数顶

我有一个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
语句保留在函数顶部,只是为了显示如何打印实际值

我还想检查这个函数的每个参数,如果是空值(即变量实际上不包含任何内容),则打印“未知”。我想通过上面的数组
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
Output1:
运行| 162.103.172.46 | 3.345 |-0.076
运行162.103.172.46 3.345-0.076未知
预期产出1:
运行| 162.103.172.46 | 3.345 |-0.076

运行162.103.172.46 3.345-0.076会出现几个问题。首先,从零到元素数计算数组索引。当这是4时,你从0到4,这是5个元素,所以你得到一个额外的元素。如果小于4,则不会添加“未知”,因为您的迭代不够远

其次,当您使用
[*]
内引号打印数组时,元素之间的分隔符是
$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'
“${#paramArr[@]}”中i的
是一个错误的构造,用于循环数组元素
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