Bash - 连续字符串操作

Bash - 连续字符串操作
#!/bin/bash

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

有没有办法把这两条线粘在一起成为一条线?

答案1

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"

答案2

您不能在 bash 中嵌套扩展(也不能在 ksh、ash 和除 zsh 之外的其他 shell 中)。这只是一个表面限制,因为正如您所说明的,您可以将中间表达式分配给临时变量。这对于单行文字来说有点烦人,但在脚本中可以说它的可读性更好。

您可以避免使用外部实用程序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}

答案3

我会选择:

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

basename 的第二个参数是要从文件名中删除的后缀(请参阅man basename

答案4

合并sed,这应该可以解决问题:

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

(这并不能完全回答你的问题,因为我不能;不确定是否可能。)

相关内容