2015-04-20 8 views
8

Mam krótki wbudowany skrypt python, który wywołuję ze skryptu Bash, i chcę, aby obsłużył zmienną wielu słów (która pochodzi z $*). Spodziewałem się tego po prostu pracować:Przekaż wiele argumentów z bashu do pythona

#!/bin/bash 

arg="A B C" 
python -c "print '"$arg"'" 

ale nie:

File "<string>", line 1 
    print 'A 
     ^
SyntaxError: EOL while scanning string literal 

Dlaczego?

+2

'python -c "print \" $ arg \ ""' pracuje dla mnie. –

+2

lub nawet 'python -c" print '$ arg' "' –

+2

Podświetlanie składni pokazuje problem :-) –

Odpowiedz

10

Chciałbym wyjaśnić, dlaczego Twój kod nie działa praca.

Co chcesz zrobić, to że:

arg="A B C" 
python -c "print '""$arg""'" 

wyjściowa:

A B C 

Problemem jest to, że kod jest analizowany jako python -c "print '"$arg"'"python -c "print '"A B C"'" przez powłokę. Zobacz to:

arg="A B C" 
python -c "print '"A B C"'" 
#__________________^^^^^____ 

wyjściowa:

File "<string>", line 1 
    print 'A 

SyntaxError: EOL while scanning string literal 

Tu pojawia się błąd składni, ponieważ zapobiega konkatenacji przestrzenie, więc następujące B i C"'" są interpretowane jako dwa różne ciągi znaków, które nie są częścią łańcucha przekazywane jako polecenie do interpretera python (który pobiera tylko ciąg następujący po -c jako polecenie).

Dla lepszego zrozumienia:

arg="ABC" 
python -c "print '"$arg"'" 

wyjściowa:

ABC 
+1

Awsome explanation bro +1, ale wyście zaklinali się trochę wcześniej! –

+0

Nieważne: p Cieszę się, że mogę pomóc! –

+0

Czy możesz wyjaśnić, dlaczego 'python -c" print '"A B C" "" 'daje błąd SyntaxError? Nie jestem pewien, czy podążam. Co dzieje się z pomieszczeniami? – Barry

16

Skrypt BASH jest nieprawidłowy.

#!/bin/bash 

arg="A B C" 
python -c "print '$arg'" 

i wyjście

$ sh test.sh 
A B C 

pamiętać, że aby złączyć dwie zmienne łańcuchowe, których nie potrzebujesz, aby umieścić je poza ciągiem stałych

+3

Znaleziono ładny zasób na łączących się ciągach tutaj http://stackoverflow.com/questions/4181703/how-can- i-concatenate-string-variables-in-bash –