BASH param从传递的param扩展

时间:2014-04-20 09:07:35

标签: bash shell expansion

我在运行为GNU bash,版本4.2.25(1)-release(x86_64-pc-linux-gnu)的/ bin / bash脚本中遇到shell param扩展问题

# the cmdln args are
explore_asterisk_expansion.bash path/to/other/files file* my_files* log*

# the script assigns to internal variables as below
path=$1
shift
find_these=($@)

# I then loop through the find_these array as below
for f in $path/${find_these[@]} ; do
  echo f is $file
done

我只将$ path添加到传递的第一个参数中。

对于上面的cmd ln,这意味着我得到$ path / file *,它已成功扩展,&我得到了预期的3个文件回显,但其余的args完全被传递出来,即my_files * log *,没有$ path,因此星号扩展失败。

如何解决这个问题的建议将不胜感激。

4 个答案:

答案 0 :(得分:2)

如果要在迭代数组之前预先添加每个文件的路径,可以这样做。

#!/bin/bash

path=$1
shift
find_these=( "$@" )

for f in "${find_these[@]/#/$path/}" ; do
  echo "f is $f"
done

我在OS X 10.9上的GNU bash 4.2.45(2)上对此进行了测试,但它确实有效。

答案 1 :(得分:0)

您是否只需将path附加到其余的args中,请执行以下操作:

for f in ${find_these[@]} ; do
  echo f is $path/$f
done

答案 2 :(得分:0)

我不确定变量$file是什么,但看起来您可能打算写$f而不是$file,因为我认为没有其他原因可以使用该变量进行循环。

for f in $path/${find_these[@]} ; do
  echo f is $f
done

答案 3 :(得分:0)

您可以在扩展模式之前简单地转到目录(并且您不需要将$@分配给变量):

cd "$path"
for file in $@
...

由于您在脚本中执行cd,因此外部环境保持在同一环境中。

示例:

$ cd -- "$(mktemp --directory)"
$ cat test.sh 
path="$1"
shift
cd "$path"
for file in $@
do
    echo "Found file: $file"
done
$ mkdir foo
$ touch foo/a foo/abc
$ sh test.sh foo a*
Found file: a
Found file: abc