Ответы:
FILE=$(basename "${1/%.jpeg/.jpg}")
работал на меня.
контрольная работа:
bash-$ ./test.sh /tmp/foo.jpeg
foo.jpg
содержание скрипта:
bash-$ cat test.sh
#!/usr/bin/bash
FILE=$(basename "${1/%.jpeg/.jpg}")
echo "$FILE"
Вы не можете вкладывать расширения в bash (ни в ksh, ни в пепел, ни в другие оболочки кроме zsh). Это только косметическое ограничение, поскольку, как вы видите, вы можете назначить промежуточное выражение для временной переменной. Это немного раздражает для однострочников, но в сценариях это возможно лучше для удобочитаемости.
Вы можете избежать использования внешней утилиты basename
и использовать вместо этого конструкцию манипуляции со строками:
FILE="${1##*/}"; FILE="${FILE/%.jpeg/.jpg}"
Здесь бывает так, что вы можете переписать свой скрипт, чтобы поместить подстановку команд снаружи . Это не общее явление, и вы не получаете ничего, кроме определенного чувства одной линии.
Zsh, к лучшему или к худшему, позволяет вам вкладывать расширения:
FILE=${$(basename $1)/%.jpeg/.jpg} # using basename
FILE=${${1##*/}/%.jpeg/.jpg} # using string rewriting
Или вы можете использовать встроенную конструкцию zsh вместо basename
:
FILE=${${1:t}/%.jpeg/.jpg}
Линия
FILE=$(basename "${1/%.jpeg/.jpg}")
можно сократить и сделать более портативным с
FILE=$(basename "${1%.jpeg}.jpg")
sed
, я определенно буду нуждаться.