輸入處理

位置參數

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