How can I remove the extension of a filename in a shell script?

bash, cut, gnu-coreutils, sh, shell

Solution

You should be using the command substitution syntax `$(command)` when you want to execute a command in script/command.

So your line would be

name=$(echo "$filename" | cut -f 1 -d '.')

Code explanation:

- `echo` get the value of the variable `$filename` and send it to standard output

- We then grab the output and pipe it to the `cut` command

- The `cut` will use the . as delimiter (also known as separator) for cutting the string into segments and by `-f` we select which segment we want to have in output

- Then the `$()` command substitution will get the output and return its value

- The returned value will be assigned to the variable named `name`

Note that this gives the portion of the variable up to the first period `.`:

$ filename=hello.world
$ echo "$filename" | cut -f 1 -d '.'
hello
$ filename=hello.hello.hello
$ echo "$filename" | cut -f 1 -d '.'
hello
$ filename=hello
$ echo "$filename" | cut -f 1 -d '.'
hello

Problem

What's wrong with the following code? ``` name='$filename | cut -f1 -d'.'' ``` As is, I get the literal string `$filename | cut -f1 -d'.'`, but if I remove the quotes I don't get anything. Meanwhile, typing ``` "test.exe" | cut -f1 -d'.' ``` in a shell gives me the output I want, `test`. I already know `$filename` has been assigned the right value. What I want to do is assign to a variable the filename without the extension.

Original source

Related problems