Questions tagged «quoting»

字符串通常用引号分隔,这引起了处理包含引号的字符串的问题。


10
如何删除名称以“-”开头的文件(连字符,即连字符或减号)?
如何删除文件名以破折号(连字符或减号)开头的文件-?我被放入远程OSX服务器中,并且我的目录中有以下文件: tohru:~ $ ls -l total 8 -rw-r--r-- 1 me staff 1352 Aug 18 14:33 --help ... 我该如何--help从CLI 删除?我有时会以不同的形式遇到此问题,这些文件易于创建,但很难消除。 我尝试使用反斜杠 rm \-\-help 我已经尝试过引号 rm "--help" 如何防止减号(连字符或连字符)被解释为选项?

5
为什么我的Shell脚本会在空白或其他特殊字符上造成窒息?
或者,一个介绍性的指南,介绍了强大的文件名处理以及其他在Shell脚本中传递的字符串。 我编写了一个外壳脚本,该脚本在大多数情况下都能正常工作。但是它在某些输入(例如某些文件名)上阻塞了。 我遇到了以下问题: 我有一个包含空格的文件名hello world,它被视为两个单独的文件hello和world。 我的输入行有两个连续的空格,它们在输入中缩小为一个。 开头和结尾的空格从输入行中消失。 有时,当输入包含一个字符时\[*?,它们会被一些实际上是文件名的文本替换。 输入中有撇号'(或双引号"),从那以后事情变得很奇怪。 输入中有一个反斜杠(或:我正在使用Cygwin,并且我的某些文件名具有Windows样式的\分隔符)。 怎么回事,如何解决?

3
在sh脚本中使用sed时,我需要转义哪些字符?
采取以下脚本: #!/bin/sh sed 's/(127\.0\.1\.1)\s/\1/' [some file] 如果我尝试在sh(dashhere)中运行此命令,它将由于括号而失败,该括号需要转义。但是,我并不需要转义反斜线本身(八位位组之间,或\s或\1)。这是什么规则?那我什么时候需要使用{...}或[...]呢?有我要做的和不需要逃避的工作的清单吗?

3
忘记在bash / POSIX shell中引用变量的安全隐患
如果您已经关注unix.stackexchange.com一段时间了,那么您现在应该希望知道,echo $var在Bourne / POSIX shell(zsh是例外)的列表上下文中(如)在列表上下文中不加引号的变量具有非常特殊的含义,并且除非您有充分的理由,否则不应该这样做。 在此处的许多问答中对此进行了详细讨论(示例:为什么我的shell脚本为什么在空格或其他特殊字符上感到窒息?,何时需要双引号?,shell变量的扩展以及glob对其的影响和split,引用vs无引号的字符串扩展) 自从70年代末Bourne shell首次发布以来就是这种情况,但Korn shell(David Korn的最大遗憾之一(问题#7))并没有改变它,或者bash主要是复制了Korn shell,这就是POSIX / Unix如何指定的。 现在,我们仍然在这里看到许多答案,甚至偶尔看到一些不引用变量的公开发布的shell代码。您可能以为人们现在已经学到了。 根据我的经验,主要有3种类型的人忽略了引用其变量: 初学者。可以原谅这是完全不直观的语法。这是我们在此站点上进行教育的职责。 健忘的人。 甚至在反复敲打之后仍然没有被说服的人,他们认为Bourne shell的作者肯定不打算让我们引用所有变量。 如果我们暴露与此类行为相关的风险,也许我们可以说服他们。 如果忘记引用变量,最糟糕的事情莫过于发生。真的那么糟糕吗? 我们在这里谈论什么样的漏洞? 在什么情况下会出现问题?

3
为什么“ ls”突然用单引号引起来用空格包装项目?
我只是注意到,在我的其中一台机器上(运行Debian Sid),只要键入ls任何带空格的文件名,都将单引号引起来。 我立即检查了别名,却发现它们完整无缺。 wyatt@debian630:~/testdir$ ls 'test 1.txt' test1.txt wyatt@debian630:~/testdir$ alias alias ls='ls --color=auto' alias wget='wget --content-disposition' wyatt@debian630:~/testdir$ (图片) 另一个测试,文件名称中包含单引号(也回答jimmij的请求): wyatt@debian630:~/testdir$ ls 'test 1.txt' test1.txt 'thishasasinglequotehere'\''.txt' wyatt@debian630:~/testdir$ touch "'test 1.txt'" wyatt@debian630:~/testdir$ ls ''\''test 1.txt'\''' test1.txt 'test 1.txt' 'thishasasinglequotehere'\''.txt' (图片) 使用新的coreutils-8.26输出进行更新(虽然它的混乱程度要小得多,但是默认情况下仍然很烦人)。感谢PádraigBrady的此打印输出: $ ls "'test 1.txt'" test1.txt 'test 1.txt' "thishasasinglequotehere'.txt" $ ls -N …



3
在Bash中的$(命令替换)中报价
在我的Bash环境中,我使用包含空格的变量,并且在命令替换中使用这些变量。不幸的是我找不到关于SE的答案。 引用变量的正确方法是什么?如果将它们嵌套,该怎么办? DIRNAME=$(dirname "$FILE") 还是我在替代词之外引用? DIRNAME="$(dirname $FILE)" 或两者? DIRNAME="$(dirname "$FILE")" 还是我会使用反引号? DIRNAME=`dirname "$FILE"` 什么是正确的方法?我如何轻松检查报价是否设置正确?

1
什么时候需要双引号?
过去的建议是,将涉及a的任何表达式都用双引号括起来$VARIABLE,至少如果一个人希望它被shell解释为一个单独的项目,否则,内容中的任何空格$VARIABLE都会抛弃shell。 但是,据我了解,在最新版本的Shell中,不再总是需要使用双引号(至少出于上述目的)。例如,在bash: % FOO='bar baz' % [ $FOO = 'bar baz' ] && echo OK bash: [: too many arguments % [[ $FOO = 'bar baz' ]] && echo OK OK % touch 'bar baz' % ls $FOO ls: cannot access bar: No such file or directory ls: cannot access …

6
如何在cron标签作业中执行`date`?
我想为cron脚本创建一个日志文件,该日志文件名称中包含当前小时。这是我尝试使用的命令: 0 * * * * echo hello >> ~/cron-logs/hourly/test`date "+%d"`.log 不幸的是,我在运行时收到此消息: /bin/sh: -c: line 0: unexpected EOF while looking for matching ``' /bin/sh: -c: line 1: syntax error: unexpected end of file 我尝试过date各种方式使零件逃脱,但运气不佳。是否可以在crontab文件中在线进行此操作,还是需要创建Shell脚本来执行此操作?

4
为什么带无引号的空格的参数扩展在双括号“ [[”内有效,而在单括号“ [”内无效?
我对使用单括号或双括号感到困惑。看下面的代码: dir="/home/mazimi/VirtualBox VMs" if [[ -d ${dir} ]]; then echo "yep" fi 尽管字符串包含空格,它仍可以完美地工作。但是当我将其更改为单括号时: dir="/home/mazimi/VirtualBox VMs" if [ -d ${dir} ]; then echo "yep" fi 它说: ./script.sh: line 5: [: /home/mazimi/VirtualBox: binary operator expected 当我将其更改为: dir="/home/mazimi/VirtualBox VMs" if [ -d "${dir}" ]; then echo "yep" fi 它工作正常。有人可以解释发生了什么吗?什么时候应该在变量周围"${var}"加上双引号,以防止空格引起问题?
86 bash  quoting  ksh  test 

7
不能在bash中使用感叹号(!)?
我正在尝试使用curl命令访问!其路径中带有感叹号()的http url 。例如: curl -v "http://example.org/!287s87asdjh2/somepath/someresource" 控制台会回复bash: ... event not found。 这里发生了什么?逃脱感叹号的正确语法是什么?

7
使用sed查找并替换复杂的字符串(最好使用正则表达式)
我有一个包含以下内容的文件: <username><![CDATA[name]]></username> <password><![CDATA[password]]></password> <dbname><![CDATA[name]]></dbname> 并且我需要制作一个脚本,将第一行中的“名称”更改为“ something”,第二行中的“密码”更改为“ somethingelse”,第三行中的“ name”更改为“ somethingdifferent”。我不能依靠它们在文件中出现的顺序,因此我不能简单地将“名称”的第一次出现替换为“某物”,并将第二次出现的“名称”替换为“某物”。我实际上需要搜索周围的字符串,以确保找到并替换了正确的东西。 到目前为止,我已经尝试过以下命令来查找和替换第一个“名称”出现的位置: sed -i "s/<username><![CDATA[name]]><\/username>/something/g" file.xml 但是它不起作用,所以我认为其中某些字符可能需要转义,等等。 理想情况下,我希望能够使用正则表达式来匹配两个“用户名”的出现并仅替换“名称”。像这样的东西,但是sed: <username>.+?(name).+?</username> 并用“ something”代替括号中的内容。 这可能吗?

3
在脚本中包含$“美元符号前缀的字符串”是什么意思?
我刚刚在初始化脚本中看到了这一点: echo $"Stopping Apache" 那美元符号是做什么用的? 到目前为止,我的研究: 我在bash手册中发现了这一点: 引号 如果设置,$'string'并且$"string"加引号内执行${parameter}双引号括起来的扩展。默认情况下启用此选项。 ...但是我没有发现带有和不带有$前缀的字符串之间的任何区别: $ echo "I am in $PWD" I am in /var/shared/home/southworth/qed $ echo $"I am in $PWD" I am in /var/shared/home/southworth/qed $ echo $"I am in ${PWD}" I am in /var/shared/home/southworth/qed $ echo "I am in ${PWD}" I am in /var/shared/home/southworth/qed …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.