9

I'm trying to right my first bash script, and at one point a filename is passed to the script as $1. I need to extract the file name without the extension.
Currently, I'm assuming that all extensions are three letters so I remove the last 4 characters to get the file name:

a="${1:0:-4}"

But I need to be able to work with extensions that have more than three characters, like %~n1 in Windows.
Is there any way to extract the file name without the extension from the arguments?

26

The usual way to do this in bash is to use parameter expansion. (See the bash man page and search for "Parameter Expansion".)

a=${1%.*}

The % indicates that everything matching the pattern following (.*) from the right, using the shortest match possible, is to be deleted from the parameter $1. In this case, you don't need double-quotes (") around the expression.

  • The file patterns are generally like this: "Something.eng.ext". Obviously in this case ext is the extension, but using ${1%.*} will return only the "Something" part, right? – user304822 Mar 20 '14 at 15:05
  • 1
    No. ${1%.*} will return Something.eng. If you want to strip off everything to the right of the first . including the ., use ${1%%.*}, which will return Something. – garyjohn Mar 20 '14 at 15:16
11

If you know the extension, you can use basename

$ basename /home/jsmith/base.wiki .wiki
base

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.