The problem statement, all variables and given/known data:
I have to make a script that will copy the contents of a already created folder to 3 others that are not created yet. The problem is that I cant create them so i get an error message for the folders that dont exist. If the total files are not 4 display an error message
The attempts at a solution (include all code and scripts):
if ( test $# -eq 4)
echo "Enter 4 files"
read $1 $2 $3 $4
then
touch $2
touch $3
otuch $4
cp $1 $2
cp $1 $3
cp $1 $4
else echo " Need exactly four parameters, sorry. "
fi
Complete Name of School (University), City (State), Country, Name of Professor, and Course Number (Link to Course):
PAPI , Chania ,Greece, Varos CS1111
The lines which I've coloured red are contradictory. $1, $2, $3.... are positional parameters. You can't read values into them that way.
Your requirement was to create directories, not files, right? touch is used to change a file's access and modification time. If file doesn't exist, it creates them.
Try the below script. Let us know if you have any questions.
Please use code tags.
$ cat test.sh
#! /bin/bash
echo "Enter 4 dir names (1st is source. Next 3 are target dirs): "
read a b c d
for x in $b $c $d
do
if [ ! -d $x ]
then
mkdir $x
cp -r ./$a/* ./$x/
else
cp -r ./$a/* ./$x/
fi
done
$
$ ./test.sh
Enter 4 dir names (1st is source. Next 3 are target dirs):
test test1 test2 test3
$
$ ls -l
drw-r--r-- 3 root root 4096 Jan 24 06:27 test
drwxr-xr-x 3 root root 4096 Feb 2 04:55 test1
drwxr-xr-x 3 root root 4096 Feb 2 04:55 test2
drwxr-xr-x 3 root root 4096 Feb 2 04:55 test3
'test' was an already existing dir. test1, test2, test3 are newly created dirs, which contains all of the data contained in 'test'
#! /bin/bash
if [ $# -ne 4 ] # If number of positional parameters are not equal to 4,
then # Print warn msg and exit.
echo "Need exactly 4 parameters. Exiting."
exit
fi
for x in $2 $3 $4
do
if [ -e $x ] # If target file exists, delete it.
then # Even otherwise, cp would overwrite it.
rm -f $x # Some systems have an alias for cp as "cp -i".
fi # So cp would prompt the user if the target file needs can be over-written.
cp $1 $x # Same thing is achieved here by deleting and creating a fresh copy.
done
How to use:
$./test.sh src.txt tgt1.txt tgt2.txt tgt3.txt
$
$ ls -l *.txt
-rw-r--r-- 1 root root 12 Feb 2 12:46 src.txt
-rw-r--r-- 1 root root 12 Feb 2 12:46 tgt1.txt
-rw-r--r-- 1 root root 12 Feb 2 12:46 tgt2.txt
-rw-r--r-- 1 root root 12 Feb 2 12:46 tgt3.txt
No point learning about this one.
The parameter count checking bit of the script does not work at all. if (test $# -eq 4) does nothing except execute an irrelevant "test" in a subshell and ignore the result (which is good I suppose because $# has value zero at that moment).
The script collapses in a heap of "cp" errors if you just press return in response to the question.