Пользователи создают сценарий из файла CSV

Я пытаюсь получить эту работу сценария, но что я получаю:

14: Синтаксическая ошибка: "(" неожиданный (ожидание "fi").

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

Вот сценарий:

#!/bin/bash
filein="proyecto3.csv"
IFS=$'\n'
if [ ! -f "$filein" ]
then
echo "Cannot find file $filein"
else
  groups=(`cut -d: -f 6 "$filein" | sed 's/ //'`)
  fullnames=(`cut -d: -f 1 "$filein"`)
  userid=(`cut -d: -f 2 "$filein"`)
  usernames=(`cut -d: -f 1 "$filein" | tr [A-Z] [a-z] | awk '{print substr($1,1,1) $2}'`)
fi
for group in ${groups[*]}
do
grep -q "^$group" /etc/group ; let x=$?
if [ $x -eq 1 ]
then
groupadd "$group"
fi
done
  x=0
  created=0
for user in ${usernames[*]}
do
useradd -n -c ${fullnames[$x]} -g "${groups[$x]}" $user 2> /dev/null
if [ $? -eq 0 ]
then
let created=$created+1
fi
echo "${usernames[$x]}" | passwd --stdin "$user" > /dev/null
echo "Complete. $created accounts have been created."
fi
3
задан 24 May 2018 в 09:24

1 ответ

Просто удалите самую последнюю строку в своем сценарии (также это помогает сделать надлежащее добавление отступа для наблюдения ошибок). Также Вы забыли заканчивать свое последнее для цикла со сделанным:

#!/bin/bash
filein="proyecto3.csv"
IFS=$'\n'

if [ ! -f "$filein" ]
then
    echo "Cannot find file $filein"
else
    groups=(`cut -d: -f 6 "$filein" | sed 's/ //'`)
    fullnames=(`cut -d: -f 1 "$filein"`)
    userid=(`cut -d: -f 2 "$filein"`)
    usernames=(`cut -d: -f 1 "$filein" | tr [A-Z] [a-z] | awk '{print substr($1,1,1) $2}'`)
fi

for group in ${groups[*]}
do
    grep -q "^$group" /etc/group ; let x=$?
    if [ $x -eq 1 ]
    then
        groupadd "$group"
    fi
done

x=0 #not sure why you reset x here to zero !?
created=0

for user in ${usernames[*]}
do
    useradd -n -c ${fullnames[$x]} -g "${groups[$x]}" $user 2> /dev/null
    if [ $? -eq 0 ]
    then
        let created=$created+1
    fi
done

echo "${usernames[$x]}" | passwd --stdin "$user" > /dev/null
echo "Complete. $created accounts have been created."

До этого я могу действительно советовать Вам использовать что-то как shellcheck на Вашем сценарии (можно получить его из нормальных репозиториев вселенной Ubuntu).

sudo apt update
sudo apt install shellcheck

Это производит намного больше, можно добиться большего успеха на сценарии:

$ shellcheck test.sh

In test.sh line 9:
    groups=(`cut -d: -f 6 "$filein" | sed 's/ //'`)
            ^-- SC2006: Use $(..) instead of legacy `..`.


In test.sh line 10:
    fullnames=(`cut -d: -f 1 "$filein"`)
               ^-- SC2006: Use $(..) instead of legacy `..`.


In test.sh line 11:
    userid=(`cut -d: -f 2 "$filein"`)
    ^-- SC2034: userid appears unused. Verify it or export it.
            ^-- SC2006: Use $(..) instead of legacy `..`.


In test.sh line 12:
    usernames=(`cut -d: -f 1 "$filein" | tr [A-Z] [a-z] | awk '{print substr($1,1,1) $2}'`)
               ^-- SC2006: Use $(..) instead of legacy `..`.
                                            ^-- SC2060: Quote parameters to tr to prevent glob expansion.
                                                  ^-- SC2060: Quote parameters to tr to prevent glob expansion.


In test.sh line 29:
    useradd -n -c ${fullnames[$x]} -g "${groups[$x]}" $user 2> /dev/null
                  ^-- SC2086: Double quote to prevent globbing and word splitting.
                                                      ^-- SC2086: Double quote to prevent globbing and word splitting.


In test.sh line 30:
    if [ $? -eq 0 ]
         ^-- SC2181: Check exit code directly with e.g. 'if mycmd;', not indirectly with $?.

С другой стороны, используйте shellcheck инструмент онлайн...

6
ответ дан 1 December 2019 в 15:21

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

Похожие вопросы: