如何将数组作为参数传递给bash函数?
注意:在Stack Overflow上没有找到答案后,我自己发布了一些粗略的解决方案.它只允许传递一个数组,它是参数列表的最后一个元素.实际上,它根本没有传递数组,而是传递了它的元素列表,这些元素通过called_function()重新组合成一个数组,但它对我有用.如果有人知道更好的方式,请随时在此处添加.
我有的是这个:
progname=${0%.*}
progname=${progname##*/}
Run Code Online (Sandbox Code Playgroud)
这可以嵌套(或不嵌套)成一行,即单个表达式吗?
我正在尝试从脚本名称中删除路径和扩展名,以便只保留基本名称.以上两行都运行正常.我的"C"性质只是让我更加混淆这些.
如何将关联数组作为参数传递给函数?这在巴什有可能吗?
以下代码未按预期工作:
function iterateArray
{
local ADATA="${@}" # associative array
for key in "${!ADATA[@]}"
do
echo "key - ${key}"
echo "value: ${ADATA[$key]}"
done
}
Run Code Online (Sandbox Code Playgroud)
将关联数组传递给像普通数组这样的函数不起作用:
iterateArray "$A_DATA"
Run Code Online (Sandbox Code Playgroud)
要么
iterateArray "$A_DATA[@]"
Run Code Online (Sandbox Code Playgroud) 令我惊讶的是,我在1小时后找不到答案.我想将一个数组传递给我的脚本,如下所示:
test.sh argument1 array argument2
Run Code Online (Sandbox Code Playgroud)
我不想把它放在另一个bash脚本中,如下所示:
array=(a b c)
for i in "${array[@]}"
do
test.sh argument1 $i argument2
done
Run Code Online (Sandbox Code Playgroud) 我想创建一个迭代数组并插入给定值的函数(如果尚未包含它).我在我的代码的两个不同部分使用此函数,因此我必须使用不同的数组.因此我将数组名称传递给函数.现在我无法弄清楚如何分配数组的插槽来存储元素在这个地方.
这是我的代码:
name=("hello" "world")
function f {
array_name=$2[@]
array=("${!array_name}")
length=${#array_name[@]}
for (( i = 0; i <= $length; i++ )); do
if [[ "${array[i]}" = "$1" ]];
break;
fi
if [[ "$i" = "$length" ]]; then
${2[$length+1]=$1};
fi
done
}
f "test" "name"
Run Code Online (Sandbox Code Playgroud)
编辑:我希望数组附加给定的值,就像这样
for i in ${name[@]}
do
echo $i
done
Run Code Online (Sandbox Code Playgroud)
会有这个输出:
hello
world
test
Run Code Online (Sandbox Code Playgroud)
但显然"${2[$length+1]=$1}"不起作用.
(传递数组的想法是从这里:bash如何将数组作为参数传递给函数)
我知道如何从这样的数组中获取随机项:
declare -a ARRAYISO=(100 200 400 800)
echo ${ARRAYISO["$[RANDOM % ${#ARRAYISO[@]}]"]}
Run Code Online (Sandbox Code Playgroud)
显然,我可以像驴一样对每个数组执行此操作,但我想创建一个函数,它将数组作为参数并返回随机元素。
我正在尝试:
randArrayElement() {
randElement=${$1["$[RANDOM % ${#$1[@]}]"]}
echo $randElement
}
randArrayElement ARRAYISO
Run Code Online (Sandbox Code Playgroud)
但它不喜欢我的 $1...我尝试过 ", ', ` ,bash 不解释 $1 var...
我想向 bash 中的函数发送多个参数。我怎样才能做到这一点,以便函数正确解析每个参数?
如果可能的话希望避免使用eval。
这是我尝试使用的代码。
#!/bin/bash
arr_files=(
test_file
test_file1
test_file2
)
user=user10
group=user10
cp_chmod_chown(){
# $1 = chmod value
# $2 = chown value
# $3 = array of files
chmod_value=$1
shift
chown_value=$2
shift
arr=("$@")
for i in "${arr[@]}"; do
echo arr value: $i
done
echo chmod_value: $chmod_value
echo chown_value: $chown_value
}
cp_chmod_chown "644" "$user:$group" "${arr_files[@]}"
Run Code Online (Sandbox Code Playgroud)
但是,我无法正确移出前两个参数,因此参数在数组中混杂在一起。这是运行上述脚本后的输出,您可以看到chown_value由于某种原因是数组中的第一个值:
# ./cp_arra_chmod_chown.sh
arr value: test_file
arr value: test_file1
arr value: test_file2
chmod_value: 644
chown_value: test_file
Run Code Online (Sandbox Code Playgroud)
我尝试将参数以不同的顺序放置,并使用引号和不使用引号,我尝试过的似乎都不起作用。如何将多个参数传递给函数?