2013-11-07 2 views
0

У меня, похоже, возникают проблемы с куском кода, который я пишу (по крайней мере, я думаю, так или иначе). Это скрипт, который анализирует текстовый файл test3_data.txt с кучей идентификаторов пользователей в них и помещает эти идентификаторы пользователя в переменную с именем «USER_ID». Затем я проверяю, есть ли у них домашний каталог с любым текстом в переменной USER_ID. Если это так, он удаляет пользователя из системы вместе со своими файлами, домашним каталогом и т. Д. Скрипт отлично работает, но когда он выполняется, отображаются страницы man для команды userdel. Стоит ли вообще останавливаться на этом? Их что-то не так с моим кодом? Благодаря! и вот мой код.Персональные страницы, появляющиеся в конце сценария sh.

!/bin/sh 

while read IN_RECORD 
do 


#Variable that reads user id 

USER_ID=`echo $IN_RECORD |cut -d'|' -f1` 

#Remove added users from data file. 

test -d /home/{$USER_ID} 

if [ "$?" = "1" ]; 
then 
userdel -r $USER_ID 
fi 

done < test3_data.txt 

ответ

5

ряд вещей неправильно с вашего сценария:

  • притон линии следует читать #!/bin/sh (отсутствует #) или #!/usr/bin/env sh

  • переменная ссылка {$USER_ID} не то, что вы предназначено - ${USER_ID} - правильная форма (обычно достаточно всего $USER_ID).

  • Вы ошибочно проверяете на успех: это код выхода , а не 1, что указывает на успех. Кроме того, в сценарии bash вы должны использовать [[ вместо устаревших [ для тестов. (*)

Одно из возможных объяснений для командной строки помощи (не на странице человека), показывающий, что это $USER_ID пусто - в результате недопустимый синтаксис затем вызывает userdel утилиты, чтобы показать его командную строку помощи.

Наконец, есть способы оптимизации вашего сценария:

  • заявление окончания ; только необходим, если вы размещаете больше заявления на одной линии.

  • Ваш тест могут быть объединены в один оператор: if [ -d "/home/$USER_ID" ]; then

(*): Как @thom указывает, [ и test еще имеют место, если ваш сценарий должен оставаться POSIX-совместимыми. В отличие от этого, в сценарии, специфичном для bash, предпочтительнее [[, поскольку его удобнее использовать и имеет больше возможностей, чем [ - см. http://mywiki.wooledge.org/BashFAQ/031.
Обратите внимание, что строка shebang OP указывает sh - что может или не может привести к обработке bash в зависимости от платформы.

+0

спасибо. У меня на самом деле было # в #!/Bin/sh, но по какой-то причине он не копировался здесь. Благодарим вас за исправление меня в переменной. Хотя я не понимаю, как переменная может быть пустой? Скрипт работает правильно и успешно удаляет файлы/каталоги (в зависимости от того, что находится в этой переменной). – mcgovernmatt

+0

Ударьте это ... Я еще раз пересмотрел свой код и забыл что-то изменить. Теперь он отлично работает. Спасибо снова! – mcgovernmatt

+1

О '[['. В последнее время я немного зациклен на слово «устаревшее». Хороший совет, чтобы прочитать это: http: // stackoverflow.com/questions/669452/is-preferable-over-in-bash-скрипты, которые дают некоторую пищу для размышлений. Затем определите свой стиль кодирования. – thom

Смежные вопросы