在 Bash 脚本中处理通配符

在 Bash 脚本中处理通配符

我只需要一个简单的 bash 脚本示例来处理单个文件或多个文件(如果将通配符作为参数传递)

如果我跑

myscript file1

对文件进行一些操作,如果我发出

myscript *.pdf

根据文件匹配条件执行某些操作

有人能举一个简单的例子吗?

答案1

*.pdf在执行脚本之前,shell 会扩展 它,因此脚本不会看到 它,*.pdf而是直接看到匹配的文件名:

$ cat foo.sh
#! /bin/sh

printf "|%s|\n" "$@"
$ touch {1..10}.pdf
$ ./foo.sh 1.pdf
|1.pdf|
$ ./foo.sh *.pdf
|1.pdf|
|10.pdf|
|2.pdf|
|3.pdf|
|4.pdf|
|5.pdf|
|6.pdf|
|7.pdf|
|8.pdf|
|9.pdf|

在 bash 脚本中,您可以使用"$@"来获取传递给它的所有参数,或者使用$1$2等直接访问第一个、第二个等参数。

您可以使用简单的方法循环遍历所有参数for

for i     # Or, for i in "$@"
do
    echo "Processing argument $i"
done

将会输出:

Processing argument 1.pdf
Processing argument 10.pdf
Processing argument 2.pdf
Processing argument 3.pdf
Processing argument 4.pdf
Processing argument 5.pdf
Processing argument 6.pdf
Processing argument 7.pdf
Processing argument 8.pdf
Processing argument 9.pdf

答案2

这是文件中的一个读数,以数组的形式,允许您随意使用它:

#!/bin/bash

filearray=( "$@" )

if [ ${#filearray[@]} -gt "1" ] || [ ${#filearray[@]} == "0" ]; then
    isare=are
    ent=entries
else
    isare=is
    ent=entry
fi

echo "There $isare ${#filearray[@]} $ent."
echo ""
if [ ${#filearray[@]} == "0" ]; then
    echo "Nothing entered."
    exit
else
    echo "This is what you entered or what was found: "
    echo ""
    printf '%s\n' "${filearray[@]}"
fi

使用“”作为数组,这样即使文件有空格,它也会读取文件,并且在打印时不会将它们分开。我还根据找到的文件数量添加了措辞更改。没有条目将显示 0。计数${#filearray[@]}元素的数量,${filearray[@]}将显示所有元素。

例子:

一条条目:

$ ./myscript myfile.txt
There is 1 entry.

This is what you entered or what was found: 

myfile.txt

多次参赛:

$ ./myscript *.sh
There are 5 entries.

This is what you entered or what was found: 

blue-ray_encode.sh
lightsOn.sh
removeoffender.sh
test1.sh
test.sh

没有条目:

$ ./myscript 
There are 0 entries.

Nothing entered.

相关内容