如何为调用 bash 的多个参数提供参数

如何为调用 bash 的多个参数提供参数

我知道标题不是很清楚,但我真的不知道如何陈述我的问题。

我有一个 shell,我希望能够使用多个参数来调用它,有些需要参数,有些则不需要。

例子(我已经讲过了):

]$ ./my_script -j arg1

]&./我的脚本-p

我的问题是我希望能够使用多个参数,例如:

]$ ./my_script -paj

将参数传递给需要它的参数,如下所示:

]$ ./my_script -paj arg4a arg4j

但我似乎无法做到这一点,同时尝试将需要 arg 的第一个参数作为其参数...

所以我的问题是,有可能让它工作吗?

如果有帮助的话,我可以展示一个小样本来测试这一点。

答案1

这是一个很长的答案。这是我在工作中使用的模板(在 ksh 中启动,但在 bash 中有效)。

执行“-paj a_arg j_arg”不会起作用,但您可以修改它以使其以这种方式工作。检查这些paramnum行。

#!/bin/bash
# Filename: 
# Location: 
# Author: 
# Startdate: 
# Title: 
# Purpose: 

# DEFINE FUNCTIONS
usage() {
   echo "usage: SCRIPTNAME [-us]"
}

isflag() {
   # input: $1=word to parse
   # returns: TRUE if $1 starts with a dash.
   retval=0
   if [[ $1 = --* ]] ;
   then
      # long-name flag
      retval=2
   elif [[ $1 = -* ]] ;
   then
      # params to split
      retval=1
   fi
   echo $retval
}

function parseParam {
   # determines if --longname or -shortflagS that need individual parsing
   trimParam=$(echo $param|sed -n 's/--//p')
   if [ ! -z "$trimParam" ];
   then
      parseFlag $trimParam
   else
      splitShortParams
   fi
}

function splitShortParams {
   i=2
   while (( i <= ${#param} ))
   do
      char=$(expr substr "$param" $i 1)
      parseFlag $char
      (( i += 1 ))
   done
}

function parseFlag {
   flag=$1
   hasval=0
   case $flag in
      # INSERT NEW FLAGS HERE
      #"v" | "verbose") verbose=1;; # simple flag
      "i" | "infile" | "inputfile") getval;infile1=$tempval;;
      #"s" | "silent") silent=1;;
      "u" | "usage") usage; exit;;
   esac

   # COMMENT THIS IF NOT DEBUGGING
   #if [[ hasval -eq 1 ]];
   #then
   #   echo "flag: $flag = $tempval"
   #else
   #   # goal: cause an error
   #   echo "flag: $flag"
   #fi
}

function getval {
   if [ ! -z "$nextparam" ] && [[ $(isflag $nextparam) -eq 0 ]]
   then
      tempval=$nextparam
      hasval=1
      paramnum=$nextparamnum
   else
      #the var should not be changed from blank/default value
      tempval=
   fi
}

# INITIALIZE VARIABLES
infile1=
outfile1=
today=`date '+%Y-%m-%d'`
server=`uname -n`

# VALIDATE PARAMETERS
# scroll through all parameters and check for isflag.
# if isflag, get all flags listed. Also grab param#.
paramcount=$#
thiscount=0
paramnum=0
while [[ paramnum -lt paramcount ]]
do
   paramnum=$((paramnum+1))
   eval param=\${$paramnum}
   nextparamnum=$((paramnum+1))
   eval nextparam=\${$nextparamnum}
   case $param in
      "-") [ ];; #null flag
   esac
   if [[ ! -z "$param" ]]
   then 
      # parameter $param exists.
      # thisisflag=$(isflag $param)
      if [[ $(isflag $param) -gt 0 ]];
      then
         # IS FLAG
         parseParam
      else
         # IS VALUE
         (( thiscount += 1 ))
         #echo value: ${param} # COMMENT IF NOT DEBUGGING
         #[[ $thiscount = 1 ]] && infile1=${param} #EXAMPLE
      fi
   fi
done

# CONFIRM TOTAL NUMBER OF PARAMETERS IS CORRECT
#if [[ $thiscount -lt 2 ]];
#then
#   echo "Error: fewer than 2 parameters..."
#   exit
#fi

# SET VARIABLES TO DEFAULTS IF NOT ALREADY CONFIGURED
#if [[ valuen -eq 0 ]] ; then valuen=15; fi

# MAIN LOOP

相关内容