Bash: Assign Output of Shell Command To Variable

Posted on in Categories , , last updated October 1, 2013

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)
var=$(command-name-here arg1)
var=$(/path/to/command)
var=$(/path/to/command arg1 arg2)

OR

var=`command-name-here`
var=`command-name-here arg1`
var=`/path/to/command`
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.

Examples

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

now=$(date)

OR

now=`date`

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

echo "$now"

OR

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)"

OR

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

Sample outputs:

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

See also:

  • Command substitution – from the Linux shell scripting tutorial wiki.
  • See man pages: bash(1),printf(1)

Posted by: Vivek Gite

The author is the creator of nixCraft and a seasoned sysadmin and a trainer for the Linux operating system/Unix shell scripting. He has worked with global clients and in various industries, including IT, education, defense and space research, and the nonprofit sector. Follow him on Twitter, Facebook, Google+.

21 comment

  1. 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
    18:55

  2. 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

    Amit

  3. What about Piped command like
    this?
    ie.
    droppedbyte=(iptables -L -v -n –line-number |grep DROP| awk ‘$1 = 5 {print $3}’)
    or
    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

      1. you are awesome :D

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

  4. Hi,

    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.

    #!/bin/ksh
    
    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}'`
    b=`$c`
    
    echo "$a,$c" >> /u01/oracle/sba81/nas_siebel_fs_prd1/Interfaces/Meridio/Outbound/out.csv
    
    if [ "$a" = "$b" ]
    then
     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
     c=`$a`
    else
     c=`$a`
    fi
    
  5. > var number = 4723;
    >

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

    ???

  6. 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.”* ]]
    then
    say woop woop

    exit 0
    else

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

    Thank you
    Andy

  7. missed the top of!!

    softwareupdate -i -a
    
    var=`softwareupdate -i -a`
    
    if [[ $var == *"Done." || "No new software available" || "No updates are available."* ]]
    then
      say woop woop
       
      exit 0
    else
    
      echo "updates failed"
      say failed sad sad face
      exit 1
    fi
    
  8. 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"* ]]
    then
    echo "updates complete"
      say woop hoorah woop de doop
       	exit 0
       
    else
    echo "updates failed"
      say boo 
    	exit 1
    fi
    
  9. Hi All,

    I was trying to get the Output of wget command in a varriable but its not storing it.

    i am using it as
    a=`wget -O ./google.jpg https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png`

    when i am doing echo $a its shows blank

    Please help me to store this in a varriable

  10. Hi,

    i´m trying to assign Output of Shell Command To a Variable in my C-programm. I generate some CAN-Data with “cangen” but i need this data for my C-programm. I don´t find a way to do that. Can somebody help me please. I use Netbeans as IDE.

    thank you

  11. This tutorial is opened a new world for me. :) Fully automated nginx configurations with just a domain name input. I’ll save about 10-20 hours per month! You write the script once and use many times for different cases.
    Thanks for this amazing tutorial!

  12. You can perform assignment to multiple variables by eg doing something like this:


    read nmi0 nmi1 < <(grep NMI /proc/interrupts | awk '{print $2 " " $3}')

    The redirect stdin from a shell command is quite useful, I’ve found.

Comments are closed.