GNU/Linux >> Tutoriels Linux >  >> Linux

Comment décomposer une chaîne littérale extrêmement longue dans bash?

Je définis une courte fonction strcat en haut de mon script bash et j'utilise une invocation en ligne pour diviser les choses. Je le préfère parfois à l'utilisation d'une variable distincte car je peux définir le littéral long en ligne avec l'invocation de la commande.

function strcat() {
  local IFS=""
  echo -n "$*"
}

mycommand \
  --server myserver \
  --filename "$(strcat \
      extremely/long/file/name/ \
      that/i/would/like/to/be/able/to/break/ \
      up/if/possible)" \
  --otherflag \
  --anotherflag \

J'aime aussi cette approche lorsque je dois entrer un long CSV de valeurs comme paramètre d'indicateur, car je peux l'utiliser pour éviter de taper la virgule entre les valeurs :

function strjoin() {
  local IFS="$1"
  shift
  echo -n "$*"
}

csv_args=(
  foo=hello
  bar=world
  "this=arg  has  spaces  in  it"
)
mycommand \
  --server myserver \
  --csv_args "$(strjoin , "${csv_args[@]}")" \
  --otherflag \
  --anotherflag \

Ce qui équivaut à

mycommand \
  --server myserver \
  --csv_args "foo=hello,bar=world,this=arg  has  spaces  in  it" \
  --otherflag \
  --anotherflag \

Vous pouvez utiliser une variable :

file=extremely/long/file/name
file+=/that/i/would/like/to/be/able/to/break
file+=/up/if/possible

mycommand\
    --server myserver\
    --filename $file\
    --flag flag

On peut aussi utiliser une variable tableau

file=(extremely/long/file/name
    /that/i/would/like/to/be/able/to/break
    /up/if/possible)
IFS=''

echo mycommand\
    --server myserver\
    --filename "${file[*]}"\
    --flag flag

C'est un un peu pirater, mais cela fonctionne :

mycommand \
    --server myserver \
    --filename "extremely/long/file/name/"`
               `"that/i/would/like/to/be/able/to/break/"`
               `"up/if/possible" \
    --otherflag \
    --anotherflag

Bash concatène les littéraux de chaîne qui sont adjacents, nous en profitons donc. Par exemple, echo "hi" "there" imprime hi there alors que echo "hi""there" imprime hithere .

Il tire également parti de l'opérateur backtick et du fait qu'un tas d'espaces est évalué à rien.


Linux
  1. Comment déboguer un script bash ?

  2. Comment créer un tableau d'éléments uniques à partir d'une chaîne/tableau dans Bash ?

  3. Comment détecter Bash>=4.0 ?

  4. Comment lire une chaîne en tant que numéro hexadécimal dans Bash ?

  5. Comment diviser une chaîne dans un script bash

Bash break :comment sortir d'une boucle

Chaînes de concaténation bash

Comment vérifier si une chaîne contient une sous-chaîne dans Bash

Comment utiliser bash if -z et if -n pour tester des chaînes sous Linux

Script Bash - Manipulation de chaînes

Comment exécuter un script bash