Использование grep в операторе if - PullRequest
0 голосов
/ 12 октября 2018

Моя цель - написать сценарий оболочки, чтобы вынуть пользователей, которых я уже отфильтровал, из файла и проверить, есть ли у этих пользователей определенная строка, и, если они есть, пометить их как основные, если нет, неосновные.Моя проблема связана с моим первым утверждением if, и я не уверен, является ли grep правильным способом для выражения if.Вот что у меня есть:

(
while read i
do


username=`echo $i | grep -v 'CMPSC 1513' | grep -P -v '(?!.*CPSMA 2923)CPSMA' | cut -d'|' -f2` 
fullname=`echo $i | grep -v 'CMPSC 1513' | grep -P -v '(?!.*CPSMA 2923)CPSMA' | cut -d'|' -f3`
id=`echo $i | grep -v 'CMPSC 1513' | grep -P -v '(?!.*CPSMA 2923)CPSMA' | cut -d'|' -f4`

if [ $username ]
then

if grep -q "|0510"
then 
    echo $username":(password):(UID):(GID):"$fullname"+"$id":/home/STUDENTS/majors:/bin/bash"
else 
    echo $username":(password):(UID):(GID):"$fullname"+"$id":/home/STUDENTS/nonmajors:/bin/bash"
fi      
fi

done
)<./cs_roster.txt

Просто некоторая информация, она содержится в цикле while.В цикле while я определяю, должен ли указанный в списке человек быть главным или неосновным, а мой if [$ username] был проверен и возвращает всех правильных пользователей.В этот момент цикл while выполняется только один раз, а затем останавливается.

Ответы [ 3 ]

0 голосов
/ 12 октября 2018

«Ожидается двоичный оператор», потому что вы вызываете команду [ с аргументами «grep» и «-q» (вы вообще не вызываете grep), а [ ожидает двоичный оператор, в котором выуказали -q.[ - это команда, которая обрабатывается не иначе, как grep или ls или cat.Лучше (IMO) записать его по буквам test, и при вызове с именем test не требуется, чтобы его последний аргумент был ].Если вы хотите использовать grep в операторе if, просто сделайте что-то вроде:

if echo "$username" | grep -q "|0510"; then ...

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

Основной синтаксис оператора if - if pipeline; then....В общем случае конвейером является простая команда test, и в какой-то момент в предыстории было принято решение предоставить имя [ для команды test с дополнительным предупреждением о том, что ее последний аргумент долженбыть ].Я считаю, что это было сделано для того, чтобы операторы выглядели более естественными, как если бы [ был оператором в языке.Просто игнорируйте [ и всегда используйте test, и вы избежите путаницы.

0 голосов
/ 13 октября 2018

Вы можете использовать этот код в качестве упражнения.Напишите для него скрипт awk или начните с чего-то вроде

while IFS='|' read -r f1 username fullname id otherfields; do
   # I don't know which field you want to test. I will rest with id
   if [[ $id =~ ^0510 ]]; then
      subdir=majors
   else
      subdir=nonmajors
   fi
   echo "${username}:(password):(UID):(GID):${fullname}+${id}:/home/STUDENTS/${subdir}:/bin/bash"
done < <( grep -v 'CMPSC 1513' ./cs_roster.txt | grep -P -v '(?!.*CPSMA 2923)CPSMA' )

Это удобно для изучения некоторого синтаксиса bash, но рассмотрите скрипт awk для избежания цикла while.

0 голосов
/ 12 октября 2018

Просто снимите квадратные скобки и передайте $i в grep:

if echo $i | grep -q "|0510"

В вашем примере кода grep не с чем работать.

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