Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法识别为命令-bash_Bash - Fatal编程技术网

无法识别为命令-bash

无法识别为命令-bash,bash,Bash,我写了一个bash脚本,它接受了一组参数,并基于这些参数我们做了不同的事情。所以在这种情况下,我想说: ./acorn.sh aisiscore install 但它会转到我的错误消息,指出第一个参数没有被重新确认,我应该使用aiiscore或assets。我检查了拼写,我是正确的,我没有正确地检查参数吗 #!/bin/bash set -e function checkCoreArgument(){ if [[ $1 == 'aisiscore' ]] then chec

我写了一个bash脚本,它接受了一组参数,并基于这些参数我们做了不同的事情。所以在这种情况下,我想说:

./acorn.sh aisiscore install
但它会转到我的错误消息,指出第一个参数没有被重新确认,我应该使用aiiscore或assets。我检查了拼写,我是正确的,我没有正确地检查参数吗

#!/bin/bash

set -e

function checkCoreArgument(){
  if [[ $1 == 'aisiscore' ]]
  then
    checkAisisArguments
  elif [[ $1 == 'assets' || $1 == 'asset' ]]
  then
    checkAssetsArguments
  else
    echo "$1 is not recognized. Please try aisiscore or assets"
  fi
}

function checkAisisArguments(){
  if [[ $2 == 'install' ]]
  then
    installAisisCore
  elif [[ $2 == 'update' ]]
  then
    updateAisisCore
  elif [[ $2 == 'components' ]]
  then
    callCompomnentsCheck
  else
    echo "$2 is not recognized. Please try install or update."
  fi
}

function checkAssetsArguments(){
  if [[ $2 == 'install' ]]
  then
    installAssets
  elif [[ $2 == 'update' ]]
  then
    updateAisisCore
  else
    echo "$2 is not recognized. Please use install or update."
  fi
}

function installAisisCore(){
  cd scripts/install/
  chmod +x InstallAisisCore.sh
  sudo InstallAisisCore.sh
}

function updateAisisCore(){
  cd scripts/update/
  chmod +x UpdateAisisCore.sh
  sudo UpdateAisisCore.sh
}

function installAssets(){
  cd scripts/install/
  chmod +x InstallAssets.sh
  sudo InstallAssets.sh
}

function updateAisisCore(){
  cd scripts/update/
  chmod +x UpdateAssets.sh
  sudo UpdateAssets.sh
}

function callCompomnentsCheck(){
  cd scripts/install
  chmod +x InstallComponents.sh
  sudo ./InstallComponents.sh
}

###### =============================== [ Application run ] =============== ######

checkCoreArgument #run the app!

它是自上而下的,因此更容易阅读。

函数在
$1
$2
等中获得自己的参数。如果您想让它们解析脚本的参数,必须将它们传入

checkCoreArgument "$@"
相互调用的函数也是如此。这些函数调用需要显式地传递参数

function checkCoreArgument(){
  if [[ $1 == 'aisiscore' ]]
  then
    checkAisisArguments "$@"
  elif [[ $1 == 'assets' || $1 == 'asset' ]]
  then
    checkAssetsArguments "$@"
  else
    echo "$1 is not recognized. Please try aisiscore or assets"
  fi
}
还有一个小建议:您可以使用
case
语句使这些检查变得更好

case $1 in
    aisiscore)    checkAisisArguments  "$@";;
    asset|assets) checkAssetsArguments "$@";;

    *) echo "$1 is not recognized. Please try aisiscore or assets" >&2;;
esac

这只是约翰·库格曼答案的扩展

  • 您不需要同时使用
    函数
    关键字和
    ()
    括号
  • 有很多剪切粘贴代码可以“参数化”

建议:使用
while[$#-gt 0]]
循环和
case
语句以及
shift
循环遍历所有参数,在执行过程中设置变量以跟踪应执行的任务(以及从参数中需要的任何其他数据)。然后将实际执行任务的代码放入由变量控制的
if
块中。
#!/bin/bash

set -e

function checkArgs {
  case $1 in 
    aisiscore) 
      case $2 in
        install)    install "AisisCore"  ;;
        update)     update  "AisisCore"  ;;
        components) install "Components" ;;
        *) echo "$2 is not recognized. Please try install or update." ;;
      esac
      ;;
    assets | asset) 
      case $2 in 
        install) install "Assets" ;;
        update)  update  "Assets" ;;
        *) echo "$2 is not recognized. Please use install or update." ;;
      esac
      ;;
    *) echo "$1 is not recognized. Please try aisiscore or assets" ;;
  esac
}

function install    { cd scripts/install/ && callScript "Install${1}.sh"; }
function update     { cd scripts/update/  && callScript "Update${1}.sh"; }
function callScript { chmod +x "$1" && sudo "$1"; }

###### =============================== [ Application run ] =============== ######

checkArgs "$@"  #run the app!