【问题标题】: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 没有该术语正式提及的任何内容。

标签: linux bash shell


【解决方案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 关键字...
猜你喜欢
  • 2022-01-25
  • 2020-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-23
  • 1970-01-01
  • 2017-11-17
  • 1970-01-01
相关资源
最近更新 更多