创建数组时出现语法错误:“(”意外)


36

我有两个(Debian)Linux服务器。我正在创建一个shell脚本。

在第一个数组上,我这样创建了一个数组:

#!/bin/bash
target_array=(
    "/home/user/direct/filename -p123 -r"
)

很好 但是,当我在另一台服务器上运行时,我得到:

Syntax error: "(" unexpected

据我所知,两台服务器是相同的。谁能阐明为什么这行不通?

如果我直接将其输入终端,那很好吗?


看起来当我以

sh scriptname.sh

我得到了错误,但是如果我以

./scriptname.sh

看来还可以。有什么不同?


您是否在两个服务器之间复制粘贴了脚本?尝试cat -v <script>查看是否存在虚假字符。
LilloX

2
sh不是bash,因此以sh scriptname.sh错误的方式运行它
Eric Renouf

Answers:


56

当您使用./scriptname.sh它时,与/bin/bash的第一行中的一样执行#!。但是,当您使用sh scriptname.sh它时,它sh不会执行bash

sh外壳有没有语法创建数组,但Bash有你所使用的语法。


好的,这很有意义。如您所知,我对Linux还是很陌生(当前正在尝试将Powershell脚本转换为shell / bash脚本)。./从现在开始,我将坚持使用。欢呼声
IGGt '16

那不是必须的,但是#!/bin/shand sh script.sh(或#!/bin/bashand bash script.sh)之间必须有协调
Konstantin Morenko

3
sh语言没有数组(a[index]=xa=(x y))。一些sh解释器支持数组,仅支持ksh88(未移植到Linux AFAIK),而某些较早的pdksh变体支持a[index]=value而不支持数组a=(x y)。在Debian上,sh通常dash是不支持数组的(a[index]=x不起作用)。
斯特凡Chazelas

1
从现在开始我可以死了!:)
Paulo

0

运行./scriptname.sh将导致读取文件的第一行,并查看它是否需要运行“ / bin / bash”并将其余脚本传递给解释器,而执行时sh scriptname.sh会将文件传递给用户的标准shell(例如Ash)并且其他解释器不像Bash那样支持数组。


1
sh不一定是“用户的标准外壳”,它通常是其自己的可执行文件(或符号链接),sh将被调用以处理脚本。即使该用户的默认登录shell是bash
Eric Renouf

那是我目前还不确定的部分。感谢您的澄清!
dave_alcarin

0

sh scriptname.sh一起运行sh,而不必与一起运行bash。尝试sh --version在两台计算机上进行比较。和/或使用dpkg -S $(which sh)


即使sh是符号链接,bash调用时的行为也会有所不同sh
Eric Renouf
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.