如何从命令行读取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/*
,4
和gz
是命令行参数。当我尝试上面的脚本时,它只读取第一个文件。有什么想法吗?
答案 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
周期而不是在赋值中扩展。