Ucieczka łączników (-) z printf w bash

2

Mam następującą linię:

printf "---- %.55s\n" "$1 --------------"

Po uruchomieniu tego w bash pojawia się następujący błąd:

printf: -: nieprawidłowa opcja printf: użycie: printf [-v var] format [argumenty]

Jest tak, ponieważ (myślę) printf interpretuje ciąg „----” jako początek argumentu. Próbowałem uciec przed tym za pomocą „\”:

printf "\---- %.55s\n" "$1 --------------"

Oto wynik:

\---- content of $1 -------

Jak widać „\” stało się częścią wyjścia, czego nie chcę.

Pytanie brzmi: jak mogę przekonać printf, że nie próbuję przekazać długiego argumentu ?

Lennart Rolland
źródło
Zastąpienie dowolnego -ciągu formatu formatem jego ósemkowej reprezentacji (tutaj, \055) powinno działać. Jednak nie jest to najczystsze. Jak wprintf '\055\055\055\055\055 %.55s\n' "$1 --------------"
fra-san
Dowiedziałem się wkrótce potem, że po prostu wstawiłem podwójny łącznik „-”, zanim zadziałał ciąg znaków.
Lennart Rolland
Cieszę się, że problem został rozwiązany. I tak dodam odpowiedź, aby pomóc tym, którzy w końcu na to wpadną.
fra-san

Odpowiedzi:

2

Aby uniknąć -interpretacji argumentu jako opcji, masz kilka różnych możliwości:

1) Przenieś znaki minus z ciągu formatu na ciąg argumentu, prawdopodobnie odzwierciedlając nową długość wydrukowanego ciągu w specyfikatorze %.sformatu. Jak w:

$ printf "%.60s\n" "---- $1 --------------"

2) bashwbudowane polecenia akceptują --jako opcję, która nakazuje im przerwać przetwarzanie opcji i traktować wszystko, co następuje, jako nazwy plików i argumenty. Jak w:

$ printf -- "---- %.55s\n" "$1 --------------"

3) Możesz zastąpić znaki minus ich kodami ósemkowymi. W rzeczywistości zastąpienie tylko pierwszego działa, jak w:

$ printf "\055--- %.55s\n" "$1 --------------"
fra-san
źródło