Submind YouTube summaries
Thumbnail for Using Quote Marks in the Shell

Using Quote Marks in the Shell

Watch on YouTube

Video summary

The video addresses the challenges users face when working with file names that contain spaces or special characters in the Linux shell. The core issue arises because the shell performs various expansions on user input, such as word splitting, which can break a single filename into multiple arguments if it contains spaces. For instance, attempting to list a file named "sales report.odt" without protection causes the shell to interpret it as two separate files, resulting in an error. The primary solution presented is to enclose such filenames in double quotes, which effectively disables word splitting, path name expansion, tilde expansion, and brace expansion within that specific scope. This allows users to handle messy file names provided by clients or created with spaces while still maintaining control over how the shell processes the command. Beyond protecting filenames from being split, double quotes also manage how other forms of expansion interact with the command line. The transcript explains that when command substitution is placed inside double quotes, the resulting output does not undergo word splitting; instead, newlines and special characters within the substituted text are preserved as intended. Similarly, parameter expansion, arithmetic expansion, and command substitution all function correctly within double quotes without causing unintended breaks in the arguments. This distinction is crucial for scripts or commands where the integrity of generated text must be maintained, ensuring that variables like dates or calculated values appear exactly as they were computed rather than being fragmented by spaces. For scenarios requiring even stricter control over interpretation, single quotes offer a mechanism to disable all forms of expansion entirely. When text is enclosed in single quotes, the shell treats every character literally, ignoring variables, tilde expansions, arithmetic operations, and command substitutions within that string. This is particularly useful when a user needs to pass a literal string containing special characters like dollar signs or asterisks without triggering any shell processing. However, this absolute safety comes with a trade-off: if a variable or command substitution is needed inside single quotes, it cannot be accessed directly, making double quotes the preferred choice for most dynamic commands where some expansion is desired but word splitting must be avoided. The final segment of the discussion focuses on the backslash character as an escape tool to manipulate how special characters are interpreted. A backslash can turn a special character into an ordinary one, such as escaping a space or an asterisk in a glob pattern to match them literally, or it can convert an ordinary letter like 'n' or 't' into a newline or tab character when echo interprets escape sequences. Additionally, the backslash allows users to include literal quote marks within double-quoted strings by escaping the quote itself, and multiple backslashes can be used to represent a literal backslash character. Understanding these rules regarding double quotes, single quotes, and the backslash is essential for mastering how the shell expands input and ensuring commands execute with the precise arguments intended by the user.
Read the full video transcript
In the preceding video, we went over the expansions that the shell does on your input. The problem is that all these expansions can be too much of a good thing. Let's take a look at what's in this directory. We see that we've downloaded some LibreOffice files from the sales department, and they like to put spaces in their file names. Nothing wrong with that until we try to do a command like ls -l sales report.odt and we get two error messages because word splitting makes the shell think that we want information about two files sales and report.odt neither of which exists. We can solve this problem by putting the file name in double quotes. Now we have one item, not two and using double quotes turns off word splitting inside the quotes. Double quotes also turn off path name expansion, tilde expansion, and brace expansion. That means you could create files with names like this. Five star hotels January May .csv and sales and in braces confidential. And if we do an ls -l you'll see we have all those files. Note that none of these are particularly good names for Linux files. We would probably, for example, use names like this. Five star hotels, January through May .csv, and sales_confidential. And dispense with the uppercase at the same time. But even if our clients use names that look like a nightmare to us, we need to be able to handle them. And double quotes are a good step in that direction. One other effect of double quotes is that command substitution doesn't take part in word splitting, either. Consider this. Without double quotes, I want to see the results of the cal command echoed to the screen, and it comes out all on one line because new lines of the output are ignored. But putting it in double quotes solves the problem nicely. And by the way, this shows that command substitution works okay in double quotes. And so does parameter expansion. And arithmetic expansion. In addition to double quotes, you can also use single quotes. With single quotes, all expansion is turned off. And here's an example that shows that. Inside single quotes, I'm going to put text. I'm going to have regular text. I'll have tilde and path name expansion. I'll have a brace expansion. Command substitution. Arithmetic expansion. And parameter expansion. And because it's all in single quotes, I get exactly what I typed. Nothing is expanded. We now have one last problem to solve. What if I want to see all the file names that have a space in them? I can't do this. I can't say ls -l star space star. That would give me my current directory twice. I can't put it in double quotes because that turns off path name expansion. I need to lose the quote marks and find some way to tell the shell that the space in between the asterisks should be treated as an actual space, not a special word split character. And I do that by preceding it with a backslash. I say ls -l any number of characters followed by an actual space followed by any number of characters. And that gives me all of the files that have a space in them. The backslash is an escape character. It turns special characters into ordinary characters and ordinary characters into special characters. Let's go through these examples in the shell. In this example where I use five dash and then I backslash the star and I backslash the following space and then hotels. I've turned off the star and blank as special. They're no longer treated as special. In this example cost is backslash dollars 100.00. In this case, the dollar sign one is not treated as a variable. It's treated as an actual dollar sign and I get the output I want. Inside of double quotes I can use the backslash to say this double quote does not end the opening quote. I really want to double quote here. And I really want another double quote here. And now this double quote will end the beginning one. And in the last example of making things not special. I can say this and put two backslashes in a row saying, "No, I really, really want a backslash character." And again, it does what I want. And here are the examples of ordinary characters becoming special. In this case, I'm going to use the {dash} e option with echo to tell it that it should enable the interpretation of backslash escapes. I'll have the words line one and then backslash n, which turns the ordinary letter n into a new line character, and then the words line two. And I can make an ordinary character t become a tab character by preceding it with a backslash. And that's what you need to know about using double quotes, single quotes, and the backslash to control how the shell expands your input.