在Bash中从命令行读取glob

Har*_*non 9 bash glob

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

#!/bin/bash
shopt -s nullglob
FILES=$1
for f in $FILES
do
  echo "Processing $f file..."
  echo $f
done
Run Code Online (Sandbox Code Playgroud)

假设我的脚本是script.sh.我想称之为sh script.sh /home/hss/* 4 gz (在哪里/home/hss/*,4并且gz是命令行参数).当我尝试上面的脚本时,它只读取第一个文件.有任何想法吗?

Pau*_*ce. 10

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

你可以复制数组:

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

或者直接迭代:

#!/bin/bash
for f     # equivalent to for f in "$@"
do
    echo "Processing $f file..."
    echo "$f"
done
Run Code Online (Sandbox Code Playgroud)

或使用shift:

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


Eug*_*ash 5

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

sh script.sh "/home/hss/*" 4 gz
Run Code Online (Sandbox Code Playgroud)

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