我对 Bash 脚本很陌生。我有一个“测试脚本”,我用它作为更高级/有用的脚本的基础:
#!/bin/bash
files=$1
for a in $files
do
echo "$a"
done
当我不带任何引号调用它时,它只会拾取目录中的一个文件:
testscript *.txt
但是当我用引号调用它时,它可以正常工作并挑选出所有文本文件:
testscript '*.txt'
这里发生了什么?
答案1
当你调用一个程序时
testscript *.txt
那么你的壳进行展开并计算出所有值。所以它可能会有效地将你的程序称为
testscript file1.txt file2.txt file3.txt file4.txt
现在你的程序只查看$1
并且只适用于file1.txt
.
通过在命令行上引用,您将文字字符串传递*.txt
给脚本,这就是存储在$1
.然后你的for
循环会扩展它。
通常您会在这样的脚本中使用"$@"
and 。$1
对于使用 CMD 脚本编写的人来说,这是一个“陷阱”,而命令 shell 无法做到这一点通配(众所周知)并且总是传递文字字符串。
答案2
如果没有引号,shell 将*.txt
在调用脚本之前展开,因此$1
只有第一个文件会展开。此时所有txt
文件都是脚本的参数(假设没有太多)。
使用引号,该字符串将在不扩展到脚本中的情况下传递,然后让脚本for
按照您的希望进行扩展。