gpt4 book ai didi

bash - 带双引号、单引号和无引号的假设

转载 作者:行者123 更新时间:2023-11-29 08:51:28 24 4
gpt4 key购买 nike

在庆典中:

使用双引号

echo "*" #Globbing is never done
echo "$variable" # Variable expansion is always done
echo "$(command)" # command expansion is always done

使用单引号

echo '*' #Globbing is never done 
echo '$variable' # Variable expansion is never done
echo '$(command)' # command expansion is never done

不使用引号

echo * #Globbing always done.
echo $variable; # Variable expansion is always done
echo $(command) # command expansion is always done

这是否适用于所有命令?

最佳答案

看起来您正在寻找异常(exception)情况,我猜您已经想到了一些异常(exception)情况。我将假设 set -f/set -o noglob 被排除在这种情况之外?

当您使用 dd 命令时,即使未加引号也不会发生通配。

$ ls *.txt
blah.txt file1.txt file2.txt file.txt logfile.txt
$ dd if=*.txt of=glob.txt
dd: failed to open ‘*.txt’: No such file or directory

反驳和误报

这里有一些奇数的例子,但是会扩展

变量='2010-09-08 12:34:56'
echo “$变量” | xargs 日期 +%s -d
日期:额外的操作数 '12:34:56'

额外的操作数表明正在发生变量扩展,您正在丢失管道中的引号。$ 日期 +%s -d 2010-09-08 12:34:56
日期:额外的操作数‘12:34:56’

如果您创建一个脚本来 echo $1 然后在传递时扩展您引用的变量,也会发生这种情况。它扩展并按预期工作。所以,问题不在于 xargs,而在于你在管道之前的扩展,这是正常的。

  1. Eval... evals 的全部目的是在运行命令之前扩展其参数。 bash -c 也会发生扩展,只是它需要一个参数。所以,这不是扩展问题,而是命令使用问题。

cmd='printf "%s\n""$(date -d "$variable"+%c)"'
bash -c $cmd

和扩展版一样工作

$ bash -c printf "%s\n""$(date -d "$variable"+%c)"
printf: 用法: printf [-v var] 格式 [参数]

  1. 我真的很喜欢 Hauri 的 $'...' 和 $"..."信息——但是,我们谈论的不是同一件事。实际上,它们的行为正如 bash 手册页所说的那样。 $'' 与 '' 的区别就像 (()) 与 $(()) 的区别一样

  2. 我对这个很兴奋,所以...$ ls
    mclark.txt qt 登录.txt skel.bash
    $ zip m*t.zip *t
    $ ls *.zip
    m*t.zip

然而,这也不对——splat 扩展了,但在没有匹配的情况下 zip 将其用作文字。我找到了一些执行此操作的命令,但如果有匹配项(我稍后添加了一个 my.zip),它会使用匹配的扩展(抛出错误,b/c my.zip 是用于测试目的的文本文件)。

关于bash - 带双引号、单引号和无引号的假设,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36885461/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com