在Bash中从命令行读取glob

时间:2011-02-21 08:45:48

标签: bash glob

如何从命令行读取Bash中的glob?我尝试了这个,它只获取了glob中的第一个文件:

#!/bin/bash
shopt -s nullglob
FILES=$1
for f in $FILES
do
  echo "Processing $f file..."
  echo $f
done

假设我的脚本是script.sh。我想称之为sh script.sh /home/hss/* 4 gz (其中/home/hss/*4gz是命令行参数。当我尝试上面的脚本时,它只读取第一个文件。有什么想法吗?

3 个答案:

答案 0 :(得分:10)

您需要访问传递给脚本的参数的所有内容。在执行脚本之前,glob会通过shell扩展glob。

您可以复制数组:

#!/bin/bash
FILES=("$@")
for f in "${FILES[@]}"
do
    echo "Processing $f file..."
    echo "$f"
done

或直接迭代:

#!/bin/bash
for f     # equivalent to for f in "$@"
do
    echo "Processing $f file..."
    echo "$f"
done

或使用shift

#!/bin/bash
while (($# > 0))
do
    echo "Processing $1 file..."
    echo "$1"
    shift
done

答案 1 :(得分:5)

在调用脚本时,您需要引用包含shell元字符的任何参数,以避免路径名扩展(由您当前的shell):

sh script.sh "/home/hss/*" 4 gz

因此$1将被分配模式,而不是第一个匹配的文件。

答案 2 :(得分:3)

它只读取第一个文件的原因是模式/home/hss/*在之前被扩展作为参数传递给您的脚本。因此,您的脚本不会将其视为模式,而是作为文件列表,与该glob匹配。

所以,你需要像在帖子中指定的eugene一样调用它:

sh script.sh "/home/hss/*" 4 gz

引用$1对我来说是可选的。它只是使模式在for周期而不是在赋值中扩展。