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   -   Original Discussion by anaigini45
anaigini45's Unix or Linux Image
anaigini45 anaigini45 is offline
Registered User
 
Join Date: Oct 2009
Last Activity: 18 January 2018, 9:12 AM EST
Posts: 102
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   -   Original Discussion by anaigini45
cero's Unix or Linux Image
cero cero is offline
Registered User
 
Join Date: Aug 2006
Last Activity: 19 January 2018, 5:58 AM EST
Posts: 462
Thanks: 4
Thanked 101 Times in 93 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   -   Original Discussion by anaigini45
anaigini45's Unix or Linux Image
anaigini45 anaigini45 is offline
Registered User
 
Join Date: Oct 2009
Last Activity: 18 January 2018, 9:12 AM EST
Posts: 102
Thanks: 4
Thanked 0 Times in 0 Posts
Thanks! That did the trick!
    #4  
Old Unix and Linux 04-19-2017   -   Original Discussion by anaigini45
rbatte1's Unix or Linux Image
rbatte1 rbatte1 is offline Forum Staff  
Root armed
 
Join Date: Jun 2007
Last Activity: 19 January 2018, 12:39 PM EST
Location: Lancashire, UK
Posts: 3,441
Thanks: 1,493
Thanked 671 Times in 604 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   -   Original Discussion by anaigini45
MadeInGermany's Unix or Linux Image
MadeInGermany MadeInGermany is offline Forum Staff  
Moderator
 
Join Date: May 2012
Last Activity: 20 January 2018, 3:48 PM EST
Location: Simplicity
Posts: 3,945
Thanks: 334
Thanked 1,319 Times in 1,189 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   -   Original Discussion by anaigini45
anaigini45's Unix or Linux Image
anaigini45 anaigini45 is offline
Registered User
 
Join Date: Oct 2009
Last Activity: 18 January 2018, 9:12 AM EST
Posts: 102
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 06:12 AM..
Sponsored Links
    #7  
Old Unix and Linux 05-05-2017   -   Original Discussion by anaigini45
RudiC's Unix or Linux Image
RudiC RudiC is offline Forum Staff  
Moderator
 
Join Date: Jul 2012
Last Activity: 20 January 2018, 4:51 PM EST
Location: Aachen, Germany
Posts: 11,962
Thanks: 353
Thanked 3,688 Times in 3,386 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 04:29 AM
Error Executing the script. pinga123 UNIX for Dummies Questions & Answers 5 07-08-2010 08:02 AM
Error while executing the below script chinniforu2003 Shell Programming and Scripting 3 11-09-2009 04:43 PM
Error while executing a script shwetainnani Shell Programming and Scripting 15 10-09-2009 10:12 AM
error while executing the script dsdev_123 Shell Programming and Scripting 2 03-30-2009 06:46 PM



All times are GMT -4. The time now is 09:05 PM.