Unix/Linux Go Back    


Red Hat Red Hat is the world's leading open source technology solutions provider with offerings including Red Hat Enterprise Linux (RHEL), Fedora, open source applications, security and systems management, virtualization, and Services Oriented Architecture (SOA) solutions.

Error when executing script

Red Hat


Reply    
 
Thread Tools Search this Thread Display Modes
    #1  
Old Unix and Linux 04-19-2017
anaigini45 anaigini45 is offline
Registered User
 
Join Date: Oct 2009
Last Activity: 21 July 2017, 6:02 AM EDT
Posts: 84
Thanks: 4
Thanked 0 Times in 0 Posts
Error when executing script

Hi,

I wrote this script to test if the output for DIR1 and DIR2 comes out as I want :


Code:
#!/bin/bash

DAY=$(date +%d)
MONTH=$(date +%b)
YEAR=$(date +%Y)
DIR1=$($MONTH$YEAR"_Blast_BC01")
DIR2=$($MONTH$YEAR"_Blast_BC15")

echo $DIR1
echo $DIR2

This is the output I want for echo $DIR1 : Apr2017_Blast_BC01
And this is the output I want for echo $DIR2 : Apr2017_Blast_BC15

This is the error I get when I execute the script :


Code:
[root@L28tstream1 ~]# ./script3.sh
./script3.sh: line 6: Apr2017_Blast_BC01: command not found
./script3.sh: line 7: Apr2017_Blast_BC15: command not found

What is wrong with the syntax in the script above?
Sponsored Links
    #2  
Old Unix and Linux 04-19-2017
cero cero is offline
Registered User
 
Join Date: Aug 2006
Last Activity: 28 July 2017, 9:46 AM EDT
Posts: 454
Thanks: 4
Thanked 99 Times in 91 Posts
Hi,

the construct $(command) is called command substitution and evaluates to the output of command and you use it correctly for the assignment of the variables DAY, MONTH and YEAR. You do not want to use command substitution when you assign the values for DIR1 and DIR2.

Code:
#!/bin/bash

DAY=$(date +%d)
MONTH=$(date +%b)
YEAR=$(date +%Y)
DIR1=$MONTH$YEAR"_Blast_BC01"
DIR2=$MONTH$YEAR"_Blast_BC15"

echo $DIR1
echo $DIR2

Sponsored Links
    #3  
Old Unix and Linux 04-19-2017
anaigini45 anaigini45 is offline
Registered User
 
Join Date: Oct 2009
Last Activity: 21 July 2017, 6:02 AM EDT
Posts: 84
Thanks: 4
Thanked 0 Times in 0 Posts
Thanks! That did the trick!
    #4  
Old Unix and Linux 04-19-2017
rbatte1 rbatte1 is online now Forum Staff  
Root armed
 
Join Date: Jun 2007
Last Activity: 28 July 2017, 10:43 AM EDT
Location: Lancashire, UK
Posts: 3,182
Thanks: 1,345
Thanked 608 Times in 550 Posts
It would be safer to wrap the entire assignment in double quotes as a common practice so that if you accidentally assign a space to either variable, then the assignment to DIR1 or DIR2 will not fail:-

Code:
HI_VAR="TextOnly"
LO_VAR="Text and space"

MY_VAR1="${HI_VAR}${LO_VAR}_other_text"
MY_VAR2=${HI_VAR}${LO_VAR}"_other_text"       # May fail in some shells

I always clearly mark the variable name with curly braces { & } to ensure I don't confuse the variable with any literal text or underscores that follow. You can get trapped with things like this:-
Code:
/home/rbatte1> V1="Hello"
/home/rbatte1> V2="$V1_Goodbye"
/home/rbatte1> echo "\$V2=\"$V2\""
$V2=""

This is because the assignment is looking for variable V1_Goodbye (equivalent to ${V1_Goodbye} ) which has not been set.

I would also suggest that you could consolidate commands such that you just do this:-
Code:
MONTHYEAR=$(date +%b%Y)
DIR1="${MONTHYEAR}_Blast_BC01"

Of course, it depends what you use the values for elsewhere.



I hope that this helps,
Robin
Sponsored Links
    #5  
Old Unix and Linux 04-19-2017
MadeInGermany MadeInGermany is offline Forum Advisor  
Registered User
 
