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.