函数中的错误...我可以在函数中传递输入参数吗? [复制]
Posted
技术标签:
【中文标题】函数中的错误...我可以在函数中传递输入参数吗? [复制]【英文标题】:Error in the function ...can I pass input parameters in a function? [duplicate] 【发布时间】:2018-09-30 07:45:36 【问题描述】:这只是一小段代码......但终端给我一个错误“令牌附近的语法错误不是预期的”归档“”。
bash中的函数不接受function fun (hello)
之类的参数
function extractProcess (archive)
mv $archive $WORK_DIR
pathFile=$archive%/* #Path input archive
nameFile=$(ls $WORK_DIR)
name=$archive%.* #nameFile without exteension
case $nameFile in
*.tar.bz) tar xjf "$WORK_DIR/$nameFile" -C $WORK_DIR ;;
*.tar.bz2) tar xjf "$WORK_DIR/$nameFile" -C $WORK_DIR ;;
*.tar.gz) tar xzf "$WORK_DIR/$nameFile" -C $WORK_DIR ;;
*.bz) bunzip2 "$WORK_DIR/$nameFile" ;;
*.bz2) bunzip2 "$WORK_DIR/$nameFile" ;;
*.gz) gunzip -Ndk "$WORK_DIR/$nameFile" ;;
*.tar) tar xf "$WORK_DIR/$nameFile" -C $WORK_DIR ;;
*.tbz) tar xjf "$WORK_DIR/$nameFile" -C $WORK_DIR ;;
*.tbz2) tar xjf "$WORK_DIR/$nameFile" -C $WORK_DIR ;;
*.tgz) tar xzf "$WORK_DIR/$nameFile" -C $WORK_DIR ;;
*.zip) unzip -qq "$WORK_DIR/$nameFile" -d $WORK_DIR ;;
esac
【问题讨论】:
shellcheck 说:“试图声明参数?不要。使用 () 并将参数称为 $1, $2..” shellcheck 的其余警告(其中许多仅在更直接的问题得到解决后才显示)也是相关的。另请参阅Why you shouldn't parse the output ofls
。
您的标题是指“输入参数”,但不清楚您所说的那个短语是什么意思。 Bash 没有该术语正式提及的任何内容。
【参考方案1】:
可以,但不能声明形式参数。相反,调用函数时传递的任何参数都可以作为位置参数 $1
、$2
等在正文中使用。
# The parentheses are always empty, to signal a function definition.
# The function keyword is a non-standard extension and should be avoided.
extractProcess ()
archive=$1
...
【讨论】:
这个函数叫我sevre在for循环中被调用,这个for循环的索引是我必须在输入中传递的参数 @AndreaGhezzi,您如何/为什么认为这会使这个答案无效?$1
,在函数中,是传递给函数的第一个参数;它不再指代传递给整个脚本的第一个参数。因此,您在函数中接受参数的方式与在脚本中接受参数的方式相同。
@CharlesDuffy 我不能将输入参数传递给函数吗?然后例如在我的情况下,我记得在 for 中并使用参数作为 for 的参数
@AndreaGhezzi,“输入参数”是什么意思?您的意思是按位置传递给脚本的参数吗?如果您想通过它,请明确地这样做:extractProcess "$1" "$archive" "$workDir"
将在变量 archive
和 workDir
之前传递原始的 $1
。
@AndreaGhezzi, ...或者如果您想将脚本的所有参数传递给函数,您当然可以使用"$@"
。如果你调用yourFunction "$someVar" "$@"
,那么函数里面的"$someVar"
就是$1
,那么原来的$1
就是$2
,原来的$2
就是$3
等等。【参考方案2】:
不要尝试在函数声明中定义它们,而是使用$
参数:
function extractProcess ()
archive=$1
mv $archive $WORK_DIR
pathFile=$archive%/*
【讨论】:
function foo()
将 ksh 和 POSIX sh 函数声明形式合并为一个与前任 shell 都不完全兼容的结果。使用function foo
与古代ksh 兼容,或使用foo()
不带function
以符合POSIX sh 标准(因此与dash、ash 和所有其他POSIX 超集shell 兼容)。另见wiki.bash-hackers.org/scripting/obsolete
另外,请尝试在您的示例中显示正确的引用 - 即。 mv "$archive" "$WORK_DIR"
(或者,更好的是 mv -- "$archive" "$WORK_DIR"
,以支持以破折号开头的名称)。
这个函数叫我sevre在for循环中被调用,这个for循环的索引是我必须在输入中传递的参数
@CharlesDuffy,一切都好。我昨天写了这篇即兴(复制/粘贴)的文章,没有过多考虑引用或使用 function
关键字...以上是关于函数中的错误...我可以在函数中传递输入参数吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章