Bash脚本cd问题

时间:2012-07-17 11:40:10

标签: linux macos bash unix

大家好我的脚本有些问题。我已经读过,从脚本中更改当前目录是一个问题。基本上我正在寻找一个带有项目文件夹和其中任何子文件夹的php文件。我想将目录更改为该文件夹所在的位置并为其执行命令。到目前为止没有运气。

function findPHP(){
declare -a FILES
FILES=$(find ./ -name \*.php)
for file in "${FILES[@]}"
do

DIR=`dirname file`
( cd $DIR && doSomethingInThisDir &(...))

done

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

您尝试将FILES作为数组进行迭代,但它只有一个元素。为了将子shell的结果变为数组,您可以:

FILES=($(find ./ -name \*.php))

请注意,它会在空格上分割文件名,因此即使您在下面正确引用,也无济于事。或者,你可以让它分成下面(即使用现有的FILES)并改为使用:

for file in $FILES

如果您使用的是bash 4,您可能需要查看递归的globbing ...这会让它更容易一些:

for file in **/*.php

请注意,您必须设置globstar shell选项,您可以使用shopt -s globstar启用该选项。这种方式更简单,不会在空格上破坏。

此外,您可能需要$file

DIR=`dirname $file`

或者只使用参数扩展:

DIR=${file%/*}

答案 1 :(得分:1)

无论如何都没有理由使用数组或存储文件列表。如果您的find支持-execdir(例如gnufi​​nd 4.2.27),请使用它。否则,像你一样在子shell中执行cd:

#!/bin/bash
doSomethingInThisDir() ( cd $(dirname $1); ... )
export -f doSomethingInThisDir
find . -type f -exec bash -c 'doSomethingInThisDir {}' \;

我已使用()而不是{}定义了该功能,但在这种情况下这不是必需的。通常,使用()会导致函数在子shell中运行,但无论如何都会发生这种情况,因为find为每个文件运行一个单独的进程。