Bash:添加内联是否修改脚本

时间:2018-01-09 14:22:32

标签: bash scripting

我正在编写一个bash脚本,我需要根据参数做两个不同的操作。

例如,在没有params(declare module '*.vue' { import Vue from 'vue'; export default Vue; } )的情况下调用我的脚本,它应该这样做:

./script

如果我向我的脚本(docker-compose run ...)发送一个参数,它应该这样做:

./script -d

所以docker-compose -f file run...是根据参数添加的唯一部分。我不想在每个if语句中重复整个代码,有更好的方法吗?

3 个答案:

答案 0 :(得分:3)

一种选择是使用数组。如果存在-d,则将-f "$file"添加到数组中。

args=()
[[ $1 == -d ]] && args+=(-f "$file")
docker-compose "${args[@]}" run...

另一种方法是仅在设置变量时使用:+替换备用值。如果$option设置为-d,则替换-f "$file";如果它是空的,那就把它留空。

option=
[[ $1 == -d ]] && option=-d
docker-compose ${option:+-f "$file"} run...

这两个选项都将处理包含正确空格的文件名。

答案 1 :(得分:0)

处理args的许多不同方法(包括.controller("newsAppCtrl",['$scope','$location','$routeParams',($scope, $location, $routeParams)=>{ console.log($routeParams); //empty object setTimeout(function () { console.log($routeParams); //in this case property is there },100); ),但最简单的是,

getopts

答案 2 :(得分:0)

解析参数的方法有很多种。 test(或[[)是最简单的方法,但如果存在多个条件的可能性,则case语句可能更可取:

#!/usr/bin/env bash

case "$1" in;
  -d) args=( -f "file" ) ;;
  "") args=() ;;
  *) echo "Usage error." >/dev/null; exit 1 ;;
esac

docker-compose "${args[@]}" run

对于更大规模的选项处理,getopts可能是要走的路:

#/usr/bin/env bash

args=()
while getopts hdf: opt; do
  case "$opt" in
    h) printf "Usage: ${0##*/} [-d]"; exit 0 ;;
    d) args=( -f "file" ) ;;       # use a static file
    f) args=( -f "$OPTARG" ) ;;    # use a user-specified file
  esac
done
shift $((OPTIND - 1))

docker-compose "${args[@]}" run

有关使用信息,请搜索" SHELL BUILTIN COMMANDS" getopts的部分。