Bash объединяет два выхода в одну строку - PullRequest
0 голосов
/ 07 сентября 2018

Я пытаюсь напечатать два вывода в одной строке, например:

4 3

Но я получаю это:

4
3

Это две мои команды:

find "$1" -type f | wc -1
find "$1" -type d | wc -1 

Я попытался присвоить каждую переменную, а затем с помощью echo или printf объединить их, но, похоже, ничего не работает.

Ответы [ 3 ]

0 голосов
/ 07 сентября 2018

Это одна из тех вещей, которая приходит из большого опыта. Вы были на правильном пути, глядя на echo и printf.

Я собираюсь начать с подстановки команд, потому что это первый метод, который приходит на ум. Я объединю это с echo. (Это снова опыт.) Вы можете прочитать о подстановке команд во многих местах, попробовать поискать ее в Google или проверить вопрос и ответы здесь .

Наша цель может быть сформулирована как выполнение следующих шагов:

#Not real code
$ echo "<number_of_files> <number_of_directories>"

Подстановка команд просто позволяет нам использовать выходные данные команды, чтобы дать нам <number_of_files> и <number_of_directories>. Чтобы получить эти выходные данные, мы используем шаблон $(my_command), который даст любой вывод, который работает

$ my_command

на терминале дает. Надеюсь, это станет более понятным, когда вы доберетесь до помеченной мной части, выделив жирным шрифтом слова «Здесь мы выполняем подстановку команд».

Я собираюсь представить, что у вас есть структура каталогов, похожая на следующую. (Я называю это no_stack_dir, потому что вы не хотите, чтобы ваши номера располагались друг над другом.)

no_stack_dir/
├── dir1
├── dir2
├── file1
├── file2
├── file3
└── file4

Я собираюсь упростить вещи, не создавая сценарий. Вместо использования "$1" я просто собираюсь использовать имя каталога - в данном случае /home/jsmith147/no_stack_dir. Прежде чем я покажу метод, я надеюсь убедиться, что наша настройка каталога понятна с помощью следующих команд.

$ cd ~

$ pwd
/home/jsmith147

$ls
no_stack_dir

$ls no_stack_dir
dir1    file2
dir2    file3
file1   file4

Обратите внимание, у меня есть только 2 подкаталога, потому что наша команда find будет включать no_stack_dir в свои найденные каталоги вместе с dir1 и dir2.

Здесь мы делаем команду подстановки в сочетании с echo.

Наш <number_of_files> исходит от команды,

find /home/jsmith147/no_stack_dir -type f | wc -l

и наш <number_of_directories> исходит от команды,

find /home/jsmith147/no_stack_dir -type d | wc -l

Обратите внимание, что я не помещал подсказку терминала, $ перед этими командами. Здесь начинается подстановка команд. Идем от

#Not real code
$ echo "<number_of_files> <number_of_directories>"

до

#Real code
$ echo "$(find /home/jsmith147/no_stack_dir -type f | wc -l) $(find /home/jsmith147/no_stack_dir -type d | wc -l)"

Я надеюсь, что с этими примерами я достаточно ясно дал понять, что вы можете написать скрипт (или что-то еще, использующее "$1"), который будет запускать что-то вроде

$ ./no_stack.sh /home/jsmith147/no_stack_dir

Не стесняйтесь задавать вопросы. Есть много других способов выполнить то, что вы пытаетесь сделать. Возможно, SO-сообщество может предложить множество других способов получения того же результата. Было бы интересно перечислить их здесь.

0 голосов
/ 07 сентября 2018

Вы должны перечислить ваш полный пример с использованными вами командами echo.

Ответ Роджера. Это должно сработать.

Вы также можете рассмотреть возможность использования

  • echo -n, например:

    var1="3"
    var2="4"
    echo -n "$var1"
    echo -n " "
    echo "$var2"
    

    будет производить

    3 4
    
  • printf, который позволяет форматировать, например:

    var1="3"
    var2="4"
    printf "%d %d\n" $var1 $var2
    

    выдаст

    3 4
    
0 голосов
/ 07 сентября 2018

Я не смог воспроизвести вашу проблему.

var1=`find "." -type f | wc -l`
var2=`find "." -type d | wc -l`
echo $var1 $var2
8514 93

Но все же, если вы хотите заменить любые \n символы из ввода, сделайте следующее - Используйте tr для замены любой новой строки в вашем вводе.

Например,

echo -e "4\n3" Выходы

4

3

echo -e "4\n3" | tr '\n' ' ' (заменить новую строку пробелом)

выходы

4 3

В качестве альтернативы, вы можете добавить tr '\n' '' (заменить символ новой строки на ничем ) перед присвоением значения переменной.

* +1032 * Пример: * 1 033 *
var1=`find "$1" -type f | wc -1 | tr '\n' ''`
var2=`find "$1" -type d | wc -1 | tr '\n' ''`

echo "$var1 $var2"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...