linux - bash 脚本中带有空格的基本名称?

标签 linux bash unix shell scripting

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

#!/bin/bash

MYBASENAME="`basename $1`"
mkdir "/tmp/$MYBASENAME"

for ARG in "$@"
    do
        mv "$ARG" "/tmp/$MYBASENAME"

done

行为:

当我输入 mymove "/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 脚本。不同之处在于没有 bashism、zshism 等。就像 C 一样,可移植性是脚本的一个理想特性,特别是如果它可以很容易地实现的话。您的脚本不使用任何 bashisms,因此我将改为编写 #!/bin/sh。对于挑剔者:是的,我知道,旧的 SunOS 和 Solaris /bin/sh 不理解 $()/usr/xpg4/bin/sh 是一个 POSIX shell。

关于linux - bash 脚本中带有空格的基本名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7194192/

相关文章:

linux - 如何编写 bash 脚本来替换文件中的单词然后重命名文件?

unix - 如何撤消文件和目录权限中不正确的手动递归更改?

unix 对多个字段进行排序

linux - C++中两个日期时间之间的区别

c - 比 : execlp(cmd[0], cmd[0], cmd[1] cmd[2], cmd[3] NULL) 更有效的方法;

linux - 使用 GNU 并行时输出到文件的最快方法

字符串连接在 Bash cygwin 中不起作用

linux - 如何在csh 中将If-else 语句写在一行中?

linux - 编写一个接受持续时间作为参数的 bash 脚本?

unix - 如何在一列前换行?