我只需要一个简单的 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.