处理命令行参数

funcs=($(declare -F -p | cut -d " " -f 3))

until
    if [ ! -z "$1" ]; then
        # check if the first arg is a function in this file, or use a default
        if [[ " ${funcs[@]} " =~ " $1 " ]]; then
            cmd=$1
            shift 1
        else
            cmd="a"
        fi

        $cmd "$@"
        if [ $? == 127 ]; then
            help
        fi

        exit
    else
        help
    fi
do
    echo
done

--------------------------------

测试:

#!/bin/bash

#set -e

help(){
    echo "help"
}

a(){
echo "aaaaaaa"
}

b(){
echo "bbbbbb"
}

c(){
echo "cccccc"
}

funcs=($(declare -F -p | cut -d " " -f 3))

until
    if [ ! -z "$1" ]; then
        # check if the first arg is a function in this file, or use a default
        if [[ " ${funcs[@]} " =~ " $1 " ]]; then
            cmd=$1
            shift 1
        else
            cmd="a"
        fi

        $cmd "$@"
        if [ $? == 127 ]; then
            help
        fi

        exit
    else
        help
    fi
do
    echo
done

-----------------------

[root@mhc sh]# ./a
help
[root@mhc sh]# ./a a
aaaaaaa
[root@mhc sh]# ./a b
bbbbbb
[root@mhc sh]# ./a c
cccccc
[root@mhc sh]# ./a  a b
aaaaaaa
[root@mhc sh]# ./a  a b c
aaaaaaa
[root@mhc sh]# ./a  b c
bbbbbb
[root@mhc sh]# ./a  b c d
bbbbbb
[root@mhc sh]# ./a   d
aaaaaaa
-------------------------------------

a(){
echo "$1"
}

---------

[root@mhc sh]# ./a a hahah
hahah
---------------------------

=====================================================

until
cmd=$1
if [[ -z "$cmd" ]]; then
help
fi
shift 1
$cmd "$@"
[ "$?" -ne 127 ]
do
help
exit
done

转载于:https://www.cnblogs.com/mhc-fly/p/6871914.html

在C++中解析处理命令行参数通常涉及到`main()`函数和`argc`, `argv`这两个预定义变量。`argc`代表命令行参数的总数(包括程序名),而`argv`是一个字符串指针数组,每个元素存储了一个单独的命令行参数。 你可以按照以下步骤进行: 1. **包含头文件**:首先,包含`<cstdlib>`和`<cstring>`头文件,它们分别包含了处理命令行参数的相关函数。 ```cpp #include <cstdlib> #include <cstring> ``` 2. **获取参数**:在`main()`函数开始,检查`argc`是否大于1,因为第一个元素`argv[0]`总是指向程序本身的名字。 ```cpp if (argc > 1) { ``` 3. **遍历参数**:从`argv[1]`开始迭代,处理每个命令行参数。可以使用`std::string`或者其他字符串处理函数如`std::getline`。 ```cpp for (int i = 1; i < argc; ++i) { std::string arg = argv[i]; // 将参数转换为字符串 // 进行进一步处理... } ``` 4. **处理选项或值**:如果你有特定的选项或需要处理的值,可以创建一个开关结构体或者使用`switch`语句来区分。例如,使用前缀`-`表示选项,剩余部分是选项值。 ```cpp for (int i = 1; i < argc; ++i) { if (arg[0] == '-') { // 假设选项以 '-' 开始 // 分割选项名和值(如果有) int index = std::find(arg.begin() + 1, arg.end(), '='); if (index != arg.end()) { std::string option = arg.substr(1, index - 1); // 选项名 std::string value = arg.substr(index + 1); // 选项值 // 处理选项及其值... } else { // 处理仅有的选项名... } } else { // 如果不是选项,可能是直接参数... } } ``` 5. **错误处理**:记得处理无效的参数或未预期的情况,并提供有用的错误信息。 ```cpp if (/* 参数错误 */ ) { std::cerr << "Invalid argument." << std::endl; return 1; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值