代码之家  ›  专栏  ›  技术社区  ›  Senseful

当名称中有空格时,如何从一个目录复制到另一个目录?[副本]

  •  0
  • Senseful  · 技术社区  · 5 年前

    这里有一系列的案例 echo $var 可以显示与刚分配的值不同的值。无论赋值是“双引号”、“单引号”还是“未引号”,都会发生这种情况。

    如何让shell正确设置变量?

    星号

    预期输出为 /* Foobar is free software */ 但是我得到了一个文件名列表:

    $ var="/* Foobar is free software */"
    $ echo $var 
    /bin /boot /dev /etc /home /initrd.img /lib /lib64 /media /mnt /opt /proc ...
    

    方括号

    预期值为 [a-z] 但有时我只收到一封信!

    $ var=[a-z]
    $ echo $var
    c
    

    换行(换行)

    期望值是一个单独行的列表,但是所有值都在一行上!

    $ cat file
    foo
    bar
    baz
    
    $ var=$(cat file)
    $ echo $var
    foo bar baz
    

    多个空格

    我期望有一个仔细对齐的表头,但是相反,多个空格要么消失,要么折叠成一个!

    $ var="       title     |    count"
    $ echo $var
    title | count
    

    标签

    我期望两个制表符分隔的值,但我得到了两个空格分隔的值!

    $ var=$'key\tvalue'
    $ echo $var
    key value
    
    0 回复  |  直到 6 年前
        1
  •  96
  •   that other guy    9 年前

    在上述所有情况下,变量设置正确,但读取不正确!正确的方法是 引用时

    echo "$var"
    

    这给出了所有示例中的预期值。总是引用变量引用!


    当变量为

    1. 经历 field splitting

      /* Foobar is free software */

      之后: /* Foobar ,请 is free software ,请 */

    2. pathname expansion

      之前:

      /bin ,请 /boot /dev ,请 /etc /home

    3. separated by single spaces

      /bin /boot /dev /etc /home Foobar is free software Desktop/ Downloads/
      

      而不是变量的值。

    它将:

    1. 没有第2步。

    shellcheck

        2
  •  13
  •   Community TheSoundDefense    7 年前

    你可能想知道为什么会这样。与 the great explanation by that other guy Why does my shell script choke on whitespace or other special characters? 作者 Gilles Unix & Linux 以下内容:

    "$foo"

    $foo foo .这意味着

    • 首先,取变量的值。
    • 包含 foo * bar ​ * ,请 bar
    • 未修改。在我们的示例中,这将导致包含 接下来是当前目录中的文件列表,最后是 .如果当前目录为空,则结果为 ,请

    请注意,结果是字符串列表。有两种上下文 时间。双引号分隔字符串上下文:整体 "$@" 展开到位置参数列表,例如 "$1" "$2" "$3" What is the difference between $* and $@? )

    $(foo) 或与 `foo` `foo` :其报价规则为 哪一个

    扩展,但这通常不是一个问题,因为它只包含 IFS - )。

    When is double-quoting necessary? 当你可以省略引号的时候。

    始终在变量和命令替换周围使用双引号。做 security holes

        3
  •  4
  •   Charles Duffy    6 年前

    除因未报价引起的其他问题外, -n -e echo 作为论据。(根据POSIX规范,只有前者是合法的) -E

    为了避免这种情况, printf 而不是

    因此:

    $ vars="-e -n -a"
    $ echo $vars      # breaks because -e and -n can be treated as arguments to echo
    -a
    $ echo "$vars"
    -e -n -a
    

    以下内容:

    $ vars="-n"
    $ echo $vars
    $ ## not even an empty line was printed
    

    以下内容:

    $ vars="-n"
    $ printf '%s\n' "$vars"
    -n
    
        4
  •  3
  •   vanishedzhou    6 年前

    echo "${var}"
    

    它会正确读取你的值。

        5
  •  1
  •   ks1322    9 年前

    echo $var IFS 变量。默认情况下,它包含空格、制表符和换行符:

    [ks@localhost ~]$ echo -n "$IFS" | cat -vte
     ^I$
    

    $var

    防止分词(除了使用双引号)的一种方法是设置 http://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html#tag_02_06_05 以下内容:

    如果ifs值为空,则不进行字段拆分。

    设置为空意味着设置为空 值:

    IFS=
    

    测试:

    [ks@localhost ~]$ echo -n "$IFS" | cat -vte
     ^I$
    [ks@localhost ~]$ var=$'key\nvalue'
    [ks@localhost ~]$ echo $var
    key value
    [ks@localhost ~]$ IFS=
    [ks@localhost ~]$ echo $var
    key
    value
    [ks@localhost ~]$ 
    
        6
  •  -2
  •   Alek    9 年前

    除了将变量放入引号之外,还可以使用 tr 将空格转换为换行符。

    $ echo $var | tr " " "\n"
    foo
    bar
    baz
    

    虽然这有点复杂,但它确实增加了输出的多样性,因为您可以将任何字符替换为数组变量之间的分隔符。