Join Date: May 2012
Last Activity: 27 July 2017, 10:45 PM EDT
Location: Simplicity
Posts: 3,642
Thanks: 285
Thanked 1,217 Times in 1,100 Posts
Yes, a consolidation makes sense.

Code:
MONTHYEAR=$(date +%b%Y)
DIR1=${MONTHYEAR}_Blast_BC01
DIR2=${MONTHYEAR}_Blast_BC15

""Quoting of variables is never a mistake. Especially beginners should do it always!
But - now for the advanced user - the quoting of an assignment value is only needed if there is a literal space.

Code:
DIR3="${MONTHYEAR} Blast BC15"
echo "$DIR3"

Not if the space comes from a variable

Code:
NAME="Blast BC15 *"
DIR3=${MONTHYEAR}_$NAME
echo "$DIR3"

The latter is not an assignment - the argument for the echo command must be quoted!
Other

Code:
case ${MONTHYEAR}_$NAME in ...


Code:
[[ ${MONTHYEAR}_$NAME ... ]]

In all other cases the shell does first variable substitution then word splitting then globbing.
Last but not least, the [ ] is a false friend:

Code:
[ "${MONTHYEAR}_$NAME" ... ]

In fact the [ is a command and its arguments must be quoted!
Sponsored Links
    #6  
Old Unix and Linux 05-05-2017
anaigini45 anaigini45 is offline
Registered User
 
Join Date: Oct 2009
Last Activity: 21 July 2017, 6:02 AM EDT
Posts: 84
Thanks: 4
Thanked 0 Times in 0 Posts
I have another question on command substitution.
The same script, but different command substitution.

I simply run this command from the terminal :


Code:
[root@L28tstream1 emokheng]# stat -c %z * | awk '{print $1}'
2015-08-18
2015-08-18
[root@L28tstream1 emokheng]#

As you see, I get the dates of the file generated in the directory.

However, when I attempt to use this command as a substitute, like this, I get a diferent output :


Code:
[root@L28tstream1 emokheng]# D=$(stat -c %z * | awk '{print $1}')
[root@L28tstream1 emokheng]# echo $D
2015-08-18 2015-08-18

It all displays in one line. Why is this, and how do I get it to display in two separate lines like the command above this?

Actually the main output I want is to get ONLY the day section of the whole date. Means I want to extract only '18' from 2015-08-18. This is for all the files in the directory.
Therefore, I use this command :


Code:
[root@L28tstream1 emokheng]# FDAY=$(date -d "$D" '+%d')
date: invalid date `2015-08-18\n2015-08-18'
[root@L28tstream1 emokheng]#

However, as you can see, the error is shown. Perhaps if
Code:
echo $D

displays two separate lines, the error above will not happen?

How do I display ONLY the day part of the whole date for a file in a directory?

Last edited by anaigini45; 05-05-2017 at 05:12 AM..
Sponsored Links
    #7  
Old Unix and Linux 05-05-2017
RudiC RudiC is offline Forum Staff  
Moderator
 
Join Date: Jul 2012
Last Activity: 27 July 2017, 4:41 PM EDT
Location: Aachen, Germany
Posts: 11,067
Thanks: 284
Thanked 3,412 Times in 3,142 Posts
The -d option of date takes one single date only, not several separated by a line feed char. How about

Code:
D="$(stat -c %z sh* | awk -F"[ -]" '{print $3}')"
echo "$D"
03
03

The Following User Says Thank You to RudiC For This Useful Post:
anaigini45 (05-05-2017)
Sponsored Links
Reply

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Linux More UNIX and Linux Forum Topics You Might Find Helpful
Thread Thread Starter Forum Replies Last Post
Error while executing a script samsungsamsung Shell Programming and Scripting 1 11-17-2010 03:29 AM
Error Executing the script. pinga123 UNIX for Dummies Questions & Answers 5 07-08-2010 07:02 AM
Error while executing the below script chinniforu2003 Shell Programming and Scripting 3 11-09-2009 03:43 PM
Error while executing a script shwetainnani Shell Programming and Scripting 15 10-09-2009 09:12 AM
error while executing the script dsdev_123 Shell Programming and Scripting 2 03-30-2009 05:46 PM



All times are GMT -4. The time now is 10:49 AM.