为什么sh脚本无法工作

时间:2010-08-16 02:34:48

标签: bash

我写了一个像这样的sh脚本(test.sh):

#!/bin/sh

echo $@

然后像这样运行:

#./test.sh '["hello"]'

但输出是:

"

实际上我需要

["hello"]

bash版本是:

#bash --version
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)

如果我跑

# echo '["hello"]'
["hello"]

我不知道为什么脚本无法正常工作......

3 个答案:

答案 0 :(得分:1)

你可能的意思是“$ @”,虽然我不认为在这种情况下应该有很大的不同。还值得确保脚本是可执行的(chmod + x test.sh)。

编辑:既然你问了,

Bash有各种级别的字符串扩展/操作/无论如何。变量扩展,例如$ @,就是其中之一。阅读man bash了解更多信息,但据我所知,Bash将每个命令视为一个长字符串,直到“分词”和“引用删除”的最后阶段,它被分解为参数。

这意味着,根据您的原始定义,./test.sh "a b c d"相当于echo "a" "b" "c" "d",而不是echo "a b c d"。我不确定其他扩张阶段会发生什么。

整个分词的事情在UNIXland(以及几乎任何命令行支持的构建系统)中很常见,您可以在其中定义类似CFLAGS="-Os -std=c99 -Wall"的内容。 $ CFLAGS扩展为“-Os”“ - std = c99”“ - Wall”是有用的。

在其他“$ scripting”语言(Perl,可能还有PHP)中,$ foo实际上意味着$ foo。

答案 1 :(得分:1)

您显示的手动测试有效,因为echo获取参数[“hello”]。最外面的引号被shell剥离。当你把它放在一个shell脚本中时,每个shell都会删除一层引号:你键入的那个和解释脚本的那个。添加额外的引号层可以使其正确运行。

答案 2 :(得分:0)

只是一个猜测,但也许尝试将第一行更改为

#!/bin/bash

这样它实际上是用bash运行的吗?