我在运行为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,因此星号扩展失败。
如何解决这个问题的建议将不胜感激。
答案 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