C++ and Unix NEED HELP

In order to run some procedures I have to run multiple unix codes which are all programs written in the computer. For example:
: ../../bin/takeData -l -dir ../../Working_Directory -trimVcal 60
then after that is ran I'd have to run
: cd ../convert_to_tree
: ./convert_to_tree XXXX
: ./pulseHeightMain XXXX
: cd ~/log/bt0500XXXX
etc.
the XXXX represents a test run number. What I want to do is be able to type a program that would look like this:
: ./AquireData -dir Working_Directory -run XXXX
that would run all above and more. AquireData would be the C++ file. What I have so far is:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main(int argc, char* argv[]) {

string file_name;
string run_num;
string config_file;
int opt = 0;

for (int i = 1; i < argc; i++) {
           if (i + 1 != argc)
               if (argv == "-dir") {
                   file_name = argv[i + 1];
               } else if (argv == "-run") {
                   run_num = argv[i + 1];
               } else if (argv == "-mask") {
                   opt = 1;
               } else if (argv == "-cfg") {
                   config file = argv[i+1];
               }
           std::cout << argv << " ";
       }

if (opt == 0){
// Unix commands for unmasked
}

if (opt == 1){
// Unix commands for unmasked
}

return 0;
}

Here is my two main questions:

  1. When I'm in the directory what would I type with the arguments to compile and run the c++ code and read the argument line? and can I make it look like how I wanted to above?

  2. How to I put unix commands in c++ so I could have something like:
    cd ~/log/bt0500 << run_num

Note: I haven't used C++ in awhile so some of the easy stuff has slipped past me, but also the reason I'm using c++ is because a shell command script like AquireData.C wouldn't be able to input directory, run number, and other options, or would it?

C/C++ really doesn't look like the language you want to use here. Everything you want to do is difficult to hard in C, and trivial in shell.

#!/bin/sh

OPT=0

while [ "$#" -gt 0 ]
do
        case "$1" in
        -cfg) cfg_file=$2; shift ;;
        -dir)  file_name=$2; shift ;;
        -run) run_num=$2; shift ;;
        -mask) OPT=1 ;;
        *)     break ;;
        esac

        shift
done

if [ -z "$cfg_file" ]
then
        echo "No config file given" >&2
        exit 1
fi

if [ -z "$file_name" ]
then
        echo "No file name given" >&2
        exit 1
fi

if [ -z "$run_num" ]
then
        echo "No run number given" >&2
        exit 1
fi

if [ "$OPT" -eq 1 ]
then
        ../../bin/takeData -l -dir $file_name -trimVcal 60
        ...
else
        ../../bin/takeData -l -dir $file_name -trimVcal 60
        ...
fi
  1. What language is that? I want to read up on it.
  2. What would be the general form of any unix command?
  3. What would the unix command to run this with the arguments look like?
    And thank your so much!

---------- Post updated 05-24-12 at 10:54 AM ---------- Previous update was 05-23-12 at 07:38 PM ----------

does this look right?

OPT=0
OP=0

while [ "$#" -gt 0 ]
do
        case "$1" in
        -cfg) cfg_file=$2; shift ;;
        -dir)  file_name=$2; shift ;;
        -run) run_num=$2; shift ;;
        -mask) OPT=1 ;;
        -root) OP=1 ;;
        *)     break ;;
        esac

        shift
done

if [ -z "$cfg_file" ]
then
        echo "No config file given" >&2
        exit 1
fi

if [ -z "$file_name" ]
then
        echo "No file name given" >&2
        exit 1
fi

if [ -z "$run_num" ]
then
        echo "No run number given" >&2
        exit 1
fi

if [ "$OPT" -eq 1 ]
then
        ../bin/takeData -l -dir $file_name -trimVcal 60 -mask
        cd ../convert_to_tree/
        cp $file_name/phCalibrationFitTan_C0.dat $file_name/phCalibrationFit60_C0.dat
        cp $file_name/phCalibrationFit60_C0.dat ~/log/bt0500$run_num
        cp ../convert_to_tree/config.dat_original ~/log/bt0500$run_num
        ./convert_to_tree -l -r $run_num
        ./pulseHeightMain $run_num

