Questions tagged «quoting»

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

2
在'bash -c'中添加参数
假设我想像这样通过Bash运行命令: /bin/bash -c "ls -l" 根据Bash的手册页,我也可以这样运行它: # don't process arguments after this one # | pass all unprocessed arguments to command # | | # V V /bin/bash -c ls -- -l 除非它似乎不起作用(它似乎被忽略了)。我是在做错什么,还是我在解释手册页时出错? 男人的相关语录: 如果存在-c选项,则从字符串读取命令。如果字符串后面有参数,则将它们分配给位置参数,从$ 0开始。 和 A-表示选项结束,并禁用进一步的选项处理。-后面的任何参数均被视为文件名和参数。

1
为什么不“查找”此文件?
find与配合使用grep,可以找到与模式匹配的文件: # find | grep error ./solr-modifiedSolr4/SolrPhpClient/phpdocs/errors.html ./error_log ./includes/classes/error_log 但是,find找不到单独使用第一个文件: # find . -name error* ./error_log ./includes/classes/error_log 不使用时为什么find找不到errors.html文件grep?如何find用于显示此文件?

1
如何确保插入到“ sed”替换中的字符串转义所有元字符
我有一个脚本,该脚本读取文本流并生成sed命令文件,该文件随后与一起运行sed -f。生成的sed命令类似于: s/cid:image002\.gif@01CC3D46\.926E77E0/https:\/\/mysite.com\/files\/1922/g s/cid:image003\.gif@01CC3D46\.926E77E0/https:\/\/mysite.com\/files\/1923/g s/cid:image004\.jpg@01CC3D46\.926E77E0/https:\/\/mysite.com\/files\/1924/g 假设生成sed命令的脚本类似于: while read cid fileid do cidpat="$(echo $cid | sed -e s/\\./\\\\./g)" echo 's/'"$cidpat"'/https:\/\/mysite.com\/files\/'"$fileid"'/g' >> sedscr done 如何改善脚本以确保cid字符串中的所有正则表达式元字符均已转义并正确插值?
21 sed  quoting 

2
嵌套的双引号在投票很高的单行代码中
一个具有> 3.5K票数的StackOverflow 答案具有此一类功能,可用于分配给DIR当前bash脚本的目录: DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" 我对嵌套的双引号感到困惑。据我所知,以下片段被双引号括起来: "$( cd " "${BASH_SOURCE[0]}" " && pwd )" ...,而=()$( dirname和())右边的其他所有内容均未引用。换句话说,我假设第二,第四和第六个"字符分别“关闭”了第一,第三和第五个"字符。 我知道"${BASH_SOURCE[0]}"实现了双引号,但是其他两对双引号的目的是什么? 另一方面,(尽管获得较高的投票分数)上述片段不正确,那么实现其名义意图的正确方法是什么? (按名义意图,我的意思是:将pwd第一个cd-ing 之后的返回值收集到由返回的目录中dirname "${BASH_SOURCE[0]}",并cd在子外壳中执行-ing,以便$PWD父外壳的保持不变。)

1
使用带有&符号的sed(&)
我使用sed在我拥有的SAS文件中查找和替换模式,而不是单独更改它们。问题是我正在尝试替换宏变量,并且在使用与号时无法正确处理。 Here's my code: sed -ie 's/user=&uid./user=&sysuserid./g' *_table_*.sas 每当我运行此命令时,它似乎都会附加并使用原始文本进行各种时髦的操作。 问题:如何用sed命令替换包含&符号的文本?
19 sed  quoting  replace 

4
如何使用eval为bash中的变量分配空格值
我想使用将值动态分配给变量eval。以下虚拟示例有效: var_name="fruit" var_value="orange" eval $(echo $var_name=$var_value) echo $fruit orange 但是,当变量值包含空格时eval,即使$var_value放在双引号之间,也会返回错误: var_name="fruit" var_value="blue orange" eval $(echo $var_name="$var_value") bash: orange : command not found 有什么办法可以避免这种情况?
19 bash  shell  quoting 

2
环境变量中单引号和双引号的意义是什么?
我在.profile中定义了一些环境变量,如下所示: MY_HOME="/home/my_user" 但是除非我去除引号并重新获取文件,否则该变量似乎不会求值。我相信,如果有空格,则必须使用引号;如果不希望使用转义符,则使用单引号。有人可以澄清变量定义中单引号和双引号的重要性吗?前叉和后叉怎么样?

3
为什么带引号的变量中的选项会失败,但不带引号的情况下会起作用?
我了解到我应该在bash中引用变量,例如“ $ foo”而不是$ foo。但是,在编写脚本时,我发现了一种情况,它不带引号但不带引号就可以工作: wget_options='--mirror --no-host-directories' local_root="$1" # ./testdir recieved from command line remote_root="$2" # ftp://XXX recieved from command line relative_path="$3" # /XXX received from command line 这个作品: wget $wget_options --directory_prefix="$local_root" "$remote_root$relative_path" 这个不会(注意$ wget_options周围的双引号): wget "$wget_options" --directory_prefix="$local_root" "$remote_root$relative_path" 这是什么原因呢? 第一行是好的版本;还是我应该怀疑某个地方存在隐藏的错误导致此行为? 通常,在哪里可以找到好的文档来了解bash及其引用的工作原理?在编写此脚本期间,我觉得我开始在反复试验的基础上工作,而不是理解规则。

