избегать пробелов при объединении переменных в bash под macos - PullRequest
2 голосов
/ 19 февраля 2020

У меня странная проблема с bash под macos. Когда я объединяю две переменные, между ними добавляется дополнительный пробел, от которого я не могу избавиться.

~/testdrive/dir1 $ curd=$(pwd)
~/testdrive/dir1 $ echo $curd
/xx/xx/testdrive/dir1
~/testdrive/dir1 $ fcount=$(ls -l | wc -l)
~/testdrive/dir1 $ echo $fcount
5          # notice no space in front of the 5 
~/testdrive/dir1 $ echo $curd$fcount
/xx/xx/testdrive/dir1 5 # space between directory name and 5

Я использую GNU bash, версия 5.0.16 (1) -релиз (x86_64-apple) -darwin19.3.0). Я попробовал newd = "$ curd $ fcount" и newd = $ {curd} $ {fcount} с тем же результатом. В некоторых каталогах между переменными добавляется 5 или более пробелов.

Однако,

~/testdrive/dir1 $ var1=abc
~/testdrive/dir1 $ var2=def
~/testdrive/dir1 $ echo $var1$var2
abcdef   # expected behavior

Затем, опять же,

~/testdrive/dir1 $ echo $var1$fcount
abc 5  # space between

Я видел много советов о том, как удалить пробелы из строк, однако я не понимаю, почему он там, в первую очередь. Я предполагаю, что это связано с fcount=$(ls -l | wc -l), но как? Есть идеи?

Ответы [ 2 ]

2 голосов
/ 19 февраля 2020

Bash переменные нетипизированы. Попробуйте это:

fcount=$(ls | wc -l)

echo $fcount          # check it
469                   # it looks ok, but...

echo "$fcount"        # ... when quoted properly
     469              # it has leading spaces! UGH!

Попробуйте еще раз, но на этот раз скажите bash это целое число:

declare -i fcount     # Tell bash it's an integer
fcount=$(ls | wc -l)  # set it
echo "$fcount"        # check value with correct quoting
469                   # and it's correct

Или, если вам не нравится этот метод, вы может сказать bash заменить все пробелы ничем / пустотой.

string="   abc  |"

echo "$string"           # display string as is
   abc  |

echo "${string// /}"     # delete all spaces in string
abc|
0 голосов
/ 19 февраля 2020

Это работает для меня:

 $ name='john'
 $ age='5'
 $ echo "${name}${age}"
john5

Я использую:

GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
Copyright (C) 2007 Free Software Foundation, Inc.

Пожалуйста, попробуйте повторить это в вашей версии. Иначе это тоже может сработать:

$ newvalue=$( printf "%s%s\n" $name $age )
$ echo "$newvalue" 
john5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...