如何将数组作为参数传递给bash函数?
注意:在Stack Overflow上没有找到答案后,我自己发布了一些粗略的解决方案.它只允许传递一个数组,它是参数列表的最后一个元素.实际上,它根本没有传递数组,而是传递了它的元素列表,这些元素通过called_function()重新组合成一个数组,但它对我有用.如果有人知道更好的方式,请随时在此处添加.
我必须在bash中编写一个函数.该函数将需要大约7个参数.我知道我可以调用这样的函数:
要使用参数调用函数:
function_name $arg1 $arg2
Run Code Online (Sandbox Code Playgroud)
我可以在函数中引用我的参数:
function_name () {
echo "Parameter #1 is $1"
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,有没有更好的方法参考函数内部的参数?我可以避免$ 1,$ 2,$ 3,......的事情,只需使用$ arg1,$ arg2,......?
是否有适当的方法或我是否需要将这些参数重新分配给函数内的其他变量?例如:
function_name () {
$ARG1=$1
echo "Parameter #1 is $ARG1"
}
Run Code Online (Sandbox Code Playgroud)
任何例子都将非常感激.
我们知道,在bash编程中,传递参数的方式是$1
...... , $N
. 但是,我发现将数组作为参数传递给接收多个参数的函数并不容易.这是一个例子:
f(){
x=($1)
y=$2
for i in "${x[@]}"
do
echo $i
done
....
}
a=("jfaldsj jflajds" "LAST")
b=NOEFLDJF
f "${a[@]}" $b
f "${a[*]}" $b
Run Code Online (Sandbox Code Playgroud)
如上所述,函数f
接收两个参数:第一个分配给x
一个数组,第二个分配给y
.
f
可以通过两种方式调用.第一种方法使用"${a[@]}"
第一个参数,结果是:
jfaldsj
jflajds
Run Code Online (Sandbox Code Playgroud)
第二种方式使用"${a[*]}"
第一个参数,结果是:
jfaldsj
jflajds
LAST
Run Code Online (Sandbox Code Playgroud)
结果都不如我所愿.那么,有没有人知道如何正确地在函数之间传递数组?
我需要循环一个关联数组并将其内容排放到临时数组(并对该值执行一些更新).
然后应该丢弃第一个数组的剩余内容,并且我想将temp数组分配给原始数组变量.
Sudo代码:
declare -A MAINARRAY
declare -A TEMPARRAY
... populate ${MAINARRAY[...]} ...
while something; do #Drain some values from MAINARRAY to TEMPARRAY
${TEMPARRAY["$name"]}=((${MAINARRAY["$name"]} + $somevalue))
done
... other manipulations to TEMPARRAY ...
unset MAINARRAY #discard left over values that had no update
declare -A MAINARRAY
MAINARRAY=${TEMPARRAY[@]} #assign updated TEMPARRAY back to MAINARRAY (ERROR HERE)
Run Code Online (Sandbox Code Playgroud) 有没有人知道一种优雅的方式来组合两个关联数组,bash
就像你正常的数组一样?这就是我在说的:
在bash中,您可以组合两个常规数组,如下所示:
declare -ar array1=( 5 10 15 )
declare -ar array2=( 20 25 30 )
declare -ar array_both=( ${array1[@]} ${array2[@]} )
for item in ${array_both[@]}; do
echo "Item: ${item}"
done
Run Code Online (Sandbox Code Playgroud)
我想用两个关联数组做同样的事情,但是下面的代码不起作用:
declare -Ar array1=( [5]=true [10]=true [15]=true )
declare -Ar array2=( [20]=true [25]=true [30]=true )
declare -Ar array_both=( ${array1[@]} ${array2[@]} )
for key in ${!array_both[@]}; do
echo "array_both[${key}]=${array_both[${key}]}"
done
Run Code Online (Sandbox Code Playgroud)
它给出以下错误:
./associative_arrays.sh:line 3:array_both:true:分配关联数组时必须使用下标
以下是我提出的解决方法:
declare -Ar array1=( [5]=true [10]=true [15]=true )
declare -Ar array2=( [20]=true [25]=true [30]=true ) …
Run Code Online (Sandbox Code Playgroud) 我想写一个Bash-Script,它通过ssh登录到几台机器,首先显示它们的主机名并执行一个命令(在每台机器上都是相同的命令).命令的主机名和输出应一起显示.我想要一个并行版本,所以ssh-commands应该在后台和并行运行.
我构建了下面附带的bashscripted.问题是:由于runonip
-function在子shell中执行,因此无法访问DATA
-array来存储结果.以某种方式可能通过"通过引用传递"函数给子shell访问数组吗?
码:
#!/bin/bash
set -u
if [ $# -eq 0 ]; then
echo "Need Arguments: Command to run"
exit 1
fi
DATA=""
PIDS=""
#Function to run in Background for each ip
function runonip {
ip="$1"
no="$2"
cmds="$3"
DATA[$no]=$( {
echo "Connecting to $ip"
ssh $ip cat /etc/hostname
ssh $ip $cmds
} 2>&1 )
}
ips=$(get ips somewhere)
i=0
for ip in $ips; do
#Initialize Variables
i=$(($i+1))
DATA[$i]="n/a"
#For the RunOnIp Function to background
runonip $ip …
Run Code Online (Sandbox Code Playgroud) 我最近发现了declare
Bash 内置函数,它声明具有局部作用域的变量,也可用于导出变量甚至设置类型。
# bar an baz have local scope
foo()
{
declare bar
local baz
}
# bing and bong are both exported
declare -x bing
export bong
# i is an integer, j is read-only integer
declare -i i=0
declare -ri j=10
Run Code Online (Sandbox Code Playgroud)
我已经开始在任何地方使用它并停止使用本地和导出。那么,为什么local
和export
甚至存在吗?
我有以下代码读取fields
Json 文件的所有内容(路径是PRIVATE_REGISTRATION_FILE
并将它们存储到PRIVATE_FIELDS
我稍后在代码中查询的关联数组 ( ) 中:
declare -A PRIVATE_FIELDS
for PRICING_FIELD in $(jq -c -r '.fields[]' "${PRIVATE_REGISTRATION_FILE}")
do
FIELD_KEY=$(jq -r '.label' <<< "${PRICING_FIELD}")
PRIVATE_FIELDS["${FIELD_KEY}"]=${PRICING_FIELD}
done
Run Code Online (Sandbox Code Playgroud)
问题是我对多个文件执行了多次此操作,即使逻辑始终相同。
因此,我想将这个逻辑提取到一个函数中,但我很难将 map 参数传递给它。
这是我尝试的:
function update_array
{
FILE_NAME=$1
eval "declare -A MAP="${2#*=}
for PRICING_FIELD in $(jq -c -r '.fields[]' "${FILE_NAME}")
do
FIELD_KEY=$(jq -r '.label' <<< "${PRICING_FIELD}")
MAP["${FIELD_KEY}"]=${PRICING_FIELD}
done
}
Run Code Online (Sandbox Code Playgroud)
我这样称呼它:
declare -A PRIVATE_FIELDS
update_array "myFile.json" "$(declare -p PRIVATE_FIELDS)"
Run Code Online (Sandbox Code Playgroud)
但是它不起作用,地图仍然是空的。
echo ${PRIVATE_FIELDS["someKey"]}
>>> (empty)
Run Code Online (Sandbox Code Playgroud)
我已经尝试了这个答案中提出的每个解决方案,但没有一个有效。我究竟做错了什么?
bash …
将关联数组作为参数传递给函数以避免重复必须迭代多个关联数组的最佳方法是什么?这样我可以给函数任意打印的数组.这就是我所拥有的:
# Snippet
declare -A weapons=(
['Straight Sword']=75
['Tainted Dagger']=54
['Imperial Sword']=90
['Edged Shuriken']=25
)
print_weapons() {
for i in "${!weapons[@]}"; do
printf "%s\t%d\n" "$i" "${weapons[$i]}"
done
}
print_weapons
Run Code Online (Sandbox Code Playgroud)