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