我正在查看一些旧脚本,发现了一些以前从未见过的参数赋值。while循环从文本文件中读取并将值传递给函数。文本文件中的项目如下所示:
user_one:abcdef:secretfolder
函数的第一阶段看起来是这样的:
IFS=':' read -a param <<< $@
user="${param[0]}"
pass="${param[1]}"
user_folders="${param[2]}"
我以前从未见过这种作业,我想知道这是否只是一种替代的处理方式。上面的和这个一样吗?
IFS=':' read -a param <<< $@
user="${1}"
pass="${2}"
user_folders="${3}"
(由于${0}
是文件本身的名称,因此值更改为1-3(。这个剧本已有5年历史;除非我错过了的东西,否则这种原始的任务似乎还有很长的路要走
我仍在学习shell脚本,但据我所知,设置IFS=':'
将拆分:
上的字段,而不是空白,因此在示例中,传递给函数的"${param[0]}"
和${1}
的值将为user_one
有人能解释一下为什么应该使用"${param[0]}"
而不是${1}
吗?
命令:
IFS=':' read -a param <<< $@
将命令自变量($@
(中以:
分隔的字段读取到名为param
的数组变量中。Bash数组的工作原理与其他语言中的列表一样,并且使用方括号对它们进行索引。${param[0]}
是第一个字段,${param[1]}
然后是下一个字段,依此类推。像这样的数组可以包含任何,正是因为read
命令中的$@
,这个param
数组恰好包含了参数。它可以很容易地包含foo
、bar
和baz
,如果它被创建为:
param=(foo bar baz)
${1}
、${2}
等语法始终引用脚本参数。