Короче говоря, я бы сказал (предположим, что )они используют umask по-разному.
0022 — это точно группа -other unset W. Вы можете изменить umask, чтобы снять запрет на запись и проверить результат.
Ссылаясь на руководство Solaris, также известное как SunOS (, а также комментарии ), так как это кажется довольно связанным :«… umask (1 )не будет применяться, если каталог содержит записи ACL по умолчанию....."
Этот скрипт (протестирован с 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 -хотя сомневаюсь, что это что-то изменит)
Внутри функции мы можем изменить командную строку. Итак, мы заново создаем командную строку из $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" ""
Если ваша цель состоит в том, чтобы просто напечатать строковую переменную с фиксированной, заполненной пробелами -длиной поля, я бы рекомендовал использовать функцию 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!