230 votes

Passer une chaîne avec des espaces comme argument de fonction dans bash

J'écris un script bash dans lequel je dois passer une chaîne contenant des espaces à une fonction de mon script bash.

Par exemple:

 #!/bin/bash

myFunction
{
    echo $1
    echo $2
    echo $3
}

myFunction "firstString" "second string with spaces" "thirdString"
 

Une fois exécuté, le résultat attendu serait:

 firstString
second string with spaces
thirdString
 

Cependant, ce qui est réellement produit est:

 firstString
second
string
 

Est-il possible de passer une chaîne avec des espaces comme argument unique à une fonction dans bash?

218voto

ghostdog74 Points 86060

vous devriez mettre des guillemets et aussi, votre déclaration de fonction est fausse.

 myFunction()
{
    echo "$1"
    echo "$2"
    echo "$3"
}
 

Et comme les autres, ça marche aussi pour moi. Dites-nous quelle version de shell vous utilisez.

32voto

TheBanjoMinnow Points 11

Une autre solution à la question ci-dessus est de définir chaque chaîne à une variable, appeler la fonction avec des variables notée par un littéral signe dollar \$. Ensuite, en fonction de l'utilisation eval de lire la variable et de sortie comme prévu.

#!/usr/bin/ksh

myFunction()
{
  eval string1="$1"
  eval string2="$2"
  eval string3="$3"

  echo "string1 = ${string1}"
  echo "string2 = ${string2}"
  echo "string3 = ${string3}"
}

var1="firstString"
var2="second string with spaces"
var3="thirdString"

myFunction "\${var1}" "\${var2}" "\${var3}"

exit 0

La sortie est alors:

    string1 = firstString
    string2 = second string with spaces
    string3 = thirdString

En essayant de résoudre un problème semblable à cela, j'ai été en cours d'exécution dans la question de l'UNIX de la pensée de mes variables de l'espace delimeted. J'essayait de faire passer un tuyau de chaîne délimitée par une fonction à l'aide d' awk pour définir une série de variables utilisées par la suite pour créer un rapport. J'ai d'abord essayé la solution posté par ghostdog74, mais ne pouvait pas le faire fonctionner car tous mes paramètres ont été transmis dans les citations. Après l'ajout de guillemets pour chaque paramètre, puis il a commencé à fonctionner comme prévu.

Ci-dessous est à l'avant que l'état de mon code et qui fonctionne parfaitement après l'etat.

Avant - Non Fonctionnement Du Code

#!/usr/bin/ksh

#*******************************************************************************
# Setup Function To Extract Each Field For The Error Report
#*******************************************************************************
getField(){
  detailedString="$1"
  fieldNumber=$2

  # Retrieves Column ${fieldNumber} From The Pipe Delimited ${detailedString} 
  #   And Strips Leading And Trailing Spaces
  echo ${detailedString} | awk -F '|' -v VAR=${fieldNumber} '{ print $VAR }' | sed 's/^[ \t]*//;s/[ \t]*$//'
}

while read LINE
do
  var1="$LINE"

  # Below Does Not Work Since There Are Not Quotes Around The 3
  iputId=$(getField "${var1}" 3)
done<${someFile}

exit 0

Après Le Fonctionnement Du Code

#!/usr/bin/ksh

#*******************************************************************************
# Setup Function To Extract Each Field For The Report
#*******************************************************************************
getField(){
  detailedString="$1"
  fieldNumber=$2

  # Retrieves Column ${fieldNumber} From The Pipe Delimited ${detailedString} 
  #   And Strips Leading And Trailing Spaces
  echo ${detailedString} | awk -F '|' -v VAR=${fieldNumber} '{ print $VAR }' | sed 's/^[ \t]*//;s/[ \t]*$//'
}

while read LINE
do
  var1="$LINE"

  # Below Now Works As There Are Quotes Around The 3
  iputId=$(getField "${var1}" "3")
done<${someFile}

exit 0

7voto

R Samuel Klatchko Points 44549

Votre définition de myFunction est fausse. CA devrait etre:

 myFunction()
{
    # same as before
}
 

ou:

 function myFunction
{
    # same as before
}
 

Quoi qu'il en soit, cela a l'air bien et fonctionne bien pour moi sur Bash 3.2.48.

0voto

Andy White Points 36586

Cela a également fonctionné pour moi si je déclarais "myFunction" avec le mot clé function:

 function myFunction
{
    # same as you have
}
 

0voto

helmedeiros Points 59

Vous pourriez avoir une extension de ce problème si votre texte initial était défini dans une variable de type chaîne, par exemple:

 function status(){    
  if [ $1 != "stopped" ]; then
     artist="ABC";
     track="CDE";
     album="DEF";
     status_message="The current track is $track at $album by $artist";
     echo $status_message;
     read_status $1 "$status_message";
  fi
}

function read_status(){
  if [ $1 != "playing" ]; then
    echo $2
  fi
}
 

Dans ce cas, si vous ne transmettez pas la variable status_message en tant que chaîne (entourée de ""), elle sera divisée en un montage d'arguments différents.

"$ variable" : La piste en cours est CDE à DEF par ABC

$ variable : le

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X