标签: quoting

如何使用具有管道字符的模式对多个模式进行 grep?

我想在多个文件中找到与两种模式之一匹配的所有行。我试图通过键入来找到我正在寻找的模式

grep (foo|bar) *.txt
Run Code Online (Sandbox Code Playgroud)

但是外壳将它解释|为管道并在bar不是可执行文件时抱怨。

如何在同一组文件中搜索多个模式?

shell grep quoting regular-expression

764
推荐指数
7
解决办法
176万
查看次数

如何删除名称以“-”(连字符又名破折号或减号)开头的文件?

如何删除文件名以破折号(连字符或减号)开头的文件-?我通过 ssh 连接到远程 OSX 服务器,并且我的目录中有这个文件:

tohru:~ $ ls -l
total 8
-rw-r--r--    1 me  staff  1352 Aug 18 14:33 --help
...
Run Code Online (Sandbox Code Playgroud)

我怎么--help能从 CLI 中删除?这个问题是我偶尔以不同形式遇到的问题,这些文件很容易创建,但很难摆脱。

我试过使用反斜杠

rm \-\-help
Run Code Online (Sandbox Code Playgroud)

我试过引号

rm "--help"
Run Code Online (Sandbox Code Playgroud)

如何防止将减号(破折号或连字符)字符解释为选项?

command-line shell options quoting rm

428
推荐指数
6
解决办法
18万
查看次数

在 sh 脚本中使用 sed 时需要转义哪些字符?

执行以下脚本:

#!/bin/sh
sed 's/(127\.0\.1\.1)\s/\1/' [some file]
Run Code Online (Sandbox Code Playgroud)

如果我尝试在sh( dashhere) 中运行它,它会因为需要转义的括号而失败。但是,我并不需要转义反斜线本身(八位位组之间,或\s\1)。这里的规则是什么?当我需要使用{...}或 时[...]呢?有没有我做什么和不需要逃避的清单?

sed shell-script quoting

346
推荐指数
3
解决办法
56万
查看次数

为什么我的 shell 脚本会因空格或其他特殊字符而阻塞?

或者,有关强大的文件名处理和在 shell 脚本中传递的其他字符串的介绍性指南。

我写了一个 shell 脚本,它在大多数情况下运行良好。但它在某些输入(例如某些文件名)上窒息。

我遇到了如下问题:

  • 我有一个包含空格的文件名hello world,它被视为两个单独的文件helloworld.
  • 我有一个带有两个连续空格的输入行,它们在输入中缩小为一个。
  • 前导和尾随空格从输入行中消失。
  • 有时,当输入包含其中一个字符时\[*?,它们会被一些文本替换,这实际上是文件的名称。
  • 输入中有一个撇号'(或双引号"),在那之后事情变得很奇怪。
  • 输入中有一个反斜杠(或者:我使用的是 Cygwin 并且我的一些文件名具有 Windows 样式的\分隔符)。

这是怎么回事,我该如何解决?

shell bash shell-script quoting whitespace

341
推荐指数
3
解决办法
32万
查看次数

忘记在 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 的作者肯定没有打算让我们引用所有变量

如果我们揭露与此类行为相关的风险,也许我们可以说服他们。

如果您忘记引用变量,那么最糟糕的事情是什么。真的有那么糟糕吗?

我们在这里谈论什么样的漏洞?

在什么情况下会出现问题?

shell security bash shell-script quoting

241
推荐指数
3
解决办法
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$
Run Code Online (Sandbox Code Playgroud)

(图片)

另一个测试,文件名中包含单引号(也回答了 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'
Run Code Online (Sandbox Code Playgroud)

(图片)

使用新的 coreutils-8.26 输出进行更新(诚然,这不那么令人困惑,但默认情况下仍然令人恼火)。感谢 Pádraig Brady 提供此打印输出:

$ ls
"'test 1.txt'"   test1.txt
'test 1.txt'    "thishasasinglequotehere'.txt"

$ ls -N
'test 1.txt'  test1.txt
test 1.txt    thishasasinglequotehere'.txt
Run Code Online (Sandbox Code Playgroud)

为什么会这样?我如何正确停止它?

需要明确的是,我自己将 ls 设置为自动彩色输出。它从来没有在事物周围加上引号。

我正在运行bash,coreutils 8.25。

有什么方法可以在不重新编译的情况下解决这个问题?

编辑:出现 coreutils 开发人员选择)打破惯例并将其设为全局默认值。 …

ls debian coreutils upgrade quoting

226
推荐指数
3
解决办法
5万
查看次数

`(反引号/反引号)在命令中是什么意思?

我遇到了以下命令:

sudo chown `id -u` /somedir
Run Code Online (Sandbox Code Playgroud)

我想知道:`符号的含义是什么。例如,我注意到虽然上面的命令运行良好,但下面的命令却没有:

sudo chown 'id -u' /somedir
Run Code Online (Sandbox Code Playgroud)

shell quoting

222
推荐指数
4
解决办法
39万
查看次数

$VAR vs ${VAR} 以及引用或不引用

我可以写

VAR=$VAR1
VAR=${VAR1}
VAR="$VAR1"
VAR="${VAR1}"
Run Code Online (Sandbox Code Playgroud)

最终结果对我来说似乎都差不多。我为什么要写一个或另一个?这些中的任何一个都不是便携式/ POSIX 吗?

shell shell-script environment-variables posix quoting

184
推荐指数
3
解决办法
8万
查看次数

在 Bash 中引用 $(命令替换)

在我的 Bash 环境中,我使用包含空格的变量,并在命令替换中使用这些变量。

引用我的变量的正确方法是什么?如果这些是嵌套的,我该怎么做?

DIRNAME=$(dirname "$FILE")
Run Code Online (Sandbox Code Playgroud)

或者我在替换之外引用?

DIRNAME="$(dirname $FILE)"
Run Code Online (Sandbox Code Playgroud)

或两者?

DIRNAME="$(dirname "$FILE")"
Run Code Online (Sandbox Code Playgroud)

还是我使用反引号?

DIRNAME=`dirname "$FILE"`
Run Code Online (Sandbox Code Playgroud)

这样做的正确方法是什么?以及如何轻松检查报价是否正确?

shell bash quoting command-substitution

173
推荐指数
3
解决办法
15万
查看次数

如何在 cron 选项卡作业中执行`date`?

我想为日志文件名中包含当前小时的 cron 脚本创建一个日志文件。这是我尝试使用的命令:

0 * * * * echo hello >> ~/cron-logs/hourly/test`date "+%d"`.log
Run Code Online (Sandbox Code Playgroud)

不幸的是,我在运行时收到此消息:

/bin/sh: -c: line 0: unexpected EOF while looking for matching ``'
/bin/sh: -c: line 1: syntax error: unexpected end of file
Run Code Online (Sandbox Code Playgroud)

我曾尝试date以各种方式逃避该部分,但运气不佳。是否可以在 crontab 文件中内嵌进行此操作,或者我是否需要创建一个 shell 脚本来执行此操作?

cron quoting command-substitution

165
推荐指数
4
解决办法
15万
查看次数