Bash - маніпуляція з постійними струнами


11
#!/bin/bash

FILE="$(basename "$1")"
FILE="${FILE/%.jpeg/.jpg}"

Чи є все-таки склеїти ці дві лінії разом в один вкладиш?

Відповіді:


12

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"

Оскільки обидві лінії є своєрідними взаємозамінними, це рішення поки що найменше ... Якщо рядки не є взаємозамінними sed, я думаю, потрібен.
gsklee

11

Ви не можете вкладати розширення в 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}

4

Я б пішов на:

FILE=$(basename $1 .jpeg).jpg

Другий параметр до базового імені - це суфікс, який слід видалити з імені файлу (див. man basename)


3

Ви можете використовувати одну sedкоманду, як описано нижче:

FILE=$(sed 's/.*\///;s/\.jpeg$/.jpg/' <<<"$1")

2

Включивши sedце, слід зробити трюк:

FILE="$(basename "$1" | sed s/\.jpeg$/.jpg/)"

(Це не відповідає точно на ваше запитання, тому що я не можу; не впевнений, чи можливо.)


1

Конструкції Bash ${}працюють із іменами змінних , тому немає можливості вбудувати команду безпосередньо. Підхід @ sr_ є альтернативою, якщо ви не заперечуєте над зайвою вилкою.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.