Users create script from CSV file

The name of the pictureThe name of the pictureThe name of the pictureClash Royale CLAN TAG#URR8PPP








up vote
3
down vote

favorite












Im trying to get this script working but what I get is:




14: Syntax error: "(" unexpected (expecting "fi").




Hope you guys can solve my problem because it's been a while Im looking into the error...
If you need the .csv file let me know.



Here is the script:



#!/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






share|improve this question


















  • 1




    the last fi in last line is extar I think
    – Î±Ò“sнιη
    May 24 at 6:28















up vote
3
down vote

favorite












Im trying to get this script working but what I get is:




14: Syntax error: "(" unexpected (expecting "fi").




Hope you guys can solve my problem because it's been a while Im looking into the error...
If you need the .csv file let me know.



Here is the script:



#!/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






share|improve this question


















  • 1




    the last fi in last line is extar I think
    – Î±Ò“sнιη
    May 24 at 6:28













up vote
3
down vote

favorite









up vote
3
down vote

favorite











Im trying to get this script working but what I get is:




14: Syntax error: "(" unexpected (expecting "fi").




Hope you guys can solve my problem because it's been a while Im looking into the error...
If you need the .csv file let me know.



Here is the script:



#!/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






share|improve this question














Im trying to get this script working but what I get is:




14: Syntax error: "(" unexpected (expecting "fi").




Hope you guys can solve my problem because it's been a while Im looking into the error...
If you need the .csv file let me know.



Here is the script:



#!/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








share|improve this question













share|improve this question




share|improve this question








edited May 24 at 6:24









Vlad Spirin

3203417




3203417










asked May 24 at 3:13









Elio Basciani

183




183







  • 1




    the last fi in last line is extar I think
    – Î±Ò“sнιη
    May 24 at 6:28













  • 1




    the last fi in last line is extar I think
    – Î±Ò“sнιη
    May 24 at 6:28








1




1




the last fi in last line is extar I think
– Î±Ò“sнιη
May 24 at 6:28





the last fi in last line is extar I think
– Î±Ò“sнιη
May 24 at 6:28











1 Answer
1






active

oldest

votes

















up vote
5
down vote



accepted










Simply remove the very last line in your script (also it helps to do a proper indentation to see your errors). Also you forgot to end your last for loop with a done:



#!/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."


Up to that I can really advise you to use something like shellcheck on your script ( you can get it from the normal Ubuntu universe repositories).



sudo apt update
sudo apt install shellcheck


It outputs a lot more you can do better on your script:



$ 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 $?.


Alternatively, use the online shellcheck tool...






share|improve this answer






















  • upvoted for the recommendation of shellcheck. Nice tool!
    – muclux
    May 24 at 7:54











  • @muclux You're welcome.
    – Videonauth
    May 24 at 10:39










  • Hello, thanka lot for the tips, really appreciated.
    – Elio Basciani
    May 24 at 23:16










  • If my answer solved your problem, you can mark it as accepted by clicking the checkmark beside it.
    – Videonauth
    May 24 at 23:17










  • Yes I know but I still have a problem and I was going to write it in another post.
    – Elio Basciani
    May 24 at 23:19











Your Answer







StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "89"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);

else
createEditor();

);

function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
convertImagesToLinks: true,
noModals: false,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);



);








 

draft saved


draft discarded


















StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2faskubuntu.com%2fquestions%2f1039630%2fusers-create-script-from-csv-file%23new-answer', 'question_page');

);

Post as a guest






























1 Answer
1






active

oldest

votes








1 Answer
1






active

oldest

votes









active

oldest

votes






active

oldest

votes








up vote
5
down vote



accepted










Simply remove the very last line in your script (also it helps to do a proper indentation to see your errors). Also you forgot to end your last for loop with a done:



#!/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."


Up to that I can really advise you to use something like shellcheck on your script ( you can get it from the normal Ubuntu universe repositories).



sudo apt update
sudo apt install shellcheck


It outputs a lot more you can do better on your script:



$ 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 $?.


Alternatively, use the online shellcheck tool...






share|improve this answer






















  • upvoted for the recommendation of shellcheck. Nice tool!
    – muclux
    May 24 at 7:54











  • @muclux You're welcome.
    – Videonauth
    May 24 at 10:39










  • Hello, thanka lot for the tips, really appreciated.
    – Elio Basciani
    May 24 at 23:16










  • If my answer solved your problem, you can mark it as accepted by clicking the checkmark beside it.
    – Videonauth
    May 24 at 23:17










  • Yes I know but I still have a problem and I was going to write it in another post.
    – Elio Basciani
    May 24 at 23:19















up vote
5
down vote



accepted










