Відповіді:
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
, я думаю, потрібен.