我对 bash 解析输入和执行扩展的方式感到困惑。
对于输入来说,\'"\"hello world\"" 在 bash 中作为参数传递给显示其输入内容的脚本,我不确定 Bash 是如何解析它的。
例子,
var=\'"\"hello world\""
./displaywhatiget.sh "$var"
I got '"hello world"
我明白 "$var" 中的双引号告诉 bash 将 var 的值放在一起。但是,我不明白的是,在 bash 的扩展过程中,反斜杠转义和双引号解析是什么时候发生的。
我来自shell-operation , 和 shell expansion .
最佳答案
所有有趣的事情都发生在作业中,var=\'"\"hello world\""。让我们分解一下:
\' - 这是转义的单引号。如果没有转义,它将开始一个单引号字符串,但转义它只是一个文字单引号。因此,最终字符串将以 ' 开头。" - 这将开始一个双引号字符串。\" - 转义双引号;与转义单引号一样,这被视为文字双引号,因此 " 将是第二个字符最后的字符串。hello world - 由于我们仍在双引号字符串中,因此它只是按字面意思包含在最终字符串中。请注意,如果此时我们没有使用双引号,空格将标记字符串的结尾。\" - 另一个转义双引号;再次按字面意义包含,因此最终字符串的最后一个字符将是 "。" - 这将关闭双引号字符串。因此,var 被赋予值 '"hello world"。在 ./displaywhatiget.sh "$var" 中,双引号表示 $var 被替换为 var 的值,但没有进一步解释完成;那只是直接传递给脚本。
更新:当使用 set -vx 时,bash 以一种有点奇怪的方式打印赋值。正如我在评论中所说,它所做的是获取原始命令,解析它(如上所述)以弄清楚它的含义,然后将其反向翻译以获得等效命令(即具有相同命令的命令影响)。它提供的等效命令是 var=''\''"hello world"'。解析方式如下:
'' - 这是一个零长度的单引号字符串;它没有任何效果。我不确定为什么 bash 包含它。我很想称它为错误,但它实际上不是错误,只是完全没有意义。顺便说一句,如果您想要一个删除引号的示例,请看这里:在此命令中,这些引号将被删除而不会留下任何痕迹。\' - 这是一个转义的单引号,就像在原始命令中一样。最终字符串将以 ' 开头。' - 这开始一个单引号字符串。除了查找闭引号外,单引号内根本不进行任何解释。"hello world" - 因为我们在单引号字符串中,所以它只是按字面意思包含在最终字符串中,包括双引号和空格.' - 这将关闭单引号字符串。所以它得到分配给 var 的相同值,只是写法不同。这些中的任何一个也会产生相同的效果:
var=\''"hello world"'
var="'\"hello world\""
var=\'\"hello\ world\"
var="'"'"hello world"'
var=$'\'"hello world"'
...还有很多其他的。从技术上讲,bash 可以在 set -vx 下打印任何这些。
关于linux - Bash 解析和 shell 扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41655630/
我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我正在使用ruby1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"
这可能是个愚蠢的问题。但是,我是一个新手......你怎么能在交互式rubyshell中有多行代码?好像你只能有一条长线。按回车键运行代码。无论如何我可以在不运行代码的情况下跳到下一行吗?再次抱歉,如果这是一个愚蠢的问题。谢谢。 最佳答案 这是一个例子:2.1.2:053>a=1=>12.1.2:054>b=2=>22.1.2:055>a+b=>32.1.2:056>ifa>b#Thecode‘if..."startsthedefinitionoftheconditionalstatement.2.1.2:057?>puts"f
简而言之错误:NOTE:Gem::SourceIndex#add_specisdeprecated,useSpecification.add_spec.Itwillberemovedonorafter2011-11-01.Gem::SourceIndex#add_speccalledfrom/opt/local/lib/ruby/site_ruby/1.8/rubygems/source_index.rb:91./opt/local/lib/ruby/gems/1.8/gems/rails-2.3.8/lib/rails/gem_dependency.rb:275:in`==':und
我想这样组织C源代码:+/||___+ext||||___+native_extension||||___+lib||||||___(Sourcefilesarekeptinhere-maycontainsub-folders)||||___native_extension.c||___native_extension.h||___extconf.rb||___+lib||||___(Rubysourcecode)||___Rakefile我无法使此设置与mkmf一起正常工作。native_extension/lib中的文件(包含在native_extension.c中)将被完全忽略。
我从Ubuntu服务器上的RVM转移到rbenv。当我使用RVM时,使用bundle没有问题。转移到rbenv后,我在Jenkins的执行shell中收到“找不到命令”错误。我内爆并删除了RVM,并从~/.bashrc'中删除了所有与RVM相关的行。使用后我仍然收到此错误:rvmimploderm~/.rvm-rfrm~/.rvmrcgeminstallbundlerecho'exportPATH="$HOME/.rbenv/bin:$PATH"'>>~/.bashrcecho'eval"$(rbenvinit-)"'>>~/.bashrc.~/.bashrcrbenvversions
我正在使用ruby2.1.0我有一个json文件。例如:test.json{"item":[{"apple":1},{"banana":2}]}用YAML.load加载这个文件安全吗?YAML.load(File.read('test.json'))我正在尝试加载一个json或yaml格式的文件。 最佳答案 YAML可以加载JSONYAML.load('{"something":"test","other":4}')=>{"something"=>"test","other"=>4}JSON将无法加载YAML。JSON.load("