Como fornecer argumentos de comando como uma matriz? [fechadas]

1

Estou tentando testar se um arquivo tem todos os seus arquivos. Tudo que eu preciso fazer é um simples descompactar e depois fazer. O shell continua tentando interpretar argumentos como -aoq como um programa. Outros erros também existem, mas vou poupar os leitores de todos os jeitos para que não o façam. Aqui estão algumas das tentativas fracassadas:

Falha :

RESULT=$(unzip -aoq cryptopp563.zip -d "$TMP/cryptopp563-zip/")
if [[ "$RESULT" -eq "0" ]]; then ... fi;

RESULT=$(unzip (-aoq cryptopp563.zip -d "$TMP/cryptopp563-zip/"))
if [[ "$RESULT" -eq "0" ]]; then ... fi;

RESULT=$(unzip ("-aoq" "cryptopp.zip" "-d" "$TMP/cryptopp-zip/"))
if [[ "$RESULT" -eq "0" ]]; then ... fi;

RESULT=$(unzip "-aoq cryptopp563.zip -d $TMP/cryptopp563-zip/")
if [[ "$RESULT" -eq "0" ]]; then ... fi;

RESULT=$(unzip "{-aoq cryptopp563.zip -d "$TMP/cryptopp563-zip/"}")
if [[ "$RESULT" -eq "0" ]]; then ... fi;

RESULT=$(unzip "(-aoq cryptopp563.zip -d "$TMP/cryptopp563-zip/")")
if [[ "$RESULT" -eq "0" ]]; then
...

Se eu ver mais uma pergunta e resposta que diz "use parênteses", "use aspas" ou "use chaves", acho que vou gritar ...

Como eu chamo unzip com argumentos para que o Bash não tente interpretar os argumentos como comandos?

Veja algumas das mensagens de erro mais cômicas:

unzip:  cannot find or open {-aoq cryptopp563.zip -d /tmp/cryptopp563-zip/}, {-aoq cryptopp563.zip -d
/tmp/cryptopp563-zip/}.zip or {-aoq cryptopp563.zip -d /tmp/cryptopp563-zip/}.ZIP.


unzip:  cannot find or open (-aoq cryptopp563.zip -d /tmp/cryptopp563-zip/), (-aoq cryptopp563.zip -d
/tmp/cryptopp563-zip/).zip or (-aoq cryptopp563.zip -d /tmp/cryptopp563-zip/).ZIP.

Aqui estão algumas perguntas / respostas que não funcionaram para mim. Tenho quase certeza de que visitei várias vezes o U & L.SE, o Stack Overflow e o Super User.

por jww 09.09.2016 / 20:07

1 resposta

5

O primeiro:

RESULT=$(unzip -aoq cryptopp563.zip -d "$TMP/cryptopp563-zip/")

deve executar unzip bem, e soltar sua saída para a variável RESULT . No entanto, unzip não imprime muito em sua saída padrão (bem, a menos que com unzip -l ), então eu acho que você realmente quer o valor de retorno. Que pode ser encontrado em $? após a atribuição e substituição de comandos, ou apenas após a execução do programa como normal:

unzip -aoq cryptopp563.zip -d "$TMP/cryptopp563-zip/"
if [ "$?" -eq 0 ] ; then echo ok ; fi

(e sim, você poderia apenas if unzip ... ; then ... .)

Você não tem uma matriz lá, apenas um monte de parâmetros normais para o comando. Isso criaria uma matriz, imprimiria seu tamanho e passaria como argumentos para unzip :

A=(-aoq cryptopp563.zip -d "$TMP/cryptopp563-zip/")
echo ${#A[@]}
unzip "${A[@]}"   # note the quotes
    
por 09.09.2016 / 20:22