How do I execute a bash command from Ipython/Jupyter notebook passing the value of a python variable as an argument like in this example:
py_var="foo"
!grep py_var bar.txt
(obviously I want to grep for foo and not the literal string py_var)
Prefix your variable names with a $. 
Example
Say you want to copy a file file1 to a path stored in a python variable named dir_pth:
dir_path = "/home/foo/bar"
!cp file1 $dir_path
from Ipython or Jupyter notebook
EDIT
Thanks to the suggestion from  Catbuilts, if you want to concatenate multiple strings to form the path, use {..} instead of $..$. 
A general solution that works in both situations is to stick with {..}
dir_path = "/home/foo/bar"
!cp file1 {dir_path}
And if you want to concatinate another string sub_dir to your path, then:
!cp file1 {dir_path + sub_dir}
EDIT 2
For a related discussion on the use of raw strings (prefixed with r) to pass the variables, see Passing Ipython variables as string arguments to shell command
You cans use this syntax too:
path = "../_data/"
filename = "titanicdata.htm"
! less {path + filename}
                        As @Catbuilts points out, $'s are problematic. To make it more explicit and not bury the key example, try the following:
afile='afile.txt'
!echo afile
!echo $PWD
!echo $PWD/{afile}
!echo {pwd+'/'+afile}
And you get:
afile.txt
/Users/user/Documents/adir
/Users/user/Documents/adir/{afile}
/Users/user/Documents/adir/afile.txt
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With