为什么调用此 Bash 脚本时文件参数需要引号?

为什么调用此 Bash 脚本时文件参数需要引号?

我对 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按照您的希望进行扩展。

相关内容