Shell传入参数的处理(getopt和手工传入)

  1. $# 传递到脚本的参数个数。

  2. $* 以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过9个

  3. $$ 脚本运行的当前进程ID号

  4. $! 后台运行的最后一个进程的进程ID号

  5. @ 与 @ 与 @#相同,但是使用时加引号,并在引号中返回每个参数

  6. $- 显示shell使用的当前选项,与set命令功能相同

  7. $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
    变量 含义
    8.$0 脚本名字 $1 位置参数 #1 $2 - $9 位置参数 #2 - #9 KaTeX parse error: Expected 'EOF', got '#' at position 11: {10} 位置参数 #̲10 9.# 位置参数的个数 “ ∗ " 所 有 的 位 置 参 数 ( 作 为 单 个 字 符 串 ) ∗ " *" 所有的位置参数(作为单个字符串) * " "()"@” 所有的位置参数(每个都作为独立的字符串)
    10.KaTeX parse error: Expected '}', got '#' at position 2: {#̲*} 传递到脚本中的命令行参数…{#@} 传递到脚本中的命令行参数的个数
    12.$_ 之前命令的最后一个参数
    使用shell处理的时候对参数的处理是个基本模块,所以今天找到一篇简单易懂的文章来进行参考,作为以后shell参数处理的模板,推荐使用getopts形式进行参数的处理。如果需要支持长选项可以使用getopt

    在bash中,可以用以下三种方式来处理命令行参数,每种方式都有自己的应用场景。
    1、 手工处理方式
    2、 getopts
    3、 getopt
    下面我们依次讨论这

1. getopts种处理方式。

应该说绝大多数脚本使用该函数就可以了,如果需要支持长选项以及可选参数,那么就需要使用getopt.
下面是getopt的一个例子

#!/bin/bash
#
# Copyright 
#
# Brief: 
# Arguments: None
#
set -e # set -o errexit
set -u # set -o nounset
set -o pipefail

function usage(){
  echo """Usage:
  $(basename $0) [option]...
Options:
  -i|--section      section name
  -s|--start_date   start_date_id yyyymmdd or  yyyymm
  -s|--end_date     end_date_id yyyymmdd or  yyyymm
  -h|--help         print help information
 """
}

function main(){

  if [ $# -lt 6 ]; then
    usage
    exit
  fi

  # get arguments
  GETOPT_ARGS=$(getopt -o i:s:e:h: --long section:,start_date:,end_date:,help -- "$@")
  eval set -- "${GETOPT_ARGS}"

  while [ -n "$1" ]; do
      case "$1" in
          -i|--section)
            section_name=$2
      echo $2
            shift 2
            ;;
          -s|--start_date)
            start_date=$2
            echo $2
            shift 2
            ;;
          -e|--end_date)
            end_date=$2
            echo $2
            shift 2
            ;;
          -h|--h|--help)
            usage
            shift 1
            ;;
          --)
            break
            ;;
          *)
           usage;
           break
           ;;
      esac
  done

echo "/home/felix/Acg_detail_v1.1.py -i ${section_name} -s ${start_date} -e ${end_date}"

}

main "$@"

2.手工处理方式

在手工处理方式中,首先要知道几个变量,还是以上面的命令行为例:
$0 : ./test.sh,即命令本身,相当于C/C++中的argv[0]
$1 : -f,第一个参数.
$2 : config.conf
$3, $4 … :类推。
KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲ 参数的个数,不包括命令本身,…#为4.
$@ :参数本身的列表,也不包括命令本身,如上例为 -f config.conf -v --prefix=/home
∗ : 和 * :和 @相同,但" ∗ " 和 " *" 和 " ""@"(加引号)并不同," ∗ " 将 所 有 的 参 数 解 释 成 一 个 字 符 串 , 而 " *"将所有的参数解释成一个字符串,而" ""@"是一个参数数组。如下例所示:

#!/bin/bash
 
 for arg in "$*"
 do
     echo $arg
 done
 
 for arg in "$@"
 do
     echo $arg
 done

你可能感兴趣的:(Shell)