Arrays Bash-连接数组时连接反斜杠

Arrays Bash-连接数组时连接反斜杠,arrays,bash,gruntjs,Arrays,Bash,Gruntjs,我一直在试图找出一个bash脚本来确定服务器目录路径,如D:\xampp\htdocs,以及项目文件夹名称,如“my_project”,而Grunt正在运行我的postinstall脚本。到目前为止,我可以获取projects文件夹的名称,并且可以获得一个剩余索引的数组,这些索引构成了我系统上的服务器根路径,但是我似乎无法使用转义的反斜杠连接该数组。这可能不是最好的解决方案(肯定不是最优雅的),所以如果你有任何提示或建议,我可以修改 # Determine project folder name

我一直在试图找出一个bash脚本来确定服务器目录路径,如D:\xampp\htdocs,以及项目文件夹名称,如“my_project”,而Grunt正在运行我的postinstall脚本。到目前为止,我可以获取projects文件夹的名称,并且可以获得一个剩余索引的数组,这些索引构成了我系统上的服务器根路径,但是我似乎无法使用转义的反斜杠连接该数组。这可能不是最好的解决方案(肯定不是最优雅的),所以如果你有任何提示或建议,我可以修改

# Determine project folder name and server root directory path
bashFilePath=$0                           # get path to post_install.sh
IFS='\' bashFilePathArray=($bashFilePath) # split path on \
len=${#bashFilePathArray[@]}              # get array length

# Name of project folder in server root directory
projName=${bashFilePathArray[len-3]}      # returns my_project

ndx=0
serverPath=""
while [ $ndx -le `expr $len - 4` ]
do
    serverPath+="${bashFilePathArray[$ndx]}\\" # tried in and out of double quotes, also in separate concat below
    (( ndx++ ))
done

echo $serverPath # returns D: xampp htdocs, works if you sub out \\ for anything else, such as / will produce D:/xampp/htdocs, just not \\

您只能使用
IFS
作为命令调用的前缀,而不能作为变量赋值的前缀,因此

 IFS='\' bashFilePathArray=($bashFilePath)
只是一对作业;
$bashFilePath
的扩展不受分配给
IFS
的影响。相反,请使用
read
内置程序

IFS='\' read -ra bashFilePathArray <<< "$bashFilePath"

分号是必需的,因为
echo
的参数在
echo
实际运行之前展开,这意味着
IFS
需要“全局”修改,而不仅仅是针对
echo
命令。此外,还需要使用
[*]
来代替更常用的建议
[@]
因为这里我们明确使用了这样一个属性,即这样一个数组扩展的元素将生成一个单词而不是一个单词序列。

您需要使用
-r
,否则反斜杠将被解释为引号:
IFS='\'read-ra bashFilePathArray哦,对了,这是一个保证在输入中出现反斜杠的用例。+1还可以指出,当需要将数组扩展到单个单词时,需要使用
[*]
而不是
[@]
。谢谢,这非常有效。为了让我明白你们从stdin读到的是什么,它正在使用
serverPath=$(IFS='\'; echo "${bashFilePathArray[*]:0:len-3}")