Unindo argumentos bash em uma única string com espaços

22

Estou tentando juntar todos os argumentos a uma função Bash em uma única string com espaços separando cada argumento. Eu também preciso que a string inclua aspas simples ao redor da string inteira.

Aqui está o que eu tenho até agora ...

$array=("$@")
str="\'"
for arg in "${array[@]}"; do
    let $str=$str+$arg+" "
done
let $str=$str+"\'"

Obviamente isso não funciona, mas eu estou querendo saber se existe uma maneira de conseguir isso?

    
por Schwagmister 22.04.2015 / 04:07

2 respostas

30

Eu acredito que isso faz o que você quer. Ele colocará todos os argumentos em uma string, separados por espaços, com aspas simples ao redor de todos:

str="'$*'"

$* produz todos os argumentos de scripts separados pelo primeiro caractere de $IFS , que, por padrão, é um espaço.

Dentro de uma string com aspas duplas, não há necessidade de escapar de aspas simples.

Exemplo

Vamos colocar o acima em um arquivo de script:

$ cat script.sh 
#!/bin/sh
str="'$*'"
echo "$str"

Agora, execute o script com argumentos de amostra:

$ sh script.sh one two three four 5
'one two three four 5'

Este script é POSIX. Ele funcionará com bash , mas não exige bash .

Uma variação: concatenando com barras em vez de espaços

Podemos mudar de espaços para outro caractere ajustando IFS :

$ cat script.sh 
#!/bin/sh
old="$IFS"
IFS='/'
str="'$*'"
echo "$str"
IFS=$old

Por exemplo:

$ sh script.sh one two three four       
'one/two/three/four'
    
por 22.04.2015 / 04:32
3

É mais fácil do que você pensa:

#!/bin/bash
array="${@}"

echo $array

chmod + x, e execute:

$ ./example.sh --foo bar -b az 
--foo bar -b az
    
por 22.04.2015 / 04:32