Sean Morgan
Sean Morgan

Reputation: 35

Run commands from a text file through a bash script

I am attempting to write a script that will read through a text file, and then execute every line that begins with the word "run" or "chk" as a command. This is what I have thus far:

#!/bin/bash
counter=1
for i in $@
do
    while read -r line 
    do
    if [[ ${line:0:4} == "run " ]]
    then
        echo "Now running line $counter" 
        ${line:4:${#line}}
    elif [[ ${line:0:4} == "chk " ]]
    then
        echo "Now checking line $counter" 
        ${line:4:${#line}}
    elif [[ ${line:0:2} == "# " ]]
    then
        echo "Line $counter is a comment"
    else
        echo "Line $counter: '$line' is an invalid line"
    fi
    counter=$((counter+1))
    done<$i
done

However, when I feed it a text file with, for example the commands

run echo > temp.txt

It does not actually create a file called temp.txt, it just echoes "> temp.txt" back to the stdout. It also does a similar thing when I attempt to do something like

run program arguments > filename.txt

It does not put the output of the program in a file as I want, but it rather tries to treat the '>' as a file name.

I know this is a super specific and probably obvious thing, but I am very new to bash and all shell scripting.

Thanks

Upvotes: 0

Views: 1890

Answers (1)

Barmar
Barmar

Reputation: 780724

You need to use eval to do all the normal shell parsing of the variable:

eval "${line:4}"

You also don't need :${#line}. If you leave out the length, it defaults to the rest of the string.

Upvotes: 2

Related Questions