2016-02-28 2 views
2

Я хочу предсказать следующий UID перед созданием нового пользователя. Поскольку новый будет принимать наибольшее значение идентификатора еще и добавляет к нему 1, я думал о следующем сценарии:Как извлечь наибольшее значение UID из/etc/passwd?

biggestID=0 
cat /etc/passwd | while read line 
do 
if test [$(echo $line | cut -d: -f3) > $biggestID] 
then 
biggestID=$(echo $line | cut -d: -f3) 
fi 
echo $biggestID 
done 
let biggestID=$biggestID+1 
echo $biggestID 

В результате я получаю 1. Это смутило меня, и я подумал, что проблема связана с циклом, поэтому я добавил echo $biggestID чуть ниже fi, чтобы проверить, действительно ли его значение меняется, и оказалось, что в цикле нет проблем, так как я получил много значений до 1000. Итак, почему значение biggestID возвращается к 0 после цикла?

+0

Возможный дубликат [Как я могу добавить номера в Баш скрипт] (http://stackoverflow.com/questions/6348902/how-can-i-add-numbers-in-a-bash-script) – tddmonkey

+0

Предположим, у вас есть строка типа 'nobody: x: 65534: 65533: nobody:/​​var/lib/nobody:/​​bin/bash' и вы хотите пропустить этот. –

ответ

2

Это из-за этой линии:

cat /etc/passwd | while read line

Это запускает while цикл в суб-оболочки, так biggestID создается в суб-оболочки, а не в родительской оболочке.

Если вы измените свой цикл в дальнейшем он будет работать:

while read line 
... 
done < /etc/passwd 

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

+1

Случай * Бесполезное использование кошки считается вредным * :-) – Jens

1

Вы можете изменить программу, чтобы что-то вроде этого:

newID=$(($(cut -d: -f3 /etc/passwd | sort -n | tail -n 1) +1)) 
echo $newID 
  • cut -d: -f3 /etc/passwd| sort -n | tail -n 1 получает наибольшее значение из третьего поля в PASSWD
  • $(...) стендов для результата команды, здесь самый большой ид
  • newID=$((... + 1)) добавить 1 и сохраняет результат в NewID
1

С AWK вы делаете все расчеты в одной программе:

awk -F: 'BEGIN {maxuid=0;} {if ($3 > maxuid) maxuid=$3;} END {print maxuid+1;}' /etc/passwd 

Если вы не хотите, чтобы начать с AWK все же, некоторую обратную связь на ваш код.

biggestID=0 
# Do not use cat .. but while .. do .. done < input (do not open subshell) 
# Use read -r line (so line is taken literally) 
cat /etc/passwd | while read line 
do 
    # Do not calculate the uid twice (in test and assignment) but store in var 
    # uid=$(cut -d: -f3 <<< "${line}") 
    # Use space after "[" and before "]" 
    # test is not needed, if [ .. ] already implicit says so 
    # (I only use test for onelines like "test -f file || errorfunction") 
    if test [$(echo $line | cut -d: -f3) > $biggestID] 
    then 
     biggestID=$(echo $line | cut -d: -f3) 
    fi 
    # Next line only for debugging 
    echo $biggestID 
done 
# You can use ((biggestID = biggestID + 1)) 
# or (when adding one) 
# ((++biggestID)) 
let biggestID=$biggestID+1 
# Use double quotes to get the contents literally, and curly brackets 
# for a nice style (nothing strang will happen if you add _happy right after the var) 
# echo "${biggestID}" 
echo $biggestID 

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

  • Нет связанных вопросов^_^