BASH: getting a script to "do" what's after "done"


 
Thread Tools Search this Thread
Top Forums UNIX for Dummies Questions & Answers BASH: getting a script to "do" what's after "done"
# 1  
Old 08-24-2010
BASH: getting a script to "do" what's after "done"

The script:
Code:
#!/bin/bash
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
w=$(ls *.jpg | wc -l)
x=1
z=0
for file in $(ls *.jpg); do
	echo "Evaluating  #$x of $w, $file..."
	sleep 0.2s
	MANY=$(exiv2 -g Exif.Image.Software $file)
	if [[ $MANY == *PhotoFiltre* ]]  
	then
		exiv2 -M"del Exif.Image.Software" modify $file
		echo -ne "$file: PhotoFiltre software tag removed.\n\n"
		z=$[z+1]
	else
		echo -ne "$file: No PhotoFiltre software tag found.\n\n"
	fi
	sleep 0.2s
x=$[x+1]
done
g=$(echo "scale=4; $z/$w" | /usr/bin/bc)
h=$(echo "$g*100" | /usr/bin/bc)
j=$(echo ${h%??})
echo -ne "Cumulative: $z PhotoFiltre software tags purged out of $w JPEGS evaluated.\nA ratio of $j%
IFS=$SAVEIFS

Consistently, and unarguably logically, this script quits at the "done" and won't execute the lines below it. Is there some way of "telegraphing" that the incrementing variables are to be evaluated later? Or should I look for another read-in structure, like a temporary list of files in the directory and a 'while read' or 'while X is less than Y' kind of loop? It wouldn't make sense to put a concluding evaluation of the stats these "cub-scout" variables generate inside the loop, as that's when they're being incremented.

Help please.
BZT
# 2  
Old 08-24-2010
Quote:
Originally Posted by SilversleevesX
Consistently, and unarguably logically, this script quits at the "done" and won't execute the lines below it.
It's not supposed to do that -- something else is going on.

I don't think this is doing what you think it's doing:
Code:
if [[ $MANY == *PhotoFiltre* ]]

Asterisks there won't match against $MANY, they match against files in ./ like you're doing with "*.jpg". If you want a regular expression, bash 3.0 has a =~ regex operator so you can just do if [[ "$MANY" =~ PhotoFiltre ]] and see if it finds PhotoFiltre anywhere in the line. I've wrapped $MANY in quotes there in case it has spaces in it.

Why are you backing up and restoring IFS? I don't see that you're using any commands that care what that special variable's value is.

Change #!/bin/bash to #!/bin/bash -x so it prints lines as it executes them so you can tell where the loop breaks and what it thinks it's doing.

Also,"for file in $(ls *.jpg)" can be more simply rewritten as "for file in *.jpg", no ls needed, no evaluation brackets needed. There's still a limit on the number of arguments however, so this kind of loop isn't appropriate for huge amounts of files.

Last edited by Corona688; 08-24-2010 at 07:59 PM..
This User Gave Thanks to Corona688 For This Post:
# 3  
Old 08-24-2010
Quote:
Originally Posted by Corona688
It's not supposed to do that -- something else is going on.

I don't think this is doing what you think it's doing:
Code:
if [[ $MANY == *PhotoFiltre* ]]

Asterisks there won't match against $MANY, they match against files like you're doing with "*.jpg". If you want a regular expression, bash 3.0 has a =~ regex operator so you can just do if [[ $MANY =~ PhotoFiltre ]] and see if it finds PhotoFiltre anywhere in the line.

Change #!/bin/bash to #!/bin/bash -x so it prints lines as it executes them so you can tell where the loop breaks and what it thinks it's doing.

Also,"for file in $(ls *.jpg)" can be more simply rewritten as "for file in *.jpg", no ls needed, no evaluation brackets needed. There's still a limit on the number of arguments however, so this kind of loop isn't appropriate for huge amounts of files.
It looks to me like it's starting the loop again for every file, but then I don't recall the last time I did an "-x" evaluation on a for-do-done loop, so....

A sample of the stdout:
Code:
+ sleep 0.2s
+ x=99
+ for file in '$(ls *.jpg)'
+ echo 'Evaluating  #99 of 171, hv7283-275.jpg...'
Evaluating  #99 of 171, hv7283-275.jpg...
+ sleep 0.2s
++ exiv2 -g Exif.Image.Software -Pv hv7283-275.jpg
+ MANY='Adobe Photoshop CS Windows'
+ [[ Adobe Photoshop CS Windows =~ PhotoFiltre ]]
+ echo -ne 'hv7283-275.jpg: No PhotoFiltre software tag found.\n\n'
hv7283-275.jpg: No PhotoFiltre software tag found.

