基地名称与空格在bash脚本?

我正在使用bash脚本在/ tmp /中使用文件的名称创build一个新文件夹,然后将该文件复制到该文件夹​​中。

#!/bin/bash MYBASENAME="`basename $1`" mkdir "/tmp/$MYBASENAME" for ARG in "$@" do mv "$ARG" "/tmp/$MYBASENAME" done 

行为:

当我inputmymove "/home/me/downloads/my new file.zip" ,显示如下:

 mkdir /tmp/my new file.zip mv: rename /home/me/downloads/my new file.zip to /tmp/my\nnew\nfile.zip: 

我周围有很多引号,所以我不明白为什么这不能按预期工作。

另外,如果有多个文件,我在那里有表单循环。 我希望他们都被复制到基于第一个参数的基本名称相同的文件夹。

在赋值为单个命令替换的情况下,您不需要引用命令替换。 shell不会为变量赋值执行分词。

 MYBASENAME=$(basename "$1") 

这一切都需要。 你应该养成使用$()而不是反引号的习惯,因为$()更容易嵌套(这是POSIX,顺便说一下,所有的现代shell都支持它)。

PS:你应该尽量bash脚本。 尝试编写shell脚本。 不同之处在于没有bashisms,zshisms等。就像C一样,可移植性是脚本的一个理想功能,特别是如果它可以轻松实现的话。 你的脚本不使用任何bashisms,所以我会写#!/bin/sh代替。 对于挑剔者:是的,我知道,旧的SunOS和Solaris /bin/sh不明白$()/usr/xpg4/bin/sh是一个POSIX shell。

问题是,在$1

 MYBASENAME="`basename $1`" 

没有被引用。 用这个代替:

 MYBASENAME="$(basename "$1")" 

你错过了一套引号!

 MYBASENAME="`basename \"$1\"`" 

这将解决您的问题。

 MYBASENAME="`basename $1`" 

应该

 MYBASENAME="`basename "$1"`" 

$1加上双引号"$1"