Bash:如何在一行中应用两个字符串操作?

时间:2012-02-01 16:15:43

标签: string bash

我想立刻更改变量中文件的路径和扩展名,例如执行以下操作

for F in $( find /foo/bar -name "*.ext" ); do 
  Ftmp=${F%.ext}
  cp $F ${Ftmp//bar/b0r}.tmp 
done

没有临时变量

可以一次应用两个字符串操作,只有bash意味着什么?

4 个答案:

答案 0 :(得分:7)

使用Bash temporary variable

$_    Temporary variable; initialized to pathname of script or program
      being executed. Later, stores the last argument of previous command.
      Also stores name of matching MAIL file during mail checks.
for F in $( find /foo/bar -name "*.ext" )
do
  : ${F%.ext}
  cp $F ${_//bar/b0r}.tmp
done

答案 1 :(得分:2)

嗯,你可以像没有临时变量那样做:

for F in $( find /foo/bar -name "*.ext" ); do 
     cp $F "$(sed 's/\.[^.]\+$/.tmp/;s/bar/b0r/' <<< $F)" 
done

但这是两个新进程。通过简单的变量扩展,我认为您需要该temo变量。

修改:感谢@glenn jackman现在这是一个额外的过程。

Edit2 bash只有一个变量类型:

for F in $( find /foo/bar -name "*.ext" ); do 
     F=${F/.ext/}
     cp ${F}.ext ${F/bar/b0r}.tmp
done

答案 2 :(得分:2)

答案是否。

你在谈论parameter expansion

它们都采用${parameter...形式,参数为"a name, a number or one of the special characters listed below...",因此参数本身不能是表达式。

答案 3 :(得分:-1)

这可能对您有用:

for F in $( find /foo/bar -name "*.ext" | sed 's/\.ext$//'); do 
     cp ${F}.ext ${F//bar/b0r}.tmp
done