I agree there's something else going on (it's been proven for me time and again that if a scripting "issue" can't be Google'd then it isn't an issue, and there's naught on this phenomenon, therefore....). Now that you've seen the snippet, any clue as to what?

Thanks for reminding me there was a weak(ening) ls in that "for" line. This script is a tweak on one that's about a year old, written during a short stint of not having an Internet connection. I still have a few like this.

BZT

Last edited by SilversleevesX; 08-24-2010 at 08:07 PM.. Reason: Replaced pre-edit snippet with post-.
# 4  
Old 08-24-2010
Did you notice that there is a missing double quote on the last echo in the script? I would have expected you to have seen an error, but the behaviour might be exactly as you described all caused by the missing quote.

Bash and Kshell tend to 'chunk in' executable portions of the script only reading and parsing as much as they need to. In the case of your script it would only need to read until the end of the while loop before it can begin executing. Once the while has completed, it would read the next bit from the file, parse it and stumble on the missing quote, but not until after it had executed the while.

I don't know why it wouldn't toss an error to stderr, but if it isn't, or stderr is being redirected (I don't think you are), then it would appear not to be executing the commands after the done.

If you haven't noticed the missing quote, that might solve the issue. If you have, sorry for the rambling.
This User Gave Thanks to agama For This Post:
# 5  
Old 08-24-2010
Quote:
Originally Posted by SilversleevesX
It looks to me like it's starting the loop again for every file, but then I don't recall the last time I did an "-x" evaluation on a for-do-done loop, so....
Oh, you mean, not executing stuff below the loop during the loop? Yes, that's normal.
This User Gave Thanks to Corona688 For This Post:
# 6  
Old 08-25-2010
Quote:
Originally Posted by agama
Did you notice that there is a missing double quote on the last echo in the script? I would have expected you to have seen an error, but the behaviour might be exactly as you described all caused by the missing quote.
Spot on, agama. I ran it with the fixed (?!) variables and such on a much smaller folder of files than I was "playing it on" before, and first thing to come up was "syntax error -- unexpected end of file." I cat'ed and immediately saw the missing double-quote. Never let it be said that coloured syntax formatting in a GUI text editor is an unqualified benefit -- sometimes the eye is so enwrapt in the colours that the mind is rendered blind to the errors staring one straight in the face!

Quote:
Originally Posted by agama
I don't know why it wouldn't toss an error to stderr, but if it isn't, or stderr is being redirected (I don't think you are), then it would appear not to be executing the commands after the done.
My bad there. I had stderr going out to /dev/null, anticipating that the only errors I'd have seen in stdout would have been related to the files "punch branded" by PhotoFiltre or some other maker-related error. I didn't see the eof error for that reason. It's not like BASH exactly allows one to pick and choose which kind, app error or shell syntax error, one gets to redirect (or is it? I certainly haven't seen any how-to's on this score). And even the author, Andreas Huggel, says error trapping in his app needs some looking at -- presently all you get is what the error/s is/are, not what file tossed them up. It's a matter of "feeding protein" to the -V option or a more file-conscientious rewrite of the whole error-reporting section of the code. No news yet as to whether Hr Huggel has made headway.

I made the fix, and tried again. It ran beautifully. Now, paradoxically, I'm thinking a better "cure" for PhotoFiltre EXIF software "branding" tags might not be to purge them, but to erase and rewrite them in the way that won't habitually create an error call in Exiv2. Ideally such a script would sync with a query at the top (return value of same stored in a variable) to the registry asking for the exact version number of PF right down to the build string. But that's a whole other lunch date,. Smilie

Thanks again for the help.


BZT

Last edited by SilversleevesX; 08-25-2010 at 06:54 AM.. Reason: Wrong helper's name - corrected.
# 7  
Old 08-25-2010
I've never liked colour oriented editors, but mostly because half the text is not readable depending on the background colour (I prefer black). A personal choice nonetheless.

What has helped me to find these kinds of issues is running a new script with the -n option
Code:
$ ksh -n my_new_script

The -n option causes the shell to just do syntax checking and that would have tossed the error out straight away. I assume bash has a similar option, but as I work 99.9% of the time in ksh I cannot say for sure.

