输入处理

位置参数

Positional Parameters,脚本的位置参数。

  • $0:脚本名,包含路径。
  • $1:第一个参数,以此类推。
  • ${10}:大于 9 的参数要用花括号。
#!/usr/bin/env bash

echo $0
echo $1
./foo a
./foo
a

BASENAME

可以去掉脚本的路径,只保留名称。

basename /home/kuga/foo

脚本中的用法。

name=$(basename $0)

特殊参数

参考这里。

移动参数

shift 命令可以把位置参数左移一位。

#!/usr/bin/env bash

i=1
while [ -n "$1" ]
do
    echo "param #$i = $1"
    i=$[ $i + 1 ]
    shift
done
./foo a b
param #1 = a
param #2 = b

脚本选项

选项就是以在单个连字符后跟单个字母,如:-a。由于选项和参数都是出现在脚本的后面,为了区分开来,一般是用双连字符 --,左边是选项,右边是参数,例如。

./foo -a -b -- p1 p2

要在脚本中正确解释选项和参数,不是一件容量的事情,为此官方提供了两个工具。

  • getopt
    • 外部命令。
    • 支持长选项,如 --help
    • 适合复杂的命令行工具。
  • getopts
    • 内部命令。
    • 不支持长选项。
    • 适合简单的选项场景。

Github 上也有不少选项解释项目。

getopt 命令

getopt optstring parameters
  • optstring:选项的定义。
  • parameters:选项的内容。

例如对于 optstring=ab:c

  • 单字母 ac 代表无值选项。
  • 字母 b 后跟 : 表示有值选项。

看看下面例子的输出。

getopt ab:c -a -b bval -c p1 p2
 -a -b bval -c -- p1 p2

可以看到他使用 -- 把选项和参数分隔开了。

getopts 命令

getopts 是 Bash 的内置命令,它会逐个解释选项,然后把选项的信息存储在特定变量中,方便脚本访问。这才是给我这种小菜鸡用的命令。

getopts optstring name
  • name:当前选项的名称。
  • OPTIND:每处理一个项目,该值会加 1。
  • OPTARG:如果选项有值,会保存在这个变量中。
#!/usr/bin/env bash

while getopts "ab:c:" name; do
  case $name in
    a)
      echo "Option -a"
      ;;
    b)
      echo "Option -b: $OPTARG"
      ;;
    c)
      echo "Option -c: $OPTARG"
      ;;
    \?)
      echo "Invalid option: -$OPTARG"
      exit 1
      ;;
  esac
done

# 显示 OPTIND 的值
echo "OPTIND: $OPTIND"

# 使用 shift 来移除已解析的选项和参数
shift $((OPTIND - 1))

# 剩余的非选项参数
echo "Params: $@"
./foo -a -b v1 -c v2 p1 p2
Option -a
Option -b: v1
Option -c: v2
OPTIND: 6
Params: p1 p2