GNU/Linux >> Tutoriels Linux >  >> Linux

Substitution de commande :fractionnement sur une nouvelle ligne mais pas sur un espace ?

Je sais que je peux résoudre ce problème de plusieurs manières, mais je me demande s'il existe un moyen de le faire en utilisant uniquement les fonctions intégrées bash, et si ce n'est pas le cas, quelle est la manière la plus efficace de le faire.

J'ai un fichier avec un contenu comme

AAA
B C DDD
FOO BAR

par quoi je veux seulement dire qu'il a plusieurs lignes et chaque ligne peut ou non avoir des espaces. Je veux exécuter une commande comme

cmd AAA "B C DDD" "FOO BAR"

Si j'utilise cmd $(< file) je comprends

cmd AAA B C DDD FOO BAR

et si j'utilise cmd "$(< file)" je comprends

cmd "AAA B C DDD FOO BAR"

Comment faire en sorte que chaque ligne soit traitée avec exactement un paramètre ?

Réponse acceptée :

Portable :

set -f              # turn off globbing
IFS='
'                   # split at newlines only
cmd $(cat <file)
unset IFS
set +f

Ou en utilisant un sous-shell pour faire le IFS et l'option change localement :

( set -f; IFS='
'; exec cmd $(cat <file) )

Le shell effectue le fractionnement des champs et la génération du nom de fichier sur le résultat d'une substitution de variable ou de commande qui n'est pas entre guillemets doubles. Vous devez donc désactiver la génération de nom de fichier avec set -f , et configurez le fractionnement des champs avec IFS pour que seules les nouvelles lignes séparent les champs.

Il n'y a pas grand-chose à gagner avec les constructions bash ou ksh. Vous pouvez faire de l'IFS local à une fonction, mais pas set -f .

Dans bash ou ksh93, vous pouvez stocker les champs dans un tableau, si vous devez les transmettre à plusieurs commandes. Vous devez contrôler l'expansion au moment où vous construisez la matrice. Alors "${a[@]}" développe les éléments du tableau, un par mot.

set -f; IFS=$'n'
a=($(cat <file))
set +f; unset IFS
cmd "${a[@]}"

Linux
  1. Pourquoi la substitution de commande Shell engloutit-elle un caractère de fin de ligne ?

  2. Intercepter les erreurs dans la substitution de commande à l'aide de "-o Errtrace" (c'est-à-dire Set -e) ?

  3. Substitution de commande à l'aide de " ?

  4. Commande introuvable dans Zsh, mais trouvée dans Bash ?

  5. Gnu Awk Errno n'est pas défini en cas d'échec de la commande ?

du :commande introuvable

rm :commande introuvable

mv :commande introuvable

CentOS a installé php72 mais la ligne de commande php ne fonctionne pas

`ssh <host>` est un shell de connexion, mais `ssh <host> <command>` ne l'est pas ?

Autoriser SCP mais pas la connexion réelle à l'aide de SSH