Вы можете проанализировать файл / 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
#!/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
.
Чтобы использовать 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
Я не уверен, какая часть вашего сценария является простым недоразумением, а какая сложностью, потому что вы пытаетесь проиллюстрировать сложную ситуацию на более простом примере.
Сказав это, это сделает то, что задает ваш вопрос:
#!/bin/sh
gzip "$@"