Simply remove the very last line in your script (also it helps to do a proper indentation to see your errors). Also you forgot to end your last for loop with a done:



#!/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."


Up to that I can really advise you to use something like shellcheck on your script ( you can get it from the normal Ubuntu universe repositories).



sudo apt update
sudo apt install shellcheck


It outputs a lot more you can do better on your script:



$ 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 $?.


Alternatively, use the online shellcheck tool...






share|improve this answer






















  • upvoted for the recommendation of shellcheck. Nice tool!
    – muclux
    May 24 at 7:54











  • @muclux You're welcome.
    – Videonauth
    May 24 at 10:39










  • Hello, thanka lot for the tips, really appreciated.
    – Elio Basciani
    May 24 at 23:16










  • If my answer solved your problem, you can mark it as accepted by clicking the checkmark beside it.
    – Videonauth
    May 24 at 23:17










  • Yes I know but I still have a problem and I was going to write it in another post.
    – Elio Basciani
    May 24 at 23:19













up vote
5
down vote



accepted







up vote
5
down vote



accepted






Simply remove the very last line in your script (also it helps to do a proper indentation to see your errors). Also you forgot to end your last for loop with a done:



#!/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."


Up to that I can really advise you to use something like shellcheck on your script ( you can get it from the normal Ubuntu universe repositories).



sudo apt update
sudo apt install shellcheck


It outputs a lot more you can do better on your script:



$ 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 $?.


Alternatively, use the online shellcheck tool...






share|improve this answer














Simply remove the very last line in your script (also it helps to do a proper indentation to see your errors). Also you forgot to end your last for loop with a done:



#!/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."


Up to that I can really advise you to use something like shellcheck on your script ( you can get it from the normal Ubuntu universe repositories).



sudo apt update
sudo apt install shellcheck


It outputs a lot more you can do better on your script:



$ 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 $?.


Alternatively, use the online shellcheck tool...







share|improve this answer














share|improve this answer



share|improve this answer








edited May 25 at 18:22









Fabby

23.7k1351147




23.7k1351147










answered May 24 at 6:29









Videonauth

21.7k116495




21.7k116495











  • upvoted for the recommendation of shellcheck. Nice tool!
    – muclux
    May 24 at 7:54











  • @muclux You're welcome.
    – Videonauth
    May 24 at 10:39










  • Hello, thanka lot for the tips, really appreciated.
    – Elio Basciani
    May 24 at 23:16










  • If my answer solved your problem, you can mark it as accepted by clicking the checkmark beside it.
    – Videonauth
    May 24 at 23:17










  • Yes I know but I still have a problem and I was going to write it in another post.
    – Elio Basciani
    May 24 at 23:19

















  • upvoted for the recommendation of shellcheck. Nice tool!
    – muclux
    May 24 at 7:54











  • @muclux You're welcome.
    – Videonauth
    May 24 at 10:39










  • Hello, thanka lot for the tips, really appreciated.
    – Elio Basciani
    May 24 at 23:16










  • If my answer solved your problem, you can mark it as accepted by clicking the checkmark beside it.
    – Videonauth
    May 24 at 23:17










  • Yes I know but I still have a problem and I was going to write it in another post.
    – Elio Basciani
    May 24 at 23:19
















upvoted for the recommendation of shellcheck. Nice tool!
– muclux
May 24 at 7:54





upvoted for the recommendation of shellcheck. Nice tool!
– muclux
May 24 at 7:54













@muclux You're welcome.
– Videonauth
May 24 at 10:39




@muclux You're welcome.
– Videonauth
May 24 at 10:39












Hello, thanka lot for the tips, really appreciated.
– Elio Basciani
May 24 at 23:16




Hello, thanka lot for the tips, really appreciated.
– Elio Basciani
May 24 at 23:16












If my answer solved your problem, you can mark it as accepted by clicking the checkmark beside it.
– Videonauth
May 24 at 23:17




If my answer solved your problem, you can mark it as accepted by clicking the checkmark beside it.
– Videonauth
May 24 at 23:17












Yes I know but I still have a problem and I was going to write it in another post.
– Elio Basciani
May 24 at 23:19





Yes I know but I still have a problem and I was going to write it in another post.
– Elio Basciani
May 24 at 23:19













 

draft saved


draft discarded


























 


draft saved


draft discarded














StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2faskubuntu.com%2fquestions%2f1039630%2fusers-create-script-from-csv-file%23new-answer', 'question_page');

);

Post as a guest













































































Popular posts from this blog

Which professions warranted travel in Medieval times?

How do so many people here on Academia.SE, and in general, afford lavish higher education programs?

Trouble downloading packages list due to a “Hash sum mismatch” error