On the matter of redirecting errors, could you redirect the stderr from each invocation of the 'photo software' rather than the whole script. That'd give you a bit more slience, yet still see 'operational' errors from the script. Just a thought -- glad to have helped.
 
Login or Register to Ask a Question

Previous Thread | Next Thread

9 More Discussions You Might Find Interesting

1. AIX

Apache 2.4 directory cannot display "Last modified" "Size" "Description"

Hi 2 all, i have had AIX 7.2 :/# /usr/IBMAHS/bin/apachectl -v Server version: Apache/2.4.12 (Unix) Server built: May 25 2015 04:58:27 :/#:/# /usr/IBMAHS/bin/apachectl -M Loaded Modules: core_module (static) so_module (static) http_module (static) mpm_worker_module (static) ... (3 Replies)
Discussion started by: penchev
3 Replies

2. Shell Programming and Scripting

Bash script - Print an ascii file using specific font "Latin Modern Mono 12" "regular" "9"

Hello. System : opensuse leap 42.3 I have a bash script that build a text file. I would like the last command doing : print_cmd -o page-left=43 -o page-right=22 -o page-top=28 -o page-bottom=43 -o font=LatinModernMono12:regular:9 some_file.txt where : print_cmd ::= some printing... (1 Reply)
Discussion started by: jcdole
1 Replies

3. UNIX for Dummies Questions & Answers

Using "mailx" command to read "to" and "cc" email addreses from input file

How to use "mailx" command to do e-mail reading the input file containing email address, where column 1 has name and column 2 containing “To” e-mail address and column 3 contains “cc” e-mail address to include with same email. Sample input file, email.txt Below is an sample code where... (2 Replies)
Discussion started by: asjaiswal
2 Replies

4. UNIX for Dummies Questions & Answers

"Help with bash script" - "License Server and Patch Updates"

Hi All, I'm completely new to bash scripting and still learning my way through albeit vey slowly. I need to know where to insert my server names', my ip address numbers through out the script alas to no avail. I'm also searching on how to save .sh (bash shell) script properly.... (25 Replies)
Discussion started by: profileuser
25 Replies

5. Solaris

The slices "usr", "opt", "tmp" disappeared!!! Help please.

The system don't boot. on the screen appears following: press enter to maintenance (or type CTRL-D to continue)...I checked with format command. ... the slices "0-root","1-swap","2-backup" exist. ...the slises "3-var","6-usr" -unassigned. :( (16 Replies)
Discussion started by: wolfgang
16 Replies

6. Shell Programming and Scripting

how to use "cut" or "awk" or "sed" to remove a string

logs: "/home/abc/public_html/index.php" "/home/abc/public_html/index.php" "/home/xyz/public_html/index.php" "/home/xyz/public_html/index.php" "/home/xyz/public_html/index.php" how to use "cut" or "awk" or "sed" to get the following result: abc abc xyz xyz xyz (8 Replies)
Discussion started by: timmywong
8 Replies

7. Shell Programming and Scripting

awk command to replace ";" with "|" and ""|" at diferent places in line of file

Hi, I have line in input file as below: 3G_CENTRAL;INDONESIA_(M)_TELKOMSEL;SPECIAL_WORLD_GRP_7_FA_2_TELKOMSEL My expected output for line in the file must be : "1-Radon1-cMOC_deg"|"LDIndex"|"3G_CENTRAL|INDONESIA_(M)_TELKOMSEL"|LAST|"SPECIAL_WORLD_GRP_7_FA_2_TELKOMSEL" Can someone... (7 Replies)
Discussion started by: shis100
7 Replies

8. Shell Programming and Scripting

Simplify Bash Script Using "sed" Or "awk"

Input file: 2 aux003.net3.com error12 6 awn0117.net1.com error13 84 aux008 error14 29 aux001.ha.ux.isd.com error12 209 aux002.vm.ux.isd.com error34 21 alx0027.vm.net2.com error12 227 dux001.net5.com error123 22 us008.dot.net2.com error121 13 us009.net2.com error129Expected Output: 2... (4 Replies)
Discussion started by: sQew
4 Replies

9. UNIX for Dummies Questions & Answers

Explain the line "mn_code=`env|grep "..mn"|awk -F"=" '{print $2}'`"

Hi Friends, Can any of you explain me about the below line of code? mn_code=`env|grep "..mn"|awk -F"=" '{print $2}'` Im not able to understand, what exactly it is doing :confused: Any help would be useful for me. Lokesha (4 Replies)
Discussion started by: Lokesha
4 Replies
Login or Register to Ask a Question