Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.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
Function Shell脚本高级功能—;如何为下面的示例编写函数?_Function_Shell - Fatal编程技术网

Function Shell脚本高级功能—;如何为下面的示例编写函数?

Function Shell脚本高级功能—;如何为下面的示例编写函数?,function,shell,Function,Shell,如果变量数量较多,如何编写函数?太简单了。 使用以下脚本: #!/bin/bash doc1=docum1 doc2=docum2 doc3= pack1= pack2=package2 pack3= if [ -n $doc1 ] || [ -n $pack1 ]; then echo "doc1 is $doc1" echo "pack1 is $pack1" else echo "d

如果变量数量较多,如何编写函数?

太简单了。
使用以下脚本:

#!/bin/bash

doc1=docum1
doc2=docum2
doc3=
pack1=
pack2=package2
pack3=




if [ -n $doc1 ] || [ -n $pack1 ]; then
        echo "doc1 is $doc1"
        echo "pack1 is $pack1"
else
        echo "doc1 has empty value"
fi
结果是:

#!/bin/bash 

doc1=docum1
doc2=docum2
doc3=
# ... 
doc102222=docum102222
pack1=
pack2=package2
pack3=
#...
pack30234324=package30234324

function checkExists() {
                v1=doc$1 
                v2=pack$2

                if [ -z ${!v1} ] ; then
                                echo "$v1 is empty" 
                elif [ -z ${!v2} ] ; then 
                                echo "$v2 is empty"
                else 
                                echo "doc is ${!v1}"
                                echo "pack is ${!v2}"
                fi
}

checkExists 1 1
echo "============================" 
checkExists 2 2
echo "============================" 
checkExists 102222 30234324

如果我理解您的问题,并且您希望能够协调许多不同的
文档
对,那么一种方法是使用两个索引数组,一个持有
文档
,另一个持有
文件包
,您可以通过公共索引协调文档和文件包

例如,第一个索引适用于第一个文档和第一个文件包,第二个索引适用于下一个文档和下一个文件包,依此类推。(注意bash中的数组是零索引的,因此实际上索引
0
对应于
文档1
包1

Bash数组可以保存空值。因此,将
doc
数组初始化为:

pack1 is empty
============================
doc is docum2
pack is package2
============================
doc is docum102222
pack is package30234324
结果生成第三个元素为空的3元素数组。对于您的
pac
阵列:

doc=( docum1 docum2 "" )
其中只有第二个元素有一个值

将其与逻辑一起检查(1)是否都有值;(2) 两者都没有价值;(3) 只有
文档
有值;最后(4)只有
package
有一个值,您可以执行以下操作:

pac=( "" package2 "" )

仔细检查一下,让我知道我是否了解你需要什么,如果不留下评论,我很乐意进一步帮助你。如果您还有其他问题,请告诉我。

请勿张贴代码图片;显示问题中的代码。不过,AFAICS的图像就是您显示的代码。请注意,shell脚本不适用于代码段-它们不是可执行的JavaScript等。不清楚您的问题是什么。显示的代码中没有函数。只有6个变量——这并不多。Bash支持数组;如果您正在使用另一个shell,它也可能会这样做。像
pack1
这样的名称表示数组。您应该使用
[-n“$doc1”]| |[-n“$pack1”]
并在变量周围加上双引号。
else
子句不准确(
pack1
也为空)。Bash提供了
nameref
以避免变量间接寻址。我知道,问题是关于这个问题,无法批准该问题。也许他想从一个文件中加载变量,在这种情况下不能迭代变量的索引。你不能真的假设变量名是从问题开始按顺序编号的。除了“如果我有更多的变量,我如何编写函数?”没有其他规定。
#!/bin/bash

doc=( docum1 docum2 "" )    ## index arrays for doc and pac
pac=( "" package2 "" )

docn=${#doc[@]}             ## numer of elements in doc array

## validate it is equal to number of elements in pac
if [ "$docn" -ne "${#pac[@]}" ]; then
    printf "error: unequal elements in 'doc' and 'pac' arrays\n" >&2
    exit 1
fi

## loop over each index
for ((i=0; i<docn; i++)); do
    ## check if both have values
    if [ -n "${doc[i]}" ] && [ -n "${pac[i]}" ]; then
        printf "doc[%d] : %s\npac[%d] : %s\n" "$((i+1))" "${doc[i]}" "$((i+1))" "${pac[i]}"
    ## check if neither have values
    elif [ -z "${doc[i]}" ] && [ -z "${pac[i]}" ]; then
        printf "both doc[%d] and pack[%d] are empty\n" "$((i+1))" "$((i+1))"
    ## check if doc has value with empty package
    elif [ -n "${doc[i]}" ]; then
        printf "doc[%d] has empty value\n" "$((i+1))"
    ## otherwise doc is empty and package has value
    else
        print "pac[%d] is package without document\n" "$((i+1))"
    fi
    printf "\n"     ## tidy up with newline between output
done
$ bash doc_and_pack.sh
doc[1] has empty value

doc[2] : docum2
pac[2] : package2

both doc[3] and pack[3] are empty