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
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战