shell编程 - 命令行选项

1. 处理简单选项

./test.sh -a -b -c

while [ -n "$1" ]
do
  case "$1" in
    -a) echo "have -a option" ;;
    -b) echo "have -b option" ;;
    -c) echo "have -c option" ;;
    *) echo "$1 is not an option" ;;
  esac
  shift
done

通过遍历参数的方式处理选项

2. 分离参数和选项

./test.sh -a -b -c -- test1

# 处理选项
while [ -n "$1" ]
do
  case "$1" in
    -a) echo "have -a option" ;;
    -b) echo "have -b option" ;;
    -c) echo "have -c option" ;;
    --) shift
        break ;;
    *) echo "$1 is not an option" ;;
  esac
  shift
done

# 处理参数
count=1
for param in $@
do
  echo "Parameter #$count: $param"
  count=$[ $count + 1 ]
done

3. 处理带值的选项

./test.sh -a -b test1 -c -- test1

# 处理带值的选项
while [ -n "$1" ]
do
  case "$1" in
    -a) echo "have -a option" ;;
    -b) param="$2"
        echo "have -b option, with parameter $param"
        shift ;;
    -c) echo "have -c option" ;;
    --) shift
        break ;;
    *) echo "$1 is not an option" ;;
  esac
  shift
done

# 处理参数
count=1
for param in "$@"
do
  echo "Parameter #$count: $param"
  count=$[ $count + 1 ]
done

4. 使用getopt命令格式化选项

getopt optstring parameters

# optstring 为ab:c, 表示有abc 三个选项,并且b选项后有:表示此选项是带值选项
# parameters 为 -ab test1 -c test2 test3, 是需要根据optstring的说明格式化的命令行选项和参数
getopt ab:c -ab test1 -c test2 test3
# 格式化结果为
-a -b test1 -c -- test2 test3

./test.sh -ab test1 -c test2 test3

# set -- 将格式化后的标准选项参数,替换命令行原来的选项和参数
set -- $(getopt ab:c "$@")
while [ -n "$1" ]
do
  case "$1" in
    -a) echo "have -a option" ;;
    -b) param="$2"
        echo "have -b option, with parameter $param"
        shift ;;
    -c) echo "have -c option" ;;
    --) shift
        break ;;
    *) echo "$1 is not an option" ;;
  esac
  shift
done

# 处理参数
count=1
for param in "$@"
do
  echo "Parameter #$count: $param"
  count=$[ $count + 1 ]
done

getopt 对于命令行参数中具有“test1 test2" 类似引号和空格的参数无法正常处理

4. 使用getopts命令循环处理选项 (推荐)

getopts optstring variable

getopts # 每次从命令行参数中处理一个值,并将结果放在variable中, 处理完选项后结束循环,将参数留给后面的程序去处理
optstring # 选项的后面带:则表明选项有值,在optstring的前面加:则表明忽略错误的选项输出
$OPTARG # 环境变量存储当前正处理的选项的所带的参数值
$OPTIND # 环境变量$OPTIND默认值为1,处理完一个命令后选项后会将其值加1

./test.sh -ab test1 -cd "test2 test3"

while getopts :ab:cd opt
do
  case "$opt" in
    a) echo "found the -a option" ;;
    b) echo "found the -b option, with value $OPTARG" ;;
    c) echo "found the -c option" ;;
    d) echo "found the -d option" ;;
    *) echo "Unknown option: $opt" ;;
  esac
done

shift $[ $OPTIND - 1 ]

# 处理参数
count=1
for param in "$@"
do
  echo "Parameter #$count: $param"
  count=$[ $count + 1 ]
done
posted @   箫笛  阅读(182)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示