Loop with command line arguments

Ubuntum, Bash version: 4.3.46

Hi,

how can I create a loop where the command line arguments change (increase) and every time the number of arguments is different ?

### I have many gene names... that mean gene1=$2, gene2=$3, ...... geneN=$N+1
### some time the number of gene is 25, other time 56, ecc...


#!/usr/bin/env bash

file=$1 #File name
gene=$2 #Gene name

for ((b=2; b<=????; b++))

    do

snpl=${gene}"_snplist.txt"
snpc=${gene}"_snpcount.txt"

#SNP list
grep -w $gene $file > count/$file/$snpl

#SNP count
grep -w $gene $file | wc -l > count/$file/$snpc

    done

I have to create an array of arguments???

for i in "$@"; do echo "$i"; done

Thanks a lot !!!

Hi, echo manolis
What would provide that information? Do you read it from a file? Do you enter the _number_ of genes at the command line as a parameter?

for ((b=2; b<=????; b++))

What does the magic number two (2) represent?

#!/usr/bin/env bash  

file=$1 #File name 
gene=$2 #Gene name

I expect from your announcement the following program call:

yourprog file gene1 gene2 ...

I would put it into an array, like this:

#!/usr/bin/env bash  

file=$1 #File name 

# shift: $1 gets $0, $2 gets $1, ...  
shift 

all_genes=("$@")
# $@ => $1 ... $#

Wouldn't be a bit unrealistic to expect to enter 56 or more arguments at the command line?

I dunno what he's up to. That is his question. All could be automated and generated. Of course scripting is mostly to reduce work and more seldom to do otherwise. If he'd like to have some improvement advices, he'll offer more details, so the solution could be stated and tips can be offered.

I'm asking myself even if there's a mess of tons of files behind this gene-scenario, a type of task which I read quite often in the short time I'm here - which overall slows down that search- and calculation-operations by factor 10 - 10 Billion compared to some less Shellcentric/Multi-Filecentric solution.

S/he seems to want to work off positional parameters $2 till $N where N is not predefined.
How about

for b
  do [ "$b" = "$1" ] && continue
      echo $b    # and further processing
  done

EDIT: Or, looking closer into post#1, adapt this to

file=$1; shift
for gene; do echo $file $gene; done

Ithink the only really sensible consruct to use is a while -loop instead of a for -loop, like this:

while [ -n "$1" ] ; do
     echo "argument for this pass: $1"
     shift
done

This will cycle through all the presented positional parameters and "chop them off" one by one. A sample run of this code would look like:

$ mycode a b cde "f g h" i jkl
argument for this pass: a
argument for this pass: b
argument for this pass: cde
argument for this pass: f g h
argument for this pass: i
argument for this pass: jkl
$

This should work in ksh and bash alike.

I hope this helps.

bakunin

Hi guys!,

I'm late, sorry, but I need time to try your suggestions! and more time to add them to my pipeline and verify if the whole thing works...

It works, thanks a lot !!! I used "shift"... shift -> for (do ... done) ...

Many thanks !!!