在命令替换中使用参数时进行分词

在命令替换中使用参数时进行分词

需要做什么来确保在命令替换中使用包含嵌入空格的参数时得到正确处理?也许有一个例子可以说明

$ file="/home/1_cr/xy z"
$ basename $file
xy

$ #need to pass basename a quoted $file to prevent the z in 'xy z' from being eaten
$ basename "$file"
xy z

$ #Now using $file inside a command substitution without quoting.....
$ #....the command substitution causes 'xy z' to split
$ set -- $(basename "$file")
$ printf "%s\n" "$@"
xy
z

$ #But quoting the command substitution does not prevent 'xy z'...... 
$ #....from being split before being passed to basename
$ set -- "$(basename $file)"
$ printf "%s\n" "$@"
xy

我需要做什么才能

$ set -- $(basename $file)
$ printf "%s\n" "$@"

产量

xy z   

答案1

您需要在所有变量和命令替换两边加上双引号。

set -- "$(basename -- "$file")"

如果您允许将变量的值拆分为单词,并将这些单词视为全局模式,则无法回头。您无法再判断其中有多少空格或文件名是否是通配符扩展的结果。你无法将汉堡变回牛,所以你首先必须确保不要将牛送到屠宰场。

答案2

你有多种选择,

  1. 使用“$“* 反而“$@”

     set -- $(basename "$file")
     printf "%s\n" "$*"
    
  2. 引用命令替换和变量,

     set -- "$(basename "$file")"
     printf "%s\n" "$@"
    

相关内容