В чем проблема с моим «adduser» из другого файла bash script

Меня просят добавить некоторых пользователей со всей их информацией (пароль, идентификатор, идентификатор группы ...), присутствующей в данном файле. Всякий раз, когда я запускаю свой скрипт bash «gedit», он выдает мне сообщение о том, что «команда useradd не найдена». Если кто-нибудь может мне помочь, пожалуйста, это мой код:

       #!/bin/bash
choice=0
while [ $choice != "1" -a $choice != "2" -a $choice != "3" ]
do 
  echo "What do you want to do"
  echo "1-Add Users"
  echo "2-Remove users"
  echo "3-Update users"
  echo -n "Enter choice : "
  read choice
done

x=0
while [ $x -ne 1 ]
do
  echo -n "Donner le fichier :"
  read fichier
  if test -f $fichier              # check if file ficher exists
  then
    x=1
  else
  echo "File not found"  
  x=0
  fi
done

if [ $choice == "1" ]
  then

 FILE="user"
   USERNAME=$(cut -d ":" -f 1 $FILE)
   PASSWORD=$(cut -d ":" -f 2 $FILE)
   USER_ID=$(cut -d ":" -f 3 $FILE)
   GROUP_ID=$(cut -d ":" -f 4 $FILE)
   USER_INFO=$(cut -d ":" -f 5 $FILE)
   HOME_DIRECTORY=$(cut -d ":" -f 6 $FILE)
   SHELL=$(cut -d ":" -f 7 $FILE)
   MIN=$(cut -d ":" -f 8 $FILE)
   MAX=$(cut -d ":" -f 9 $FILE)
   INACTIVE=$(cut -d ":" -f 10 $FILE)
   WARNING=$(cut -d ":" -f 11 $FILE)
   
   useradd -m -c "${USERNAME}" "${PASSWORD}" "${USER_ID}" "${GROUP_ID}" "${USER_INFO}" "${HOME_DIRECTORY}" "${SHELL}" "${MIN}" "${MAX}" "${INACTIVE}" "${WARNING}"
fi

Для вызова скрипта я использую проект chmod u+x (имя файла gedit)

Отображаемое сообщение об ошибке:./project: строка 43: useradd: команда не найдена

Это содержимое входного файла «пользователь»:

      charbel:password:1001:1001:Charbel Haddad:/home/charbel:/bin/bash:0:30:15:7:y
assil:p@ssw0rd:1002:1002:Assil:/home/assel:/bin/bash:0:30:10:5:n
marwan:p@ssw0rd:1003:1003:Marwan Ghantous:/home/marwan:/bin/bash:0:50:30:7:n
michel:password:1004:1004:Michel:/home/michel:/bin/bash:1:30:10:5:y

1 ответ

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

      ...
if [ $choice = "1" ]   # notice also single = not ==
then
  while IFS=":" read -r username password user_id group_id \
              user_info home_dir shell min max inactive warning
  do
      useradd -m -c "$username" "$password" "$user_id" "$group_id" \
                    "$user_info" "$home_dir" "$shell" \
                    "$min" "$max" "$inactive" "$warning"
  done <"$fichier"
fi

Обратите также внимание, как можно разделить строку на поля, используя значение IFSв качестве разделителя полей и как мы избегаем использования верхнего регистра для наших частных переменных.(Я предполагаю, что вы забыли сообщить нам, что вам удалось перезаписать PATHслишком.)

Кроме того, whileЦикл ранее в скрипте тоже можно радикально упростить:

      while true
do
  read -p "Donner le fichier :" -r fichier
  test -f "$fichier" && break
  echo "$0: $fichier: file not found" >&2
done

Обратите внимание, как мы печатаем сообщение об ошибке в стандартную ошибку и включаем имя скрипта и имя файла, который мы не смогли найти, а также как readпозволяет распечатать подсказку с -p, и как мы в основном всегда цитируем переменные с именами файлов . Как правило, всегда используйте read -rесли вы специально не хотите, чтобы оболочка делала забавные вещи с обратной косой чертой (это устаревшее поведение для совместимости с оригинальной оболочкой Bourne).

Более подробно, когда вы читаете весь файл за один раз, вы запускаете командную строку

      useradd -m -c "charbel
assil
marwan
michel" "password 
p@ssw0rd
p@ssw0rd
password"

... и т. д. вместо запуска

      useradd -m -c "charbel" "password" "1001" "1001" "Charbel Haddad" "/home/charbel" "/bin/bash" "0" "30" "15" "7" "y"

отдельно, а затем

      useradd -m -c "assil" "p@ssw0rd" "1002" "1002" "Assil" "/home/assel" "/bin/bash" "0" "30" "10" "5" "n"

и т. д. с одной строкой ввода из файла за раз, что и while IFS=":" read -rпетля выше делает.

Другие вопросы по тегам