34

I have a very simple shell script that looks as follows:

clear

for i in -20 -19 -18 -17 -16 -15 -14 ... 18 19  
do  
echo "Nice value is $i"  
nice -n $i ./app1   
done  

Basically, I wanna run an application with all different priority values between -20 and 19. However, when executing this script it looks as follows:

Nice value is -20  
15916233  
Nice value is -19  
5782142  
....  
Nice value is 19  
5731287  

But I would like some kind of verbose output, that is also printing the command on the terminal so that it looks like this

Nice value is -20  
nice -n -20 ./app1    
15916233  
Nice value is -19  
nice -n -19 ./app1   
5782142  
....  
Nice value is 19  
nice -n 19 ./app1   
5731287  

Is there a way to do that? Thank you!

4 Answers 4

75

You don't say what sort of shell you're running. If you're using sh/bash, try

sh -x script_name

to run your script in a verbose/debug mode. This will dump out all the commands you execute, variable values etc. You don't want to do this normally since it'll provide a ton of output, but it's useful to work out what's going on.

As noted in the comments, you can add this flag to your #!/bin/bash invocation in your script.

Sign up to request clarification or add additional context in comments.

1 Comment

You should also be able to make this happen for every run by putting the -x in the #! line; i.e. the first line of the script would be: #!/bin/bash -x
3

an easy way:

for i in -20 -19 -18 -17 -16 -15 -14 ... 18 19
do
  echo "Nice value is $i"
  echo "nice -n $i ./app1"
  nice -n $i ./app1
done

Comments

2

These will demonstrate 'eval' and 'set' to do what you want:

::::::::::::::
a.sh
::::::::::::::
#!/bin/sh

clear

i=-20
while [ ${i} -lt 20 ]; do
  echo "Nice value is $i"
  cmd="nice -n $i ./app1"
  echo ${cmd}
  eval ${cmd}
  i=`expr ${i} + 1`
done

::::::::::::::
b.sh
::::::::::::::
#!/bin/sh

clear

i=-20
while [ ${i} -lt 20 ]; do
  echo "Nice value is $i"
  set -x
  nice -n $i ./app1
  set +x
  i=`expr ${i} + 1`
done

Comments

0
let I=-20
while [ $I -lt 20 ]; do
  echo "Nice value is $I"
  nice -n $I ./app1
  let I=$I+1
done

4 Comments

I am using bash, when trying to run your code I get the following error: [: -lt: unary operator expected
This here seems to do the stuff clear for (( i = -20 ; i <= 19; i++ )) do echo "Welcome $i times" nice -n $i ./app1 done
sorry, mixed up the Upper and Lowercase I's (quick typing). They should all be the same of course. Edited to fix.
You also have to be careful with spaces in bash. For example, "while [$I -lt 10]" doesn't work.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.