5

I wrote a very basic script of command substitution which is below:

#!/bin/bash
files=$(ls *.fastq);
echo $files

The directory contains bunch of .fastq file and I just want to use echo command to output them

The above sript outputs fastq files with a space between each fastq filename.

When I use it in this way

#!/bin/bash
files=$(ls *.fastq);
echo "$files"

it prints the results on new lines.

Why is it so? Is it something to do with command substitution?

Thanks

4

When referencing a variable, it is generally advisable to enclose its name in double quotes. This prevents reinterpretation of all special characters within the quoted string -- except $, ` (backquote), and \ (escape). Keeping $ as a special character within double quotes permits referencing a quoted variable ("$variable"), that is, replacing the variable with its value.

Use double quotes to prevent word splitting. An argument enclosed in double quotes presents itself as a single word, even if it contains whitespace separators.

e.g.

variable1="a variable containing five words"
COMMAND This is $variable1    # Executes COMMAND with 7 arguments:
# "This" "is" "a" "variable" "containing" "five" "words"

COMMAND "This is $variable1"  # Executes COMMAND with 1 argument:
# "This is a variable containing five words"

Enclosing the arguments to an echo statement in double quotes is necessary only when word splitting or preservation of whitespace is an issue.

For more info and examples go here

5

You have newlines because ls puts them on separate lines. The newlines disappear without the quotes because the shell (bash) passes each unquoted space separated text to the command as a separate argument.

Note: The command substitution is done by the shell, not by ls, so you do not need ls.

Therefore you can do

#!/bin/bash
echo *.fastq

or

#!/bin/bash
files="*.fastq"
echo "$files"
  • running ls *.fastq on the terminal outputs on the same line separated by spaces, how is ls putting them on separate lines then? – user3138373 Aug 27 '15 at 22:11
  • I can not find the docs, but ls will output same as ls -x when to a tty, and like ls -1 when not. Therefore use ls -x to get what you want. – ctrl-alt-delor Aug 27 '15 at 22:28
1

When you refer to a variable without quotes around it (e.g. echo $files), the shell splits the value apart on whitespace and passes each term as a separate command-line option. Newlines are treated the same as any other whitespace. The echo program doesn't see the newline characters at all; it just gets an array of strings, each of which is a single filename.

When you refer to a variable in quotes (e.g. echo "$files"), the shell doesn't do any whitespace splitting; instead, it passes the entire value, unmodified, as a single argument. The echo program receives one long string that includes the newline characters.

Variables aside, this is the same behavior you get with quotes around literal values. If you write echo foo bar, the spaces are stripped out by the shell and echo just gets the strings foo and bar, and it'll print those strings with a single space between them, since that's how it's coded to combine multiple arguments. If you write echo "foo bar", echo gets the single string foo bar and will print it as-is.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.