pipe input to bash script (to translate text)












0















I'm trying to pu together a bash script to use mymemmory api to translate text. I want it to be able to translate single lines and multiple line by pipeing into it.



This is the script (mytrans) so far (I'm using jq):



#!/bin/bash

key=apikey
mail=themail

translate_line()
{
for x in "$@"; do
totranslate="$totranslate%20$x"
done
totranslate=${totranslate:3}

url="https://api.mymemory.translated.net/get?q=$totranslate&langpair=en-US%7Ces-ES&of=json&key=$thekey&de=$mail"

translated_text=$(curl -s $url | jq-linux64 '.responseData.translatedText' | sed -e 's/^"//' -e 's/"$//')
echo $translated_text
}

if [ -p /dev/stdin ]; then
while IFS= read line; do
echo $line
translate_line $line
done
else
translate_line "$@"
fi


It works fine if i run it on a simple line, or if I pipe a simple line. The problem is with multiple lines. Example:



$mytrans hello world
hello world
hola mundo
$echo bye | mytrans
bye
adios

$echo hello world > dd
$echo bye >> dd
$cat dd | mytrans
hello world
hola mundo
bye
lo bye mundo


what I'm doing wrong?










share|improve this question





























    0















    I'm trying to pu together a bash script to use mymemmory api to translate text. I want it to be able to translate single lines and multiple line by pipeing into it.



    This is the script (mytrans) so far (I'm using jq):



    #!/bin/bash

    key=apikey
    mail=themail

    translate_line()
    {
    for x in "$@"; do
    totranslate="$totranslate%20$x"
    done
    totranslate=${totranslate:3}

    url="https://api.mymemory.translated.net/get?q=$totranslate&langpair=en-US%7Ces-ES&of=json&key=$thekey&de=$mail"

    translated_text=$(curl -s $url | jq-linux64 '.responseData.translatedText' | sed -e 's/^"//' -e 's/"$//')
    echo $translated_text
    }

    if [ -p /dev/stdin ]; then
    while IFS= read line; do
    echo $line
    translate_line $line
    done
    else
    translate_line "$@"
    fi


    It works fine if i run it on a simple line, or if I pipe a simple line. The problem is with multiple lines. Example:



    $mytrans hello world
    hello world
    hola mundo
    $echo bye | mytrans
    bye
    adios

    $echo hello world > dd
    $echo bye >> dd
    $cat dd | mytrans
    hello world
    hola mundo
    bye
    lo bye mundo


    what I'm doing wrong?










    share|improve this question



























      0












      0








      0








      I'm trying to pu together a bash script to use mymemmory api to translate text. I want it to be able to translate single lines and multiple line by pipeing into it.



      This is the script (mytrans) so far (I'm using jq):



      #!/bin/bash

      key=apikey
      mail=themail

      translate_line()
      {
      for x in "$@"; do
      totranslate="$totranslate%20$x"
      done
      totranslate=${totranslate:3}

      url="https://api.mymemory.translated.net/get?q=$totranslate&langpair=en-US%7Ces-ES&of=json&key=$thekey&de=$mail"

      translated_text=$(curl -s $url | jq-linux64 '.responseData.translatedText' | sed -e 's/^"//' -e 's/"$//')
      echo $translated_text
      }

      if [ -p /dev/stdin ]; then
      while IFS= read line; do
      echo $line
      translate_line $line
      done
      else
      translate_line "$@"
      fi


      It works fine if i run it on a simple line, or if I pipe a simple line. The problem is with multiple lines. Example:



      $mytrans hello world
      hello world
      hola mundo
      $echo bye | mytrans
      bye
      adios

      $echo hello world > dd
      $echo bye >> dd
      $cat dd | mytrans
      hello world
      hola mundo
      bye
      lo bye mundo


      what I'm doing wrong?










      share|improve this question
















      I'm trying to pu together a bash script to use mymemmory api to translate text. I want it to be able to translate single lines and multiple line by pipeing into it.



      This is the script (mytrans) so far (I'm using jq):



      #!/bin/bash

      key=apikey
      mail=themail

      translate_line()
      {
      for x in "$@"; do
      totranslate="$totranslate%20$x"
      done
      totranslate=${totranslate:3}

      url="https://api.mymemory.translated.net/get?q=$totranslate&langpair=en-US%7Ces-ES&of=json&key=$thekey&de=$mail"

      translated_text=$(curl -s $url | jq-linux64 '.responseData.translatedText' | sed -e 's/^"//' -e 's/"$//')
      echo $translated_text
      }

      if [ -p /dev/stdin ]; then
      while IFS= read line; do
      echo $line
      translate_line $line
      done
      else
      translate_line "$@"
      fi


      It works fine if i run it on a simple line, or if I pipe a simple line. The problem is with multiple lines. Example:



      $mytrans hello world
      hello world
      hola mundo
      $echo bye | mytrans
      bye
      adios

      $echo hello world > dd
      $echo bye >> dd
      $cat dd | mytrans
      hello world
      hola mundo
      bye
      lo bye mundo


      what I'm doing wrong?







      bash pipe






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 21 '18 at 16:58







      kurokirasama

















      asked Nov 20 '18 at 20:14









      kurokirasamakurokirasama

      11915




      11915
























          1 Answer
          1






          active

          oldest

          votes


















          1














          At the beginning of the function translate_line(), you should declare local or initialize totranslate="", so that this it does not increase at each call.






          share|improve this answer
























          • cool! thanks!!!

            – kurokirasama
            Nov 20 '18 at 20:24











          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53400831%2fpipe-input-to-bash-script-to-translate-text%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          1














          At the beginning of the function translate_line(), you should declare local or initialize totranslate="", so that this it does not increase at each call.






          share|improve this answer
























          • cool! thanks!!!

            – kurokirasama
            Nov 20 '18 at 20:24
















          1














          At the beginning of the function translate_line(), you should declare local or initialize totranslate="", so that this it does not increase at each call.






          share|improve this answer
























          • cool! thanks!!!

            – kurokirasama
            Nov 20 '18 at 20:24














          1












          1








          1







          At the beginning of the function translate_line(), you should declare local or initialize totranslate="", so that this it does not increase at each call.






          share|improve this answer













          At the beginning of the function translate_line(), you should declare local or initialize totranslate="", so that this it does not increase at each call.







          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Nov 20 '18 at 20:21









          user803422user803422

          9472624




          9472624













          • cool! thanks!!!

            – kurokirasama
            Nov 20 '18 at 20:24



















          • cool! thanks!!!

            – kurokirasama
            Nov 20 '18 at 20:24

















          cool! thanks!!!

          – kurokirasama
          Nov 20 '18 at 20:24





          cool! thanks!!!

          – kurokirasama
          Nov 20 '18 at 20:24




















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53400831%2fpipe-input-to-bash-script-to-translate-text%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          這個網誌中的熱門文章

          Xamarin.form Move up view when keyboard appear

          Post-Redirect-Get with Spring WebFlux and Thymeleaf

          Anylogic : not able to use stopDelay()