You need to use command substitution feature of bash. It allows you to run a shell command and store its output to a bash variable.
Bash Assign Output of Shell Command To And Store To a Variable
To assign output of any shell command to variable in bash, use the following command substitution syntax:
Tutorial details | |
---|---|
Difficulty | Easy (rss) |
Root privileges | No |
Requirements | Bash |
Time | 2m |
var=$(command-name-here) var=$(command-name-here arg1) var=$(/path/to/command) var=$(/path/to/command arg1 arg2)
OR use backticks based syntax as follows to assign output of a Linux command to a variable:
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
Let us see some common examples for Linux, macOS, *BSD and Unix-like systems running bash.
BASH command output to the variable
To store date command output to a variable called now, enter:
## store date command output to $now ## now=$(date)
OR
## alternate syntax ## now=`date`
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
How to use multiline command
Try the following syntax:
my_var=$(command \
arg1 \
arg2 \
arg3 )
echo "$my_var"
For example,
## date example ## OUT=$(date \ --date='TZ="America/Los_Angeles" 09:00 next Thu') echo "$OUT"
Another ping command example for you:
#!/bin/bash _ping="/bin/ping" domain="www.cyberciti.biz" ping_avg="$(${_ping} \ -q \ -c 4 \ ${domain} | grep rtt)" echo "Avg ping time for ${domain} : ${ping_avg}"
Various ways to assign the output of a command to a shell variable
Conclusion
You learned how to assign output of a Linux and Unix command to a bash shell variable. For more information see GNU bash command man page here and read the following docs:
- Command substitution – from the Linux shell scripting tutorial wiki.
- See man pages: printf(1)
🐧 21 comments so far... add one ↓
Category | List of Unix and Linux commands |
---|---|
File Management | cat |
Firewall | Alpine Awall • CentOS 8 • OpenSUSE • RHEL 8 • Ubuntu 16.04 • Ubuntu 18.04 • Ubuntu 20.04 |
Network Utilities | dig • host • ip • nmap |
OpenVPN | CentOS 7 • CentOS 8 • Debian 10 • Debian 8/9 • Ubuntu 18.04 • Ubuntu 20.04 |
Package Manager | apk • apt |
Processes Management | bg • chroot • cron • disown • fg • jobs • killall • kill • pidof • pstree • pwdx • time |
Searching | grep • whereis • which |
User Information | groups • id • lastcomm • last • lid/libuser-lid • logname • members • users • whoami • who • w |
WireGuard VPN | Alpine • CentOS 8 • Debian 10 • Firewall • Ubuntu 20.04 |
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
Error: printf “%s\n” now
Should be: printf “%s\n” “$now”
Thanks for the heads up!
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
this is very helpful thank you
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
Try
you are awesome :D
This also worked.
droppedbyte=`iptables -L -v -n –line-number |grep DROP| awk ‘$1 = 5 {print $3}’`
Total shot in the dark Google search landed me here and this thing worked! Thanks a TON!
Thanks nixCraft — You just saved me a lot of time.
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.
Simple, concise, straighforward… excellent tutorial !
Many thanks!
Many thanks… also saved me quite a bit of time !!
> var number = 4723;
>
varprt=4723 && lsofout=$(lsof -t -i:$varprt) && pidout=$(pidof $lsofout) && kill $pidout
???
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
missed the top of!!
So i’ve got this do do what i need now, could you offer a more robust and tidier method ?
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
Hi,
im 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
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!
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.