program demo6 !! SUBCOMMANDS !! For a command with subcommands like git(1) !! you can make seperate namelists for each subcommand. !! You can call this program which has two subcommands (run, test), !! like this: !! demo6 --help !! demo6 run -x -y -z -title -l -L !! demo6 test -title -l -L -testname !! demo6 run --help implicit none !! DEFINE VALUES TO USE AS ARGUMENTS WITH INITIAL VALUES real :: x=-999.0,y=-999.0,z=-999.0 character(len=80) :: title="not set" logical :: l=.false. logical :: l_=.false. character(len=80) :: testname="not set" character(len=20) :: name call parse(name) !! DEFINE AND PARSE COMMAND LINE !! ALL DONE CRACKING THE COMMAND LINE. USE THE VALUES IN YOUR PROGRAM. write(*,*)'command was ',name write(*,*)'x,y,z .... ',x,y,z write(*,*)'title .... ',title write(*,*)'l,l_ ..... ',l,l_ write(*,*)'testname . ',testname contains subroutine parse(name) !! PUT EVERYTHING TO DO WITH COMMAND PARSING HERE FOR CLARITY use M_CLI2, only : set_args, get_args, get_args_fixed_length use M_CLI2, only : get_subcommand use M_CLI2, only : CLI_RESPONSE_FILE character(len=*) :: name ! the subcommand name character(len=:),allocatable :: help_text(:), version_text(:) CLI_RESPONSE_FILE=.true. ! define version text version_text=[character(len=80) :: & '@(#)PROGRAM: demo6 >', & '@(#)DESCRIPTION: My demo program >', & '@(#)VERSION: 1.0 20200715 >', & '@(#)AUTHOR: me, myself, and I>', & '@(#)LICENSE: Public Domain >', & '' ] ! general help for "demo6 --help" help_text=[character(len=80) :: & ' allowed subcommands are ', & ' * run -l -L -title -x -y -z ', & ' * test -l -L -title ', & '' ] ! find the subcommand name by looking for first word on command ! not starting with dash name = get_subcommand() select case(name) case('run') help_text=[character(len=80) :: & ' ', & ' Help for subcommand "run" ', & ' ', & '' ] call set_args('-x 1 -y 2 -z 3 --title "my title" -l F -L F',help_text,version_text) call get_args('x',x) call get_args('y',y) call get_args('z',z) call get_args_fixed_length('title',title) call get_args('l',l) call get_args('L',l_) case('test') help_text=[character(len=80) :: & ' ', & ' Help for subcommand "test" ', & ' ', & '' ] call set_args('--title "my title" -l F -L F --testname "Test"',help_text,version_text) call get_args_fixed_length('title',title) call get_args('l',l) call get_args('L',l_) call get_args_fixed_length('testname',testname) case default call set_args(' ',help_text,version_text) ! process help and version write(*,'(*(a))')'unknown or missing subcommand [',trim(name),']' write(*,'(a)')[character(len=80) :: & ' allowed subcommands are ', & ' * run -l -L -title -x -y -z ', & ' * test -l -L -title ', & '' ] stop end select end subroutine parse end program demo6