Как печатать пробелы в сценариях оболочки

Короче говоря, я бы сказал (предположим, что )они используют umask по-разному.

0022 — это точно группа -other unset W. Вы можете изменить umask, чтобы снять запрет на запись и проверить результат.

Ссылаясь на руководство Solaris, также известное как SunOS (, а также комментарии ), так как это кажется довольно связанным :«… umask (1 )не будет применяться, если каталог содержит записи ACL по умолчанию....."

1
17.03.2021, 11:07
3 ответа

Этот скрипт (протестирован с bash и sh):

#!/bin/sh

function printWhiteSpaces() {
  local i="122"
  local len="$1"
  local k=`expr $i - $len`
  local whitespace='                                                                                                                                                                  '
  echo "${whitespace:0:$k}" test
}

printWhiteSpaces 100
printWhiteSpaces 110
printWhiteSpaces 120

Получил следующий результат, который, как мне кажется, является тем, что вы хотели:

                       test
             test
   test

(Это было сделано на Mac -хотя сомневаюсь, что это что-то изменит)

1
18.03.2021, 22:25

Внутри функции мы можем изменить командную строку. Итак, мы заново создаем командную строку из $k аргументов (all null ). После того, как построение завершено, мы повторяем командную строку $*в двойных кавычках, что даст IFS first char (= аргументы, разделенные пробелом ), и, поскольку все аргументы были нулевыми, мы увидим только море пробелов.

function printWhitespaces
{
  local i="122"
  local len="$1"
  local whitespace=' '
  local k=`expr $i - $len`
  set -- ""
  while [ "$#" -le "$k" ]
  do
    set -- "$@" "$1"
  done
  echo "$*"
}

И еще один подход, если вы уже вычислили переменную $k:

printf '%*s\n' "$k" ""
0
18.03.2021, 22:25

Если ваша цель состоит в том, чтобы просто напечатать строковую переменную с фиксированной, заполненной пробелами -длиной поля, я бы рекомендовал использовать функцию printfизbash:

printf "%122s" "$myvar"

напечатает содержимое $myvarс таким количеством пробелов слева, которое необходимо для заполнения всего 122 символов.

Попробуйте этот простой тест (Ширина поля принята равной 20 для удобочитаемости):

~> myVar="Hi, there!"; printf '%20s\n' "$myVar"
          Hi, there!
~> myVar="Bye!"; printf '%20s\n' "$myVar"
                Bye!

Ваш первоначальный подход не сработал, потому что echoбудет неявно печатать новую строку в конце.

Если вы хотите использовать цикл оболочки и только echo, вы должны вызвать его как echo -n, чтобы запретить новую строку:

~> myVar="Bye!"; l=${#myVar}; for ((i=20;i>l;i--)); do echo -n ' '; done; echo "$myVar"
                Bye!
2
18.03.2021, 22:25

Теги

Похожие вопросы