Онлайн робочі станції OnWorks Linux та Windows

логотип

Безкоштовний онлайн-хостинг для робочих станцій

<Попередній | зміст | Наступна>

IFS

Зазвичай оболонка виконує розщеплення слів на введених даних зчитування. Як ми бачили, це означає, що кілька слів, розділених одним або кількома пробілами, стають окремими елементами у рядку введення та призначаються окремим змінним за допомогою зчитування. Ця поведінка налаштовується змінною оболонки з іменем IFS (для внутрішнього роздільника поля). Значення за замовчуванням IFS містить пробіл, символ табуляції та символ нового рядка, кожен з яких відокремлює елементи один від одного.

Ми можемо налаштувати значення IFS для керування розділенням введених полів зчитування. Наприклад, / etc / passwd файл містить рядки даних, які використовують двокрапку як роздільник полів. Змінюючи значення IFS до однієї двокрапки, ми можемо використовувати зчитування для введення вмісту / etc / passwd і успішно розділяти поля на різні змінні. Ось у нас є скрипт, який робить саме це:



#! / бін / баш

# read-ifs: читання полів із файлу FILE=/etc/passwd

#! / бін / баш

# read-ifs: читання полів із файлу FILE=/etc/passwd


read -p "Введіть ім'я користувача > " ім'я_користувача file_info=$(grep "^$user_name:" $FILE), якщо [ -n "$file_info" ]; тоді

IFS=":" прочитати користувача pw uid gid ім'я домашня оболонка <<< "$file_info" echo "Користувач = '$user'"

echo "UID = '$uid'"

echo "GID = '$gid'" echo "Повне ім'я = '$name'" echo "Домашній каталог = '$home'" echo "Shell = '$shell'"

ще

echo "Немає такого користувача '$user_name'" >&2 вихід 1

fi

read -p "Введіть ім'я користувача > " ім'я_користувача file_info=$(grep "^$user_name:" $FILE), якщо [ -n "$file_info" ]; тоді

IFS=":" прочитати користувача pw uid gid ім'я домашня оболонка <<< "$file_info" echo "Користувач = '$user'"

echo "UID = '$uid'"

echo "GID = '$gid'" echo "Повне ім'я = '$name'" echo "Домашній каталог = '$home'" echo "Shell = '$shell'"

ще

echo "Немає такого користувача '$user_name'" >&2 вихід 1

fi


Цей сценарій пропонує користувачеві ввести ім’я користувача облікового запису в системі, а потім відображає різні поля, знайдені в записі користувача в / etc / passwd файл. Сценарій містить дві цікаві рядки. Перший це:

file_info=$(grep "^$user_name:" $FILE)

Цей рядок присвоює результати a GREP команду до змінної інформація про файл. Регулярний вираз, який використовується GREP гарантує, що ім’я користувача відповідатиме лише одному рядку в / etc / passwd файлу.

Другий цікавий рядок:

IFS=":" прочитати користувача pw uid gid ім'я домашньої оболонки <<< "$file_info"

Рядок складається з трьох частин: присвоєння змінної, а зчитування команду зі списком імен змінних як аргументів і дивним новим оператором перенаправлення. Спочатку ми розглянемо призначення змінної.

Оболонка дозволяє присвоювати одне або кілька змінних безпосередньо перед командою. Ці призначення змінюють середовище для наступної команди. Дія доручення тимчасова; лише зміна середовища на час дії команди. У нашому випадку значення IFS змінюється на символ двокрапки. З іншого боку, ми могли б закодувати це таким чином:

OLD_IFS="$IFS" IFS=":"

прочитати користувача pw uid gid ім'я домашня оболонка <<< "$file_info" IFS="$OLD_IFS"

де ми зберігаємо значення IFS, призначити нове значення, виконати зчитування команду, а потім відновіть IFS до його первісної вартості. Зрозуміло, розміщуючи присвоювання змінної перед


команда — це більш стислий спосіб зробити те саме.

Команда << оператор вказує a тут рядок. Рядок тут схожий на документ тут, тільки коротший, що складається з одного рядка. У нашому прикладі рядок даних з

Файл /etc/passwd подається на стандартний вхід команди read. Ми можемо виграти -

чому був обраний цей досить косий метод, а не:

echo "$file_info" | IFS=":" читання користувача pw uid gid ім'я домашньої оболонки

зображення

Ну, є причина...


Ти не вмієш читати

У той час як зчитування команда зазвичай приймає вхід зі стандартного введення, ви не можете зробити це:

echo "foo" | читати

Ми очікували, що це спрацює, але це не так. Здається, що команда буде успішною, але ВІДПОВІДЬ змінна завжди буде порожньою. Чому це?

Пояснення пов’язано з тим, як оболонка обробляє конвеєри. в бити (та інші оболонки, такі як sh), трубопроводи створюють підшах. Це копії оболонки та її середовища, які використовуються для виконання команди в конвеєрі. У нашому прикладі вище, зчитування виконується у підоболонці.

Підоболонки в Unix-подібних системах створюють копії середовища для використання процесами під час їх виконання. Коли процеси закінчуються, копія середовища знищується. Це означає що підоболонка ніколи не може змінити середовище свого батьківського процесу. зчитування призначає змінні, які потім стають частиною середовища. У наведеному вище прикладі зчитування призначає значення “foo” змінній ПОВТОРІТЬ в середовищі його підоболонки, але коли команда виходить, підоболонка та її середовище знищуються, і ефект призначення втрачається.

Використання тут рядків є одним із способів обійти цю поведінку. Інший метод обговорюється в розділі 36.


Найпопулярніші хмарні обчислення ОС на OnWorks: