当前位置: 首页 > 知识库问答 >
问题:

为什么在shell脚本[duplicate]中使用双引号

杜河
2023-03-14

我理解单引号和双引号的用法。

但是我不知道剧本中需要双引号。

这种说法没有区别

$ echo hello world! $1
$ echo "hello world! $1"

请告诉我普通引号和双引号之间的区别。

共有2个答案

严远
2023-03-14

可以通过一个例子来说明这个用法

>

  • 以容纳带空格的字符串

    var=file name # Not the intended effect.
    

    文件存储在var中,shell将名称作为一个单独的cmd,这会给您带来一个错误。

    防止单词分裂

    var="file name"
    cp $var newfile
    

    在这里,$var扩展到file name,实际上,命令将成为

    cp file name newfile
    

    cp会将filename作为2个源文件,并将newfile作为目标目录,这会导致错误:

    cp: target 'newfile' is not a directory
    

    如果确实存在名为“newfile”的目录,它将给出错误:

    cp: cannot stat 'file': No such file or directory
    cp: cannot stat 'name': No such file or directory
    

    正确的方法是

    cp "$var" newfile
    

    在这种情况下,完全展开的$var被视为单个字符串。

  • 苏涛
    2023-03-14

    让我们考虑一个带有这些文件的目录:

    $ ls foo*
    foo111.txt  foo11.txt  foo1.txt
    

    让我们考虑一下你的脚本的一个小变化:

    $ cat script
    #!/bin/sh
    echo No quotes $1
    echo "Double quotes $1"
    

    现在,让我们运行它:

    $ bash script "foo*"
    No quotes foo111.txt foo11.txt foo1.txt
    Double quotes foo*
    

    如你所见,结果完全不同。如果没有双引号,则执行路径名扩展。

    为了说明另一个区别:

    $ bash script "long              space"
    No quotes long space
    Double quotes long              space
    

    使用双引号时,字与字之间的长间距被保留。如果没有它,所有连续的空格都将替换为一个空格。这是一个分词的例子。

     类似资料:
    • 问题内容: 我正在尝试编写一个小脚本以将当前目录更改为我的项目目录: 我将此文件另存为proj,使用添加了执行权限,然后将其复制到。当我通过以下方式调用它时 ,它什么也没做。我究竟做错了什么? 问题答案: Shell脚本在一个子Shell中运行,每个子Shell对当前目录都有自己的概念。的成功,但只要子shell退出,你是在交互式背壳和从来都没有改变,因此。 解决此问题的一种方法是改用别名:

    • 本文向大家介绍什么是Shell脚本?,包括了什么是Shell脚本?的使用技巧和注意事项,需要的朋友参考一下 Shell脚本是由Unix Shell(是命令行解释器)运行的计算机程序中的命令列表。Shell脚本通常具有描述步骤的注释。Shell脚本执行的不同操作是程序执行,文件操作和文本打印。包装器也是一种Shell脚本,用于创建程序环境,运行程序等。 贝壳类型 Unix中有两种主要的Shell类型

    • 什么是Shell脚本 示例 看个例子吧: #!/bin/sh cd ~ mkdir shell_tut cd shell_tut for ((i=0; i<10; i++)); do touch test_$i.txt done 示例解释 第1行:指定脚本解释器,这里是用/bin/sh做解释器的 第2行:切换到当前用户的home目录 第3行:创建一个目录shell_tut 第4行:切换到s

    • 问题内容: 我无法弄清楚这是怎么回事。当我在终端中运行它并输入密码时,什么也没发生,但是如果我在终端中单独运行每个命令,它就可以工作。谢谢! 问题答案: Command 启动一个交互式根外壳程序,但不会将当前外壳程序转换为根外壳程序。 做您想要的事情的成语与此类似(感谢@CharlesDuffy的额外注意): 这个想法是检查当前用户是否是root用户,如果不是,请使用以下命令重新运行同一命令

    • 问题内容: 在shell脚本中,美元符号后跟at符号()是什么意思? 例如: 问题答案: 是传递给脚本的 所有 参数。 举例来说,如果你打电话,然后将等于。 如果您这样做: 然后里面引用: 该参数将传递给每个参数,并用双引号引起来,从而允许调用者从空格中获取参数并将其传递。

    • 问题内容: 我正在看这段代码。我想知道以下代码段的含义 。 在一个问题中,它说代表字符串,但这是在Perl中。这里也一样吗? 此外,我想知道该变量是否自动更新。它已被初始化为开始时,但后来如何递增? 问题答案: 检查左操作数的值是否小于或等于()右操作数的值,如果是,则条件为true。 考虑: 那是真的。