Как передать вывод в сценарий sh и передать его в команду?

Вы можете проанализировать файл / etc / passwd , который содержит имя пользователя и список оболочки входа. наряду с другой соответствующей информацией обо всех учетных записях пользователей системы.

Имя пользователя хранится в : разделено первым, а оболочка входа - в седьмом (последнем) поле.

Таким образом, вы можете использовать awk для печати полей с небольшим форматированием между ними для наглядности:

awk -F':' '{ print $1 " " FS " " $NF }' /etc/passwd

Если вы используете такие службы, как ldap , которые не используют локальный файловой системы, вы можете использовать getent passwd , чтобы следовать nsswitch , чтобы получить информацию, а затем использовать awk вместо этого:

getent passwd | awk -F':' '{ print $1 " " FS " " $NF }'

Пример:

% awk -F':' '{ print $1 " " FS " " $NF }' /etc/passwd
root : /bin/bash
daemon : /usr/sbin/nologin
bin : /usr/sbin/nologin
sys : /usr/sbin/nologin
sync : /bin/sync
games : /usr/sbin/nologin
man : /usr/sbin/nologin
lp : /usr/sbin/nologin
mail : /usr/sbin/nologin
2
19.05.2017, 10:58
3 ответа
#!/bin/sh
gzip -c

Этого было бы достаточно.

$ mysqldump... |./script >out.gz

gzip -cбудет считывать несжатые данные на стандартный ввод и записывать сжатые данные на стандартный вывод.

Стандартный ввод обеспечивается конвейером, а стандартный вывод перенаправляется в файл. О конвейере и перенаправлении заботится вызывающая оболочка.

Чуть более сложный пример, который берет выражение sedв командной строке и преобразует ввод в соответствии с ним или просто пересылает данные, если выражение не использовалось:

#!/bin/sh

if [ -n "$1" ]; then
    sed -e "$1"
else
    cat
fi

(здесь использование sed -e ""имело бы тот же эффект, что и cat, но я хотел более сложный пример)

$ utility |./script "1,5d" >out

... удалит первые пять строк вывода из utility.

3
27.01.2020, 21:53

Чтобы использовать read, чтобы прочитать часть ввода, чтобы проверить, пуст он или нет, у вас будет использовать оболочку типа zsh, которая может хранить любое значение байта в своих переменных, например:

#! /bin/zsh -
if LC_ALL=C read -ru0 -k1 byte; then
  # one byte was read, the input is not empty
  (printf %s "$byte"; cat) | gzip
else
  echo >&2 No input
fi

Или использовать некоторую форму кодирования:

#! /bin/sh -
# get the value of the first byte as octal:
byte=$(od -An -N1 -vto1 | tr -cd 0-7)

if [ -n "$byte" ]; then
  (printf "\\$byte"; cat) | gzip
else
  echo >&2 No input
fi
1
27.01.2020, 21:53

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

Сказав это, это сделает то, что задает ваш вопрос:

#!/bin/sh
gzip "$@"
2
27.01.2020, 21:53

Теги

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