Bash - 连续字符串操作

gsk*_*lee 11 shell bash string shell-script

#!/bin/bash

FILE="$(basename "$1")"
FILE="${FILE/%.jpeg/.jpg}"
Run Code Online (Sandbox Code Playgroud)

有没有办法将这两条线粘在一起形成一个单线?

Tim*_*edy 12

FILE=$(basename "${1/%.jpeg/.jpg}") 为我工作。

测试:

bash-$ ./test.sh /tmp/foo.jpeg
foo.jpg
Run Code Online (Sandbox Code Playgroud)

脚本内容:

bash-$ cat test.sh 
#!/usr/bin/bash

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

echo "$FILE"
Run Code Online (Sandbox Code Playgroud)


Gil*_*il' 11

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

您可以避免使用外部实用程序basename,而是使用字符串操作构造:

FILE="${1##*/}"; FILE="${FILE/%.jpeg/.jpg}"
Run Code Online (Sandbox Code Playgroud)

在这里,您可以重写脚本以将命令替换放在外部。这不是普遍现象,除了某种单一的感觉之外,您也不会获得任何其他东西。

Zsh,无论好坏,确实让您嵌套扩展:

FILE=${$(basename $1)/%.jpeg/.jpg}    # using basename
FILE=${${1##*/}/%.jpeg/.jpg}          # using string rewriting
Run Code Online (Sandbox Code Playgroud)

或者您可以使用 zsh 的内置构造而不是basename

FILE=${${1:t}/%.jpeg/.jpg}
Run Code Online (Sandbox Code Playgroud)