我正在使用 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/