Hi!
i making a script to let me read a txt with filepath and can convert the image inside the filepath with imagemagick changing the name and source folder, i test line by line (without while loop) and work fine, but when i run the sh give me this error:
Bad for loop variable
this is the script:
Code:
#!/bin/bash
while IFS= read -r line
do
lala=$(echo $line | cut -d "/" -f 5)
caja=$(echo $line | cut -d "/" -f 5)
caja+="_TA_"
cd $line
ls $line | sed 's/ta_/convert ta_/g' > /home/procesadorm.txt
cant=$(wc -l < /home/procesadorm.txt)
rm /home/procesadorr.txt
for ((i=0;i<$cant;i++)); do echo $line >> /home/procesadorr.txt; done
cat /home/procesadorr.txt |
sed -e 's/\/media\/bkt2b1/\/convertidor\//g' |
sed -e 's/\/Prod100\//\//g' |
sed -e 's/\/Prod101\//\//g' |
sed -e 's/\/Prod102\//\//g' |
sed -e 's/\/Prod103\//\//g' |
sed -e 's/\/Prod104\//\//g' |
sed -e 's/\/Prod105\//\//g' |
sed -e 's/\/Prod170\//\//g' |
sed -e 's/\/Prod171\//\//g' |
sed -e 's/\/Prod172\//\//g' |
sed -e 's/\/Prod173\//\//g' |
sed -e 's/\/Prod174\//\//g' |
sed -e 's/\/Prod175\//\//g' |
sed -e 's/\/Prod176\//\//g' |
sed -e 's/\/Prod177\//\//g' |
sed -e 's/\/Prod178\//\//g' |
sed -e 's/\/Prod179\//\//g' |
sed -e 's/\/media\/Externo/\/home\/prueba/g' > /home/procesadorrr.txt
mkdir $(echo $line | sed -e 's/\/Prod100\//\//g' | sed -e 's/\/Prod101\//\//g' | sed -e 's/\/Prod102\//\//g' | sed -e 's/\/Prod103\//\//g' | sed -e 's/\/Prod104\//\//g' | sed -e 's/\/Prod105\//\//g' | sed -e 's/\/Prod170\//\//g' | sed -e 's/\/Prod171\//\//g' | sed -e 's/\/Prod172\//\//g' | sed -e 's/\/Prod173\//\//g' | sed -e 's/\/Prod174\//\//g' | sed -e 's/\/Prod175\//\//g' | sed -e 's/\/Prod176\//\//g' | sed -e 's/\/Prod177\//\//g' | sed -e 's/\/Prod178\//\//g' | sed -e 's/\/Prod179\//\//g' | sed -e 's/\/media\/Externo/\/home\/prueba/g')
ls $line | sed -e 's#ta_#/AR_AGN_DF_TA_#g' | sed -e 's/_DF_TA_/_DF_'"$caja"'/' | sed -e 's/_001.tif/_A.jpg/g' | sed -e 's/_002.tif/_R.jpg/g' > /home/procesadors.txt
paste -d "" /home/procesadorm.txt /home/procesadorrr.txt /home/procesadors.txt | sed -e 's/\/home/ \/home/g' > /home/procesador.sh
sh /home/procesador.sh
done < "/script/pendiente.txt"
if anyone can helpme i dont know why dont work!
Thx
Moderator's Comments:
Please use code tags next time for your code and data, thanks
Last edited by jim mcnamara; 07-07-2015 at 08:24 PM..
Reason: Attempt to improve readability
#!/bin/bash
#This is a while looping in the /script/pendiente.txt where there was a list of #filepath, inside has TIF images in all the script will build the sh script who #convert with imagemagick al the tif in the source folder to a jpg with name #changed
#while for the list of folder`s with tif files
while IFS= read -r line
do
#if the path is /media/bk2tb1/Externo/Prod179/TA_4059 i save the last folder
#in two variables one to make the new filename
lala=$(echo $line | cut -d "/" -f 5)
caja=$(echo $line | cut -d "/" -f 5)
caja+="_TA_"
cd $line
#because al images start with ta i will adding convert in all lines because
#this is the imagemagick command to convert images
ls $line | sed 's/ta_/convert ta_/g' > /home/procesadorm.txt
#i count how much of files have the folder
cant=$(wc -l < /home/procesadorm.txt)
#because i will make a txt with the folder with the same cant of files in the
#next for i delete first
rm /home/procesadorr.txt
#this for will make me a txt with $cant lines in all lines file path, i using this
#because the i need add something in the paste between the source and #destination to change the destination folder
for ((i=0;i<$cant;i++)); do echo $line >> /home/procesadorr.txt; done
#this will replace the filepath becuse in the source have subfolders dont #needed in the destination
cat /home/procesadorr.txt |
sed -e 's/\/media\/bkt2b1/\/convertidor\//g' |
sed -e 's/\/Prod100\//\//g' |
sed -e 's/\/Prod101\//\//g' |
sed -e 's/\/Prod102\//\//g' |
sed -e 's/\/Prod103\//\//g' |
sed -e 's/\/Prod104\//\//g' |
sed -e 's/\/Prod105\//\//g' |
sed -e 's/\/Prod170\//\//g' |
sed -e 's/\/Prod171\//\//g' |
sed -e 's/\/Prod172\//\//g' |
sed -e 's/\/Prod173\//\//g' |
sed -e 's/\/Prod174\//\//g' |
sed -e 's/\/Prod175\//\//g' |
sed -e 's/\/Prod176\//\//g' |
sed -e 's/\/Prod177\//\//g' |
sed -e 's/\/Prod178\//\//g' |
sed -e 's/\/Prod179\//\//g' |
sed -e 's/\/media\/Externo/\/home\/prueba/g' > /home/procesadorrr.txt
#this make a destination folder replacing the same subfolder dont needed in #the output
mkdir $(echo $line | sed -e 's/\/Prod100\//\//g' | sed -e 's/\/Prod101\//\//g' | sed -e 's/\/Prod102\//\//g' | sed -e 's/\/Prod103\//\//g' | sed -e 's/\/Prod104\//\//g' | sed -e 's/\/Prod105\//\//g' | sed -e 's/\/Prod170\//\//g' | sed -e 's/\/Prod171\//\//g' | sed -e 's/\/Prod172\//\//g' | sed -e 's/\/Prod173\//\//g' | sed -e 's/\/Prod174\//\//g' | sed -e 's/\/Prod175\//\//g' | sed -e 's/\/Prod176\//\//g' | sed -e 's/\/Prod177\//\//g' | sed -e 's/\/Prod178\//\//g' | sed -e 's/\/Prod179\//\//g' | sed -e 's/\/media\/Externo/\/home\/prueba/g')
#this will make the output image name
ls $line | sed -e 's#ta_#/AR_AGN_DF_TA_#g' | sed -e 's/_DF_TA_/_DF_'"$caja"'/' | sed -e 's/_001.tif/_A.jpg/g' | sed -e 's/_002.tif/_R.jpg/g' > /home/procesadors.txt
#this will make a join between the (convert +imput #name)/home/procesadorm.txt+(destination path) /home/procesadorrr.txt+ #(destination filename) /home/procesadors.txt
paste -d "" /home/procesadorm.txt /home/procesadorrr.txt /home/procesadors.txt | sed -e 's/\/home/ \/home/g' > /home/procesador.sh
# this will call the script maked
sh /home/procesador.sh
#this will return to first line if not end of file (/script/pendiente.txt)
done < "/script/pendiente.txt"
Thx to all to help me in this
sorry about my english i really speak spanish
In fact, I've still got no chance to understand what you are doing without samples of the input files. But some comments:
- don't redirect into the file that you use as input; the redirection takes precedence and truncates the input file BEFORE it can be read.
- with a smart regex you can have ALL those sed commands in one single command.
- Why don't you save those sed results in a variable that can be reused later in need be?
- Why do you use sed at all? Use bash's parameter expansion capabilities on $line.
- Not sure if you really want to call that .sh script for every line in your input file.
i test all lines without loop and work fine, i using files as a input files because i using this to make a sh file, and then run it i can try making only one sh for all the file to convert, but still will need the output file for later make a paste. But the loop error will continue happening
I'm new to utilities like socat and netcat and I'm not clear if they will do what I need.
I have a "compileDeployStartWebServer.sh" script and a "StartBrowser.sh" script that are started by emacs/elisp at the same time in two different processes.
I'm using Cygwin bash on Windows 10.
My... (3 Replies)
Hello all,
I am facing a weird issue while executing a code below -
#!/bin/bash
cd /wload/baot/home/baotasa0/sandboxes_finance/ext_ukba_bde/pset
sh UKBA_publish.sh UKBA 28082015 3
if
then
echo "Param file conversion for all the areas are completed, please check in your home directory"... (2 Replies)
I am trying to call a script(callingscript.sh) from a master script(masterscript.sh) to get string type value from calling script to master script. I have used scripts mentioned below.
#masterscript.sh
./callingscript.sh
echo $fileExist
#callingscript.sh
echo "The script is called"... (2 Replies)
I am using blow script :--
#!/bin/bash
FIND=$(ps -elf | grep "snmp_trap.sh" | grep -v grep) #check snmp_trap.sh is running or not
if
then
# echo "process found"
exit 0;
else
echo "process not found"
exec /home/Ketan_r /snmp_trap.sh 2>&1 & disown -h ... (1 Reply)
Hi guys
I have a shell script that executes sql statemets and sends the output to a file.the script takes in parameters executes sql and sends the result to an output file.
#!/bin/sh
echo " $2 $3 $4 $5 $6 $7
isql -w400 -U$2 -S$5 -P$3 << xxx
use $4
go
print"**Changes to the table... (0 Replies)