≡ Menu

Bash: Assign Output of Shell Command To Variable

How do I assign the output of a shell command to a shell variable under Unix like operating system? For example, I want to store the date command output to a variable called $now. How do you do that?

You need to use command substitution feature of bash. It allows you to run a shell command and store its output to a variable. To assign output of any shell command to variable in bash, use the following command substitution syntax:
var=$(command-name-here arg1)
var=$(/path/to/command arg1 arg2)


var=`command-name-here arg1`
var=`/path/to/command arg1 arg2`

Do not put any spaces after the equals sign and command must be on right side of =. See how to assign values to shell variables for more information.


To store date command output to a variable called now, enter:




To display back result (or output stored in a variable called $now) use the echo or printf command:

echo "$now"


printf "%s\n" "$now"

Sample outputs:

Wed Apr 25 00:55:45 IST 2012

You can combine the echo command and shell variables as follows:

echo "Today is $now"

Sample outputs:

Today is Wed Apr 25 00:55:45 IST 2012

You can do command substitution in an echo command itself (no need to use shell variable):

echo "Today is $(date)"


printf "Today is %s\n" "$(date)"

Sample outputs:

Today is Wed Apr 25 00:57:58 IST 2011

See also:

Share this tutorial on:
{ 17 comments… add one }
  • John Eisenhower April 25, 2012, 10:56 pm

    They might want to add it .bash_profile so it is persistent across reboots. Such as;

    $ cat ~/.bash_profile
    alias ll=’ls -l’
    alias now=’date +%H:%M’
    $ now

  • Chris F.A. Johnson May 4, 2012, 5:31 pm

    Error: printf “%s\n” now

    Should be: printf “%s\n” “$now”

  • Amit June 12, 2013, 12:02 pm

    i m trying to kill a process running on port say 4723…by using command “kill `lsof -t -i:4723`”…..it works fine..but i need to pass variable in lsof command instead of giving directly 4723…like..

    var number = 4723;
    “kill `lsof -t -i:number`”
    is it possible…? and how..plz replyyy soon..thanks in advance


  • Ahmed Samir July 19, 2013, 1:59 pm

    this is very helpful thank you

  • Charly August 11, 2013, 6:55 am

    What about Piped command like
    droppedbyte=(iptables -L -v -n –line-number |grep DROP| awk ‘$1 = 5 {print $3}’)
    droppedbyte=`iptables -L -v -n –line-number |grep DROP| awk ‘$1 = 5 {print $3}’`
    Fail :(

    -bash: syntax error near unexpected token `|’

    This isn’t working because i used this “|”, need help

    • nixCraft August 11, 2013, 7:41 am


      droppedbyte="$(iptables -L -v -n --line-number | grep DROP | awk '$1 = 5 {print $3}')"
      echo "$droppedbyte"
      • Charly August 11, 2013, 8:28 am

        you are awesome :D

        This also worked.
        droppedbyte=`iptables -L -v -n –line-number |grep DROP| awk ‘$1 = 5 {print $3}’`

      • Vimjob October 30, 2013, 3:41 am

        Total shot in the dark Google search landed me here and this thing worked! Thanks a TON!

  • MattS September 30, 2013, 10:04 pm

    Thanks nixCraft — You just saved me a lot of time.

  • vignesh January 23, 2014, 5:59 pm


    Am stuck in a shell script that stores a value recrusively when it runs to a variable.
    when am running manually the value get stores but in crontab its not getting store.
    please help me in this, below is my script.

    rm /u01/oracle/sba81/nas_siebel_fs_prd1/Interfaces/Meridio/Outbound/out.csv
    a=`ls -lad /u01/oracle/sba81/nas_siebel_fs_prd1/Interfaces/Meridio/Outbound/Archive | head -1 | awk -F" " '{print $5}'`
    #echo "$a" >> /u01/oracle/sba81/nas_siebel_fs_prd1/Interfaces/Meridio/Outbound/out.csv
    #a=`cat size.txt | head -1 | tail -1 | awk -F"|" '{print $1}'`
    echo "$a,$c" >> /u01/oracle/sba81/nas_siebel_fs_prd1/Interfaces/Meridio/Outbound/out.csv
    if [ "$a" = "$b" ]
     echo "Meridio Interface stuck=$a" >> /u01/oracle/sba81/nas_siebel_fs_prd1/Interfaces/Meridio/Outbound/output.csv
     cat /u01/oracle/sba81/nas_siebel_fs_prd1/Interfaces/Meridio/Outbound/output.csv | mailx -s "Meridio Interface Down" email1 email2 email3
  • romain June 20, 2014, 11:03 am

    Simple, concise, straighforward… excellent tutorial !

    Many thanks!

  • mo September 24, 2014, 12:40 am

    Many thanks… also saved me quite a bit of time !!

  • runej December 21, 2014, 6:43 pm

    > var number = 4723;

    varprt=4723 && lsofout=$(lsof -t -i:$varprt) && pidout=$(pidof $lsofout) && kill $pidout


  • Andy McPob April 8, 2015, 2:07 pm

    Hi, can you assist ?

    i’m trying to run the command softwareupdate -i -a then run one of 2 commands depending on the results (i’ve tried using the exit code but it gives a 0 if it fails under certain conditions)

    this is what i’d scraped together but it doesn’t work and your examples look much simpler!

    if [[ $var == *”Done.” || “No new software available” || “No updates are available.”* ]]
    say woop woop

    exit 0

    echo “updates failed”
    say failed sad sad face
    exit 1

    Thank you

  • Andy McPob April 8, 2015, 2:12 pm

    missed the top of!!

    softwareupdate -i -a
    var=`softwareupdate -i -a`
    if [[ $var == *"Done." || "No new software available" || "No updates are available."* ]]
      say woop woop
      exit 0
      echo "updates failed"
      say failed sad sad face
      exit 1
  • Andy McPob April 8, 2015, 6:09 pm

    So i’ve got this do do what i need now, could you offer a more robust and tidier method ?

    var=$(softwareupdate -i -a 2>&1)
    if [[ $var == *"Done."* ]] || [[ $var == *"No new software available"* ]] || [[ $var == *"No updates are available"* ]]
    echo "updates complete"
      say woop hoorah woop de doop
       	exit 0
    echo "updates failed"
      say boo
    	exit 1

Leave a Comment

   Tagged with: , , , , , , , , , , , , , , , , ,