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.