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