/ / Bash printf z pustymi kolumnami - bash, printf

Bash printf z pustymi kolumnami - bash, printf

Jakikolwiek pomysł, w jaki sposób mogę nadal umieszczać puste miejsce w wierszu za pomocą printf, tj. Gdy zmienna kolumny jest pusta? Na przykład:

printf $GREEN"################################ SOURCED ###############################"$RESET
printf $GREEN"%-1s%-15s%-60s%-1s%sn" "#"$RESET " REGION NAME:" $OS_REGION_NAME $GREEN"#"$RESET
printf $GREEN"########################################################################"$RESET

Zasadniczo tworzę pudełko z tymi pokazamizmienne źródłowe. Czasami niektóre pola są puste. Pole to nie powinno się zwijać po prawej stronie, kiedy to się dzieje. Pomyślałem, że poprawnie to zrobiłem z ustawieniami kolumn w środkowej linii, ale najwyraźniej ignoruje szerokość, jeśli kolumna jest pusta.

Wynik powinien wyglądać mniej więcej tak:

################################ SOURCED ###############################
# AUTH URL: blah blah blah                                             #
# REGION NAME: fcdnjcndkjcndkajcndkjcnklcnklsncklsnkcldnslc            #
########################################################################

ale wygląda to tak

################################ SOURCED ###############################
# AUTH URL: blah blah blah #
# REGION NAME: fcdnjcndkjcndkajcndkjcnklcnklsncklsnkcldnslc #
########################################################################

ROZWIĄZANIE

Rozwiązaniem było umieszczenie zmiennych w podwójnych cudzysłowach. Taka prosta poprawka ...

printf $GREEN"%-1s%-15s%-55s%-1s%sn" "#"$RESET " REGION NAME:" "$OS_REGION_NAME" $GREEN"#"$RESET

UWAGA

$ GREEN i $ RESET były przeznaczone do kolorowania w innej części skryptu.

Odpowiedzi:

1 dla odpowiedzi № 1

Problem polega na tym, że nie udało się zacytować rozszerzenia $OS_REGION_NAME więc kiedy jest to pusty ciąg znaków, do którego cały argument należy printf znika (tj. printf widzi jeden mniej argument i wszystko po tym, jak przesunie się w specyfikatorach ciągu formatów).

Powiedziawszy to, przepisałbym twoje linie w ten sposób

printf "################################ SOURCED ###############################n" "$GREEN" "$RESET"
printf "$s%-1s%-15s%-60s%-1s%sn" "$GREEN" "#$RESET" " REGION NAME:" "$OS_REGION_NAME" "$GREEN#$RESET"
printf "%s########################################################################%sn" "$GREEN" "$RESET"