6
执行时是否应将变量加引号?
Shell脚本编写的一般规则是,除非有明显的理由,否则应始终对变量加引号。要获得比您可能想知道的更多的详细信息,请查看以下精彩问答:忘记在bash / POSIX shell中引用变量的安全隐患。 但是,请考虑以下功能: run_this(){ $@ } 是否应该$@在那儿引用?我玩了一段时间,找不到引号不足引起问题的情况。另一方面,使用引号会使传递包含空格作为引号变量的命令时中断: #!/usr/bin/sh set -x run_this(){ $@ } run_that(){ "$@" } comm="ls -l" run_this "$comm" run_that "$comm" 运行上面的脚本将返回: $ a.sh + comm='ls -l' + run_this 'ls -l' + ls -l total 8 -rw-r--r-- 1 terdon users 0 Dec 22 12:58 da -rw-r--r-- 1 …

2
shell变量的扩展以及glob的影响和拆分
这篇文章实际上包含两个独立的问题,但我认为将它们组合在一起将提供更多的上下文。我已经在变量引号上讨论了这个问题,但我不太了解变量扩展首先是什么意思。所以我的第一个问题是: 在unix / linux中,变量扩展是什么? 我的问题的第二部分涉及以下术语: 球状 分裂 以上是什么意思,它们如何影响变量扩展?原始问题的答案提到以下内容: 将没有引号(在列表上下文中)视为split + glob运算符。 好像echo $ test是echo glob(split(“ $ test”))一样。 我找不到任何直接解决“ 遍历和分裂 ”概念的答案,而是直接将这些术语用于回答其他问题,例如最近的问题。

2
双引号内的单引号和Bash参考手册
Bash手册在标题为双引号的第3.1.2.3节中说: 用双引号('“')引起来的字符将保留所有引号内的字符的文字值,但'$','`','\'除外,并且在启用历史记录扩展时,会使用'!'。 目前,我关心的是单引号(')。 在上一节第3.1.2.2节中描述的特殊含义是: 将字符括在单引号(')中可保留引号内每个字符的字面值。即使在单引号前加反斜杠,也不能在单引号之间引起单引号。 结合两个论述, echo "'$a'" 其中a未定义变量(因此$a=空字符串),应$a在屏幕上打印,因为'',如果它在内部具有特殊含义,则可以避免$特殊解释。而是打印''。为什么这样?
18 bash  shell  quoting 

1
引用$(command $ arg)的正确方法是什么?
现在是解决困扰我多年的难题的时候了... 我不时遇到这个问题,并认为这是要走的路: $(comm "$(arg)") 并且认为我的观点得到了经验的大力支持。但是我不太确定了。Shellcheck也无法下定决心。两者都是: "$(dirname $0)"/stop.bash ^-- SC2086: Double quote to prevent globbing and word splitting. 和: $(dirname "$0")/stop.bash ^-- SC2046: Quote this to prevent word splitting. 背后的逻辑是什么? (这是Shellcheck 0.4.4版,顺便说一句。)

1
为什么这个ffmpeg命令在bash而不是zsh中起作用?
今天我下班回家(在Ubuntu盒子上运行bash),并尝试使用心爱的zsh在本地arch盒子上运行一些代码,命令是否失败? 下面的命令与个人信息和IP明显改变 ffmpeg -i rtsp://user:pass@my.webserver.org:5554/my-media/media.amp?videocodec=h264 -threads 3 -vcodec copy -f segment -segment_time 2 outfiles/cam_out%04d.mp4 它在bash中运行完美,但是在zsh中运行时出现错误 zsh: no matches found: rtsp://user:pass@my.webserver.org:5554/my-media/media.amp?videocodec=h264 为什么我心爱的zsh出卖了我?
17 bash  zsh  quoting  url 

5
使用生成的文件名列表作为参数列表-带空格
我正在尝试使用收集的文件名列表调用脚本find。没什么特别的,只是这样: $ myscript `find . -name something.txt` 问题在于某些路径名包含空格,因此在参数扩展时它们会分解为两个无效的名称。通常,我会在名称两边加上引号,但是在这里,它们会由反引号扩展插入。我试过find用引号过滤每个文件名的输出并用引号引起来,但是当bash看到它们时,剥离它们已经为时已晚,它们被视为文件名的一部分: $ myscript `find . -name something.txt | sed 's/.*/"&"/'` No such file or directory: '"./somedir/something.txt"' 是的,这是处理命令行的规则,但是如何解决呢? 这很尴尬,但我没有提出正确的方法。我终于想出了解决方法,但是xargs -0 -n 10000...我仍然想问这个丑陋的hack:我该如何引用反引号扩展的结果,或者以其他方式实现相同的效果? 编辑:我对xargs 确实将所有参数收集到一个参数列表中的事实感到困惑,除非被告知否则可能会超出系统限制。感谢大家使我挺直!其他人,在阅读已接受的答案时,请记住这一点,因为它不是很直接地指出。 我已经接受了答案,但我的问题仍然存在:是否存在某种方法来保护反引号(或$(...))扩展中的空间?(请注意,可接受的解决方案是非强制性的答案)。

2
bash中的双引号如何匹配(配对)?
我正在使用GNU bash 4.3.48。考虑以下两个仅相差一个美元符号的命令。 指令1: echo "(echo " * ")" 指令2: echo "$(echo " * ")" 它们的输出分别是 (echo test.txt ppcg.sh ) 和 * 因此很明显,在第一种情况下,*会出现问题,这意味着第一个引号与第二个引号形成一个对,而第三个和第四个引号形成另一个对。 在第二种情况下,*不会被混淆,并且输出中恰好有两个额外的空格,一个在星号之前,另一个在空格之后,这意味着第二个引号与第三个引号一起使用,第一个引号与第四个引号一起使用。 除了$()引号不与下一个引号匹配,而是嵌套的引号之外,还有其他情况吗?此行为是否已得到充分记录?如果是,我在哪里可以找到相应的文件?

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.