我正在重命名一堆包含空格的文件和目录。我有一个目录列表,如:
"/usr/home/name/directory a/"
"/usr/home/name/directory b/"
等...
它们都用双引号括起来,这样我就可以使用for循环来处理每个引号。那部分工作正常。麻烦的是我也有像这样的文件:
"/usr/home/name/directory a/file a"
"/usr/home/name/directory b/file b"
等...
我需要验证文件所在的目录是否可写。所以要做到这一点,我从字符串中获取dirname,如:
dnam=$(dirname $1)
这有用......到了一定程度。最终的结果是我的最后一个双引号也被切断了,结果是:
"/usr/home/name/directory a
"/usr/home/name/directory b
等...
我需要最后的引用才能转移到实际的重命名部分,并且无法弄清楚如何去做。我敢肯定,这是一件很简单的事情。有人可以请我填一下吗?
答案 0 :(得分:2)
为安全起见,请使用:
dnam=$(dirname "$1")
在变量周围加上双引号。
您可以使用以下内容为该结果附加双引号:
dnam=$(dirname "$1")'"'
或许多等效符号。但是,我怀疑你应该以不同的方式处理名称,而不是值中的双引号。也就是说,你可能有:
dir1="/usr/home/name/directory a"
file1="$dir1/file a"
然后当你需要将其中一个传递给命令时,用双引号括起来:
dnam=$(dirname "$file1")
cd "$dnam"
如果您正在处理此类名称的列表,请使用数组,然后使用以下符号:
a=( "$dir1" "$dir2" )
ls -ld "${a[@]}"
答案 1 :(得分:1)
乍一看,似乎你需要添加反斜杠来逃避脚本中的双引号。
答案 2 :(得分:0)
不需要子shell的较短版本:
dnam=${1%/*}\"
参数替换与实用程序目录名具有相同的效果。它适用于路径中的空白。最终报价只需要转义。