2010-08-16 135 views
1

我写了一个sh脚本(test.sh)是这样的:为什么sh脚本不能工作

#!/bin/sh 

echo [email protected] 

,然后运行它像这样:

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

但输出是:

" 

其实我需要

["hello"] 

bash的版本是:

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

如果我跑

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

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

+1

有趣。在Ubuntu10下的'GNU bash,版本4.1.5(1) - 发行版(i486-pc-linux-gnu)'中可以正常工作。 – paxdiablo 2010-08-16 02:41:33

+0

在mac os x上也能正常工作 – 2010-08-16 02:48:26

+0

它适用于我。尝试追踪执行。制作你的第一行'#!/ bin/bash -x',看看这个跟踪告诉你什么。 – 2010-08-16 06:33:18

回答

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"。我不确定发生了什么其他阶段的扩张。

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

在其他“$ scripting”语言(Perl,也可能是PHP)中,$ foo的意思是$ foo。

+0

谢谢,如果我改变$ @为“$ @”,它的工作原理。但我不知道为什么...... – Jianzhong 2010-08-16 02:47:25

+0

虽然我实际上无法重现您的错误。 – 2010-08-16 22:05:33

0

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

#!/bin/bash 

使其实际运行用bash?

+0

不,它仍然不能工作... – Jianzhong 2010-08-16 02:39:18

1

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

相关问题