Sunday, July 10, 2022

[SOLVED] ZSH/Shell variable assignment/usage

Issue

I use ZSH for my terminal shell, and whilst I've written several functions to automate specific tasks, I've never really attempted anything that requires the functionality I'm after at the moment.

I've recently re-written a blog using Jekyll and I want to automate the production of blog posts and finally the uploading of the newly produced files to my server using something like scp.

I'm slightly confused about the variable bindings/usage in ZSH; for example:

DATE= date +'20%y-%m-%d'
echo $DATE

correctly outputs 2011-08-23 as I'd expect.

But when I try:

DATE= date +'20%y-%m-%d'
FILE= "~/path/to/_posts/$DATE-$1.markdown"
echo $FILE

It outputs:

2011-08-23
blog.sh: line 4: ~/path/to/_posts/-.markdown: No such file or directory

And when run with what I'd be wanting the blog title to be (ignoring the fact the string needs to be manipulated to make it more url friendly and that the route path/to doesn't exist)

i.e. blog "blog title", outputs:

2011-08-23
blog.sh: line 4: ~/path/to/_posts/-blog title.markdown: No such file or directory

Why is $DATE printing above the call to print $FILE rather than the string being included in $FILE?


Solution

Two things are going wrong here.


Firstly, your first snippet is not doing what I think you think it is. Try removing the second line, the echo. It still prints the date, right? Because this:

DATE= date +'20%y-%m-%d'

Is not a variable assignment - it's an invocation of date with an auxiliary environment variable (the general syntax is VAR_NAME=VAR_VALUE COMMAND). You mean this:

DATE=$(date +'20%y-%m-%d')

Your second snippet will still fail, but differently. Again, you're using the invoke-with-environment syntax instead of assignment. You mean:

# note the lack of a space after the equals sign
FILE="~/path/to/_posts/$DATE-$1.markdown"

I think that should do the trick.


Disclaimer

While I know bash very well, I only started using zsh recently; there may be zshisms at work here that I'm not aware of.



Answered By - Tom Anderson
Answer Checked By - Clifford M. (WPSolving Volunteer)