函数中的错误...我可以在函数中传递输入参数吗? [复制]

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 of ls 您的标题是指“输入参数”,但不清楚您所说的那个短语是什么意思。 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" 将在变量 archiveworkDir 之前传递原始的 $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 关键字...

以上是关于函数中的错误...我可以在函数中传递输入参数吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

我们可以在 PHP 中的任何函数中将数组作为参数传递吗?

传递函数是 RPyC 中的参数

熊猫中的 series.tolist() 和 list 之间有区别吗

pyqt5 继承python类可以传递信号函数吗

函数应该有输入参数吗?

定义一个js函数,有三个参数,调用的时候,只传递前2个参数,这样可以吗?