linux
  • bash
  • getopt
  • 2017-02-24 109 views 2 likes 
    2

    我有一个bash文件,其中我传递参数,像bash脚本不分配标志变量

    bash foo.sh update -f /var/ -v true 
    

    所以according to this answer我的脚本看起来应该像

    if [[ "$1" == "update" ]]; then 
        updater 
    fi 
    
    function updater(){ 
        verbose='false' 
        fflag='' 
        error='' 
    
    while getopts 'f:v' flag; do 
        case "${flag}" in 
        f) fflag="${OPTARG}";; 
        v) verbose='false';; 
        *) error="bflag";; 
        esac 
    done 
    
        echo $fflag 
    } 
    

    我使用的第一个脚本一个入口点,因为我有其他功能,做其他事情,但由于某种原因,上面的脚本甚至没有显示的价值$fflag我试图移出getopts循环出功能,无济于事

    +0

    您是否正在上面运行此脚本。它实际上无法运行! – Inian

    +1

    移动零件'if [[“$ 1”==“update”]];然后 更新程序 函数调用 – Inian

    回答

    6

    有3个问题:

    1. 在一开始先定义一个函数,然后调用它在脚本
    2. 你需要传递命令行中使用"[email protected]"
    3. 你的函数传递命令行参数之前打电话shift删除第一个参数

    你可以使用这个脚本:

    updater() { 
        verbose='false' 
        fflag='' 
        error='' 
    
        while getopts 'f:v' flag; do 
         case "$flag" in 
         f) fflag="${OPTARG}";; 
         v) verbose='false';; 
         *) error="bflag";; 
         esac 
        done 
    
        declare -p fflag 
    } 
    
    if [[ $1 == "update" ]]; then 
        shift 
        updater "[email protected]" 
    fi 
    
    +1

    下方的fi'非常感谢@Inian – anubhava

    +0

    谢谢。只是最后一个问题,如果没有设置标志,有没有办法显示错误?我得到类似'option的选项需要一个参数 - ..'如果只是调用脚本 – user7342807

    +0

    你想把它叫做:'bash foo.sh update -f'?选项'f'在后面有':',所以它需要一个参数 – anubhava

    相关问题