当我将数组值用作 bash 脚本中位置参数的输入时,我丢失了数组值
Posted
技术标签:
【中文标题】当我将数组值用作 bash 脚本中位置参数的输入时,我丢失了数组值【英文标题】:I lose my array values when I use it as input for a positional parameter in bash script 【发布时间】:2021-10-31 05:00:58 【问题描述】:我编写了以下脚本:
cat BaseReCall.sh
#!/bin/bash
#### Usage: < input > < ref > < (array of dbsnps) >
input=$1
ref=$2
Pickle=$3
echo "$Pickle[@]"
### Assign variables
BaseReCall="gatk BaseRecalibrator \\
-I $input \\
-R $ref \\
-O recal_table "
dir=$(dirname $input)
log=$dir/BaseReCall.out
string=()
## Store array values in string
for i in "$Pickle[@]";do
site=$(echo " --known-sites $i")
string+=$site
done
printf "$BaseReCall$string[@]\n" #>> $log
这个想法是允许我使用数组输入多个 dbsnp 值作为 Pickle。如果我输入 bash,数组看起来很好。
Pickle=(dbSnp gold_standard_indels)
printf "$Pickle[@]\n"
dbSnp gold_standard_indels
当我将它输入到我的函数中时,我没有得到两个 dbsnps。只有第一个。
sh BaseRecall.sh input ref "$Pickle[@]"
dbSnp
gatk BaseRecalibrator \
-I input \
-R ref \
-O recal_table --known-sites dbSnp
作为健全性检查,我也尝试在脚本之外运行循环。
string=()
## Store array values in string
for i in "$Pickle[@]";do
> site=$(echo " --known-sites $i")
> string+=$site
> done
printf "$BaseReCall$string[@]\n" #>> $log
gatk BaseRecalibrator -I -R -O recal_table --known-sites dbSnp --known-sites gold_standard_indels
它返回了我一直想要的东西。发生这种情况是因为它被作为位置参数输入吗?有没有办法让我为此 Pickle 参数输入多个值?
【问题讨论】:
不要将参数列表存储为字符串。参数列表应该存储为 arrays 本身。 而printf "$Pickle[@]\n"
是错误的。只有printf
的first 参数是格式字符串;随后的参数是用于填写该格式字符串的数据。
printf '%s\n' "$Pickle[@]"
是您打印数组每行一项的方式。
另外,当您展开一个数组时,它会为每个条目创建一个参数。所以$3
不包含你的整个数组,它只包含第一个元素;第二个进入$4
,第三个进入$5
,等等。这不是错误,它是按设计运行的。您应该 shift
参数列表中的前两项,因此 "$@"
就是您的数组,如果您希望在脚本参数列表的第三个位置传递一个数组。
【参考方案1】:
感谢 cmets 中提出的一些观点,我已经解决了我遇到的问题。我误解了数组,并通过更改我的脚本从
input=$1
ref=$2
Pickle=$3
到
input=$1
ref=$2
shift 2
Pickle=("$@")
这似乎正在工作。一位评论员还提到使用declare
来获取阵列的状态,这也有很大帮助。非常感谢。
【讨论】:
以上是关于当我将数组值用作 bash 脚本中位置参数的输入时,我丢失了数组值的主要内容,如果未能解决你的问题,请参考以下文章
为啥当我将熊猫数据框用作具有多处理功能的函数的输入时它不会改变
我的表单键没有在颤振中验证,即使在我将它用作表单中的键并输入合适的值之后
解析/传递命令行参数到bash脚本 - “$ @”和“$ *”之间有什么区别?