if [ "$OP" -eq 1 ] 
        then 
                cd ~/log/bt05r00$run_num 
                root -l 
else 
        ../bin/takeData -l -dir $file_name -trimVcal 60 
        cd ../convert_to_tree/ 
        ./Analyze.py --dir $file_name --cfg $cfg_file $run_num 
         
        if [ "$OP" -eq 1 ] 
        then 
                cd ~/log/bt0500$run_num 
                root -l 
fi 

I added another option to run the change directory and run root -l and I want to add a -h help option and print some stuff. I'm assuming I'd ad a -h) *something* ;;

Shell scripting -- Bourne shell specifically. Any UNIX has some sort of Bourne shell or other. You may have heard of BASH, KSH, and POSIX shells -- these are all Bourne shells. BASH and KSH have useful extensions on the generic Bourne shell, while the POSIX version is fairly 'pure'. Pure POSIX shell code generally ought to run fine in all three.

When you login to a UNIX system with PUTTY or something, or open a terminal on a UNIX desktop, and see a prompt like user@host # , you're probably typing into a Bourne shell. It can take commands line-by-line as you type them in. It's also an entire programming language, though rather purpose-specific. The one thing it's really good at is running and organizing other commands -- i.e. what you're wanting to do here :wink:

I'm afraid this question is so vague it's difficult to answer.

[edit] Oh, I think I see what you mean.

# This only needs to be done once, ever.  It sets the file executable, so it can be run.
chmod +x ./myscript.sh

# The arguments don't need to be in any order, except that cfgname must be straight after -cfg, etc.
./myscript.sh -cfg cfgname -dir dir -run 3 -mask -root

Mostly correct but you're missing a 'fi' here and there. You're also missing the special #!/bin/sh first line which tells UNIX which shell to run this code with. It's possible your system uses /usr/bin/sh instead of /bin/sh, change as appropriate. I've highlighted fixes in red.

Yep. It doesn't have to all be on one line, either. command1 ; command2 ; command3 is equivalent to

command1
command2
command3

;; on the other hand, is purely a case thing, you don't find it in other kinds of statements.

So, you can do

case "$something" in
-h)
        something
        something else
        yet more commands
        exit # to quit immediately, so it doesn't try to run commands below
        ;;
esac

'option' can even be a glob, i.e. if you wanted to match all strings beginning with 'opt', you could do opt*)

are these proper corrections?:

if [ "$OPT" -eq 1 ]
then
../bin/takeData -l -dir $file_name -trimVcal 60 -mask
cd ../convert_to_tree/
cp $file_name/phCalibrationFitTan_C0.dat $file_name/phCalibrationFit60_C0.dat
cp $file_name/phCalibrationFit60_C0.dat ~/log/bt0500$run_num
cp ../convert_to_tree/config.dat_original ~/log/bt0500$run_num
./convert_to_tree -l -r $run_num
./pulseHeightMain $run_num
fi

if [ "$OP" -eq 1 ]
then
cd ~/log/bt05r00$run_num
root -l
fi
else
then
../bin/takeData -l -dir $file_name -trimVcal 60
cd ../convert_to_tree/
./Analyze.py --dir $file_name --cfg $cfg_file $run_num
fi

    if [ "$OP" -eq 1 ] 
    then 
            cd ~/log/bt0500$run_num 
            root -l 
    fi 

fi

---------- Post updated at 03:27 PM ---------- Previous update was at 02:05 PM ----------

Also on the -h argument that didn't get answered.
I'd add the:
-h) ____________ ;
I want to print a menu for all the optional arguments and what they do:
-dir *required* command followed by directory containing ROC's parameters.
-run *required* command followed by 4 digit run number.
-mask reads pixelMask.dat out of directory to mask pixels.
-cfg command followed by desired config file with full location.
-root will load root for run taken.
^Like that just for the sake of having it^