Showing posts with label linux. Show all posts
Showing posts with label linux. Show all posts

Tuesday, November 20, 2012

[Bash] change current workspace by calling a script function

# to change current path using a customized script function
# instead of using alias. Need put this function in .bashrc
#    e.g.,
#            mycd ex1 ==> cd ~/scripttest/ex1
#            mycd ex2 ==> cd ~/scripttest/ex2
#            mycd eX2 ==> cd ~/scripttest/ex2
#   @ http://scriptdemo.blogspot.com 

function mycd (){
 if [ $# -ne 1 ]; then
    echo "Usage:"
    echo " mycd foldername"
 else
    targetF=`echo $1 | awk '{print tolower($1)}'`
    targetP=${HOME}/scripttest/${targetF}
    if [ -d ${targetP} ]; then
       eval "cd ${targetP}"
    else
       echo "${targetP} does not exist!"
    fi
    unset targetF
 fi
}

Thursday, July 5, 2012

[Bash] mail2me: send email with attachments from terminal

This is mutt version. A "mail" version is here.
#!/bin/bash
# send files to an email account as the attachment(s)
# usage:
#           mail2me email -s 'YourSubject'  YourAttachments
#           http://scriptdemo.blogspot.com

function isEmail()
{
   cEmail=`echo $1 | grep "^[a-zA-Z]\+\([._][a-zA-Z0-9]\+\)*@\([a-zA-Z0-9]\+\.\)\+[a-zA-Z]\{2,3\}$"`
   if [ ${#cEmail} -gt 0 ]; then
      echo "true"
   else
      echo "false"
   fi
}
function isServerOn()
{
  myS=$1
  myp=`ping -c 2 ${myS} 2>&1 | grep "% packet" | awk '{print $6*100}'`
  if [ ${#myp} -eq 0 ]; then
     echo "-1" #server: ${myS} is not valid
  elif [ ${myp} -eq 100 ]; then
     echo "0" #server: ${myS} is off
  else
     echo "1" #server: ${myS} is $(( 100 - ${myp}))% response
  fi
}

if [ $# -le 1 ]; then
   echo "usage: mail2me email -s Subject file1 [file2] ..."
   exit
fi

#check email
targetEmail=$1
isValidEmail=`isEmail ${targetEmail}`
[ ${isValidEmail} == "false" ] && echo "${targetEmail} is not a valid email address!!!" && exit

#check smtp server
smtpS=`echo ${targetEmail} | awk -F\@ '{print $2}'`
smtpS="smtp.${smtpS}"
isOnline=`isServerOn ${smtpS}`
if [ ${isOnline} == "-1" ]; then
     echo "SMTP server: ${smtpS} is invalid. STOP" && exit
elif [ ${isOnline} == "0" ]; then
     echo "SMTP server: ${smtpS} is offline. STOP" && exit
fi

#send email
numF=0
nf=2
isDebug=0
shift #shift the email
while [ $# -ge 1 ]
do
    case $1 in
       -s|-S)
         mysubj=$2
         shift; shift;
         ;;
       -d|-D)
         isDebug=1
         shift
         ;;
       *)
         if [ -f ${tmpfn} ]; then
            myfile[${numF}]=$1
            numF=`expr ${numF} + 1`
         else
            echo "$1 is not found!"
         fi
         shift
         ;;
     esac
done

if [ ${numF} -eq 1 ]; then
   [ ${#mysubj} -eq 0 ] && mysubj="[script] ${myfile[0]}"
elif [ ${numF} -gt 1 ]; then
   [ ${#mysubj} -eq 0 ] && mysubj="[script] backup ${myfile[0]} etc."
else
   echo "no file is found!!!" && exit
fi

if [ ${isDebug} -eq 1 ]; then
   echo "echo \"The attachment is ${myfile[*]} sent by `whoami` from `hostname`\" | mutt -s '${mysubj}' -a ${myfile[*]} -- ${targetEmail}"
else
   echo "The attachment is ${myfile[*]} sent by `whoami` from `hostname` " | mutt -s "${mysubj}" -a ${myfile[*]} -- ${targetEmail}
fi

Friday, May 25, 2012

[Bash] send email with an attachment from Terminal

Enhanced version of back-up-text-files-using-mail-function
Also check mutt  .
#!/bin/bash
# send email with a file as the attachment
# usage:
#            mailit email files
#            http://scriptdemo.blogspot.com
#   note:  
#           some old versions do not support the attachment option
#           [tested with Heirloom mailx 12.5]

function isEmail()
{
   cEmail=`echo $1 | grep "^[a-zA-Z]\+\([._][a-zA-Z0-9]\+\)*@\([a-zA-Z0-9]\+\.\)\+[a-zA-Z]\{2,3\}$"`
   if [ ${#cEmail} -gt 0 ]; then
      echo "true"
   else
      echo "false"
   fi
}
function isServerOn()
{
  myS=$1
  myp=`ping -c 2 ${myS} 2>&1 | grep "% packet" | awk '{print $6*100}'`
  if [ ${#myp} -eq 0 ]; then
     echo "-1" #server: ${myS} is not valid
  elif [ ${myp} -eq 100 ]; then
     echo "0" #server: ${myS} is off
  else
     echo "1" #server: ${myS} is on or partly responses
  fi
}

if [ $# -le 1 ]; then
   echo "usage: mailit email file1 [file2] ..."
   exit
fi

#check email address
targetEmail=$1
isValidEmail=`isEmail ${targetEmail}`
[ ${isValidEmail} == "false" ] && echo "${targetEmail} is not a valid email address!!!" && exit

#check smtp server
smtpS=`echo ${targetEmail} | awk -F\@ '{print $2}'`
smtpS="smtp.${smtpS}"
isOnline=`isServerOn ${smtpS}`
if [ ${isOnline} == "-1" ]; then
     echo "SMTP server: ${smtpS} is invalid. STOP" && exit
elif [ ${isOnline} == "0" ]; then
     echo "SMTP server: ${smtpS} is offline. STOP" && exit
fi

#send email
for (( nf=2; nf<=$#; nf++ ))
do
    eval "myfile=\$${nf}"
    if [ -f ${myfile} ]; then
       echo "The attachment is ${myfile} sent by `whoami` from `hostname`" > tmpcont.mailtomea
       mail -s "[script] ${myfile}" -a ${myfile} ${targetEmail} < tmpcont.mailtomea && \
       echo "send mail successfully" && \
       rm -f tmpcont.mailtomea
    else
       echo "${myfile} dos not exist"
    fi
done

Friday, May 18, 2012

[Bash] ris2bib: convert RIS citation file to bibtex format

#!/bin/bash
# convert ris format to bibtex format
# usage:
#          ris2bib.sh ris-file(s)
#          www.scriptdemp.blogspot.ca

getCTag()
{
   for cTag in $*
   do
      nl=`grep "^${cTag}" ${ris} | wc -l`
      [ ${nl} -ne 0 ] && echo "${cTag}" && exit
   done
   echo ""
}

[ $# -eq 0 ] && sed -n '2,5p' `which ris2bib.sh` && exit

for ris in $*
do
    if [ -e ${ris} ]; then
       dos2unix ${ris}
       auTag=`getCTag AU A1 A2`
       tlTag=`getCTag T1 TI`
       joTag=`getCTag JO JA`
       yrTag=`getCTag PY Y1`
       doTag=`getCTag M3 DO`

       voTag="VL"; spTag="SP"; epTag="EP"; urTag="UR"; isTag="IS"
       publisher=`grep "^PB\ " ${ris} | awk -F\- '{print $2}' | sed -e 's/^\ //g'`

       authorList0=`grep "^${auTag}\ " ${ris} | awk -F\- '{print $2"@"}'`
       authorList=`echo ${authorList0} | sed -e 's/^\ //g' -e 's/\.\ /\./g' -e "s/\@$//" | sed -e 's/@/\ and\ /g'`

       titleStr=`grep "^${tlTag}\ " ${ris} | cut -c7-`
       jourStr=`grep "^${joTag}\ " ${ris} | awk -F\- '{print $2}' | sed -e 's/^\ //g'`
       volStr=`grep "^${voTag}\ " ${ris} | awk -F\- '{print $2}' | sed -e 's/\ //g'`
       SPStr=`grep "^${spTag}\ " ${ris} | awk -F\- '{print $2}' | sed -e 's/\ //g'`
       EPStr=`grep "^${epTag}\ " ${ris} | awk -F\- '{print $2}' | sed -e 's/\ //g'`
       if [ ${#EPStr} -ne 0 ]; then
          pageStr="${SPStr}--${EPStr}"
       else
          pageStr=${SPStr}
       fi
       if [ ${#isTag} -ne 0 ]; then
          isnStr=`grep "^${isTag}\ " ${ris} | cut -c7-`
       fi
       yearStr=`grep "^${yrTag}\ " ${ris} | awk -F\- '{print $2}' | sed -e 's/\ //g' | cut -c-4`
       if [ ${#doTag} -ne 0 ]; then
          doiStr=`grep "^${doTag}\ " ${ris} | awk -F\- '{print $2}' | rev | awk -F\: '{print $1}' | rev | sed -e 's/^\ //g'`
       fi

       if [ ${#urTag} -ne 0 ]; then
          urlStr=`grep "^${urTag}\ " ${ris} | awk -F\- '{print $2}' | sed -e 's/^\ //g'`
       fi

       #generate the key
       mykey=`echo ${authorList} | awk -F\, '{print $1}'`
       mykey="${mykey}${yearStr}"
       titleKey=`echo ${titleStr} | awk '{print $1""$2}'`
       mykey=`echo "${mykey}${titleKey}" | awk '{print tolower($0)}' | sed -e 's/\-//g'`
       echo ""
       echo @article{"${mykey},"
       echo " author={${authorList}},"
       echo " title = {{${titleStr}}},"
       echo " journal = {${jourStr}},"
       echo " year = {${yearStr}},"
       echo " volume = {${volStr}},"
       [ ${#isnStr} -ne 0 ] && echo " number = {"${isnStr}"},"
       [ ${#doiStr} -ne 0 ] && echo " doi = {"${doiStr}"},"
       [ ${#urlStr} -ne 0 ] && echo " url = {${urlStr}},"
       if [ ${#publisher} -eq 0 ]; then
          echo " pages = {${pageStr}}"
       else
          echo " pages = {${pageStr}},"
          echo " publisher = {${publisher}}"
       fi
       echo " }"
       unset auTag tlTag joTag voTag spTag epTag isTag
   else
      echo ""
      echo "${ris} is not found!"
      echo ""
   fi
done

Monday, May 7, 2012

[Bash] combine eps files into a single one

#!/bin/bash
#  to combine several eps files into a single eps file
# Usage:
#        combineEPS.sh eps-file[s] -o eps-combined.eps -nC nCol -nR nRow
# e.g.,
#        Given fig04a.eps, fig04b.eps, fig04c.eps, fig04d.eps,
#        to create a single 2x2 eps file, fig4.eps, just run:
#        combineEPS.sh fig04?.eps -o fig4.eps -nC 2 -nR 2
#        
# dependencies:
#        latex, dvips, ps2pdf, pdftops, pdfcrop
#        pdfcrop is from http://pdfcrop.sourceforge.net
#        http://scriptdemo.blogspot.ca

chkcmd()
{
  for nf in $*
  do
     isAvailable=`which ${nf} 2< /dev/null`
     [ ${#isAvailable} -eq 0 ] && echo 0 && exit
  done
  echo 1
}

# check the dependencies
isCMDOkay=`chkcmd latex dvips ps2pdf pdfcrop pdftops`
if [ ${isCMDOkay} -eq 0 ]; then
   isCMDOay=`which latex`
   isCMDOay=`which dvips`
   isCMDOay=`which ps2pdf`
   isCMDOay=`which pdfcrop`
   isCMDOay=`which pdftops`
   exit
fi

nfile=0
isEPSFname=0
isnCol=0
isnRow=0
isDel=0
isCaption=0

[ $# -eq 0 ] && sed -n '2,9p' `which combineEPS.sh` && exit

while test -n "$1"
do
  case "$1" in
    -nC|-nc|-nCol|-ncol|-Ncol)
       nCol=$2
       isnCol=1
       shift
       shift
       ;;
    -nR|-nr|-nRow|-Nrow|-nrow)
       nRow=$2
       isnRow=1
       shift
       shift
       ;;
    -title|-Title|-Caption|-caption)
       myCaption=$2
       isCaption=1
       shift
       shift
       ;;
    -d|-delete|-del|-D)
       isDel=1;
       shift
       ;;
    -o|-O)
       epsfname=$2
       isEPSFname=1
       shift
       shift
       ;;
     *)
       sufstr=`echo $1 | awk -F. '{print $2}'`
       if [ ${#sufstr} -eq 0 ]; then
          tmpfile="$1".eps
          [ -f ${tmpfile} ] && epsfile[$nfile]=${tmpfile}.eps
       elif [ $sufstr == "eps" ]; then
          [ -f $1 ] && epsfile[$nfile]=$1
       fi
       nfile=`expr $nfile + 1`
       shift
       ;;
  esac
done

[ ${isEPSFname} -eq 0 ] && epsfname="eps-combined.eps"
if [ ${isnCol} -eq 1 ] && [ ${isnRow} -eq 0 ]; then
   nRow=`echo "${nfile}/${nCol}" | bc -l | awk '{ if ($1 == int($1)) {printf "%d\n", $1} else { if ($1>0) {printf "%d\n",int($1)+1 } else {printf "%d\n",int($1)} } }'`
fi
if [ ${isnRow} -eq 1 ] && [ ${isnCol} -eq 0 ]; then
   nCol=`echo "${nfile}/${nRow}" | bc -l | awk '{ if ($1 == int($1)) {printf "%d\n", $1} else { if ($1>0) {print "%d\n",int($1)+1 } else {printf "%d\n",int($1)} } }'`
fi
if [ $isnRow -eq 0 ] && [ $isnCol -eq 0 ]; then
   nCol=1
   nRow=${nfile}
fi

colstr=`printf "%*s\n" ${nCol} " " | sed -e 's/\ /c/g'`
nwidth=$(printf "%.2f\n" `echo "1/${nCol}" | bc -l`)
[ ${nwidth} == "1.00" ] && nwidth=""
#echo -e "nCol=${nCol}\nnRow=${nRow}\nnWid=${nwidth}"

# header of tex file
texfile=${epsfname%.*}.tex
dvifile=${epsfname%.*}.dvi
psfile=${epsfname%.*}.ps
logfile=${epsfname%.*}.log
auxfile=${epsfname%.*}.aux
pdfname=${epsfname%.*}.pdf

header[0]='\documentclass[letterpaper,12pt]{article}'
header[1]='\usepackage{epsfig}'
header[2]='\begin{document}'
header[3]='\thispagestyle{empty}'
header[4]='\begin{figure}'
header[5]='\centering'
header[6]="\begin{tabular}{${colstr}}"
printf "%s\n" ${header[*]} > ${texfile}
n=0
nfileC=`expr ${nfile} - 1`
for nL in `seq 1 ${nRow}`
do
    for nC in `seq 1 ${nCol}`
    do
       if [ $n -lt ${nfile} ]; then
          epsname=${epsfile[$n]}
          if [ ${nC} -eq ${nCol} ]; then
             if [ ${nL} -eq ${nRow} ]; then
                tmpstr=""
             else
                tmpstr=" \\\\"
             fi
          else
             tmpstr=" &"
          fi

          [ ${n} -eq ${nfileC} ] && tmpstr=""
          figline[$n]="\epsfig{file=${epsname},width=${nwidth}\linewidth,clip=}${tmpstr}"
          #printf "%s\n" "${figline[$n]}" >> ${texfile}
          n=`expr $n + 1`
       fi
    done
done
printf "%s %s\n" ${figline[*]} >> ${texfile}

# tail of tex file
mytail[0]="\end{tabular}"
if [ ${isCaption} -eq 1 ]; then
   mytail[1]="\caption${myCaption}"
else
   mytail[1]=""
fi
mytail[2]="\end{figure}"
mytail[3]="\end{document}"
printf "%s\n" ${mytail[*]} >> ${texfile}

#compile the tex file
latex ${texfile}
dvips -t letter -Ppdf -o ${psfile} ${dvifile} && rm -f ${dvifile}
ps2pdf ${psfile} && rm -f ${psfile} ${auxfile} ${logfile}
[ ${isDel} -eq 1 ] && rm -f ${texfile}

# crop the pdf file
pdfname=${epsfname%.*}.pdf
pdfcrop ${pdfname} && mv ${pdfname%.*}-crop.pdf ${pdfname} && pdftops -eps ${pdfname} ${epsfname}

ShowCalendar