Existem várias maneiras de fazer o que você quer.
Por padrão, bash
usando espaços em branco como separador padrão, mas você pode facilmente substituir isso usando IFS
(Internal Field Separator) ou use técnicas diferentes, como enumeração. Abaixo estão alguns exemplos que primeiro vêm à mente.
Variante # 1
Usando uma variável interna especial IFS
(Internal Field Separator)
#!/bin/bash
touch 'file a' 'file b'
# Set IFS to new line as a separator
IFS='
'
ls -la $( echo 'file a'; echo 'file b' )
Variante # 2
Usando for
loop
#!/bin/bash
touch 'file a' 'file b'
for variable in 'file a' 'file b';do
ls -la "${variable}"
done
Variante # 3
Usando for
do loop de valores predefinidos
#!/bin/bash
MultiArgs='
arg 0 1
arg 0 2
arg 0 3
arg 0 N
'
# Using only new line as a separator
IFS='
'
for variable in ${MultiArgs};do
touch "${variable}"
ls -la "${variable}"
done
Variante # 4
Usando ~
(tilda) como separador
#!/bin/bash
MultiArgs='arg 0 1~arg 0 2~arg0 3~ar g 0 N' # Arguments with spaces
IFS='~'
for file in ${MultiArgs};do
touch "${file}"
ls -la "${file}";
done
Is the old backtick syntax any different?
Não, é o mesmo, mas os backticks têm alguma limitação que $()
não faz.
Or does a bash user just avoid any spaces or symbols in filenames (like an animal) to make everything easy?
Não, não há problema em usar espaços em nomes de arquivos na medida em que se usaria a cotação correta.
Mais ou menos $(cmdb-that-generates-parameters-for-cmda)
#!/bin/bash
# first command generate text for 'sed' command that replacing . to ###
echo $( for i in {1..5}; do echo "${i} space .";done | sed 's/\./###/g' )
#############################################
# Another example: $() inside of another $()
for i in {1..5}; do touch "${i} x.file";done # Prepare some files with spaces in filenames
IFS='
'
echo "$( ls -la $(for i in ls *.file; do echo "$i"; done))"
Se quiser passar todos os parâmetros em uma única linha para alimentar seu programa transcode
, você pode adicionar ao final a seguinte função do arquivo ~/.bashrc
:
_tr() {
local debug
debug=1
[ $debug -eq 1 ] && {
echo "Number of Arguments: $#"
echo "Arguments: $@"
}
transcode "$@"
}
e chame essa função da linha de comando assim:
eval _tr $(echo "$out")
Onde a variável out
deve ser assim: out="'file a' 'file b'"
.
Se você digitar nomes de arquivos manualmente, a chamada para _tr
function será semelhante a:
eval _tr $(echo "'file a' 'file b'")
Se você usasse algum script externo no lugar de $()
do que o script / programa externo, deveria retornar a lista de arquivos citados exatamente assim:
"'file a' 'file b'"