#!/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/)"
(这并不能完全回答你的问题,因为我不能;不确定是否可能。)