【问题标题】:How to encase a command line argument in quotes with a bash/shell script [duplicate]如何使用 bash/shell 脚本将命令行参数括在引号中 [重复]
【发布时间】:2018-07-05 13:39:49
【问题描述】:

如何编写一个 bash 脚本/函数,它将接受一个带空格的命令行参数并将其解释为好像它有引号一样。

即:echo this is some text 好像echo "this is some text"

我想做的是创建一个简单的 CLI 计算器脚本/函数。 这是我所拥有的:

calc() {
        echo $(($@))
}

在 CLI 上,所有这些工作:

“#+-/*”、#+-/*、#+-/#

即:

calc 10+2
12

但是这个会产生错误:

calc 10 * 2
-bash: 10 calc.sh 2: syntax error: invalid arithmetic operator (error token is ".sh 2")

有什么想法吗?在计算中包含引号并不是什么大问题,但如果可能的话,不包含它们会更快/更方便。有没有办法在 calc 之后从第一个字符到最后一个字符,然后通过脚本中的引号传递它?

【问题讨论】:

    标签: bash shell


    【解决方案1】:

    在 unix 系统中有一个名为 IFS 的变量。这个变量决定了控制台在什么标志处将字符串分成单词。理论上您可以更改 IFS 变量,但这确实是不可取的(因为它会破坏其他 bash 命令)。

    更好:你可以这样写你的实用程序,写“calc”会提示用户输入他的方程到标准输入。然后你可以阅读用户输入的文本并以你想要的任何方式解析它。

    更好的是:shell 脚本可以指定它希望输入任意数量的单词。获取用户写的所有单词,然后对其进行解析。见:How to define a shell script with variable number of arguments?

    【讨论】:

    • 只有第二个建议会有帮助。 Shell 在将参数传递给命令(/function/script/whatever)之前解析参数(包括将通配符扩展为匹配文件的列表)。当命令收到它们时,为时已晚。