ruby之基础语法

摘要:
数值=哈希。new#创建一个新的哈希类型:numerical['first']=“myfirst”numerical[storage']=[{'name'=>'path'=>“/mnt/nfs1”}putsgitaly.size#2test=[]#新的空数组类型:test[0]=“a”test[1]='k'putst#ak数组增加:

ruby语法之哈希 =》相当于python的字典

ruby语法之数组 =》相当于python的列表

举例:

gitaly= Hash.new       #建立新Hash类型
gitaly['first']="myfirst"
gitaly['storage'] = [
   {
     'name' => 'default',
     'path' => '/tmp/path-1'
   },
   {
    'name' => 'nfs1',
    'path' => '/mnt/nfs1'
   }
 ]
puts gitaly          #{"first"=>"myfirst", "storage"=>[{"name"=>"default", "path"=>"/tmp/path-1"}, {"name"=>"nfs1", "path"=>"/mnt/nfs1"}]}
puts gitaly.keys     #first   storage
puts gitaly['storage'][0]  #{"name"=>"default", "path"=>"/tmp/path-1"}
puts gitaly['storage'][-1] #{"name"=>"nfs1", "path"=>"/mnt/nfs1"}
puts gitaly.size           # 2


test=[]   #新的空的数组类型
test[0]="a"
test[1]='k'
puts test  # a k

数组的增:
test << "b" #["a","k","b"]
test.push("b") #数组尾部增加元素
test.xshift("b") #头部增加元素
数组的删:
test.pop #后面不加元素,依次从尾部删除一个元素
test.shift #后面不加元素,依次从头部删除一个元素
test.delete("a") #删除元素a ,有多个a都删除
test.delete_at(2) #删除某个索引位置的元素
数组的去重:bb=test.uniq #不改变test的值,改变原数组用uniq!
数组变成字符串:kk=["a","b","a"];bb=kk.join("-") # a-b-a 使用某个符合连接,可以是多个字符
将字符串变成数组:kk="abcd";bb=kk.split(//) #【"a","b","c","d"】
数组的排序:kk=["a","b","a"];bb=kk.sort;puts bb # a a b

查看数据的类型

aa='aa'
puts aa.class

ruby语法之处理字符串

puts aa


aa='hello world'
aa['hello']='first' #匹配第一个符合条件的字符串,区别python的字符串
puts aa            #first world
puts aa.class      #string

aa='hello world'
aa[0..4]='first'
puts aa            #first world
puts aa.class      #string

aa='hello world hello'
aa.gsub('hello','first')  #替换所有符合条件的字符串
puts aa           #hello world hello
puts aa.class     #string


aa='hello world'
aa.insert 5,' my'  #在指定位置插入字符串
puts aa            #hello my world
puts aa.class      #string


kk='abc'
kk<<'def'    #用来拼接字符串
puts kk   #abcdef


#chomp和chomp!的区别是 chomp!会改变原字符串
aa='hello world!' aa.chop! #删除最后一个字符,改变了原字符串,使用chop不会改变原来的字符串 puts aa # hello world puts aa.class #string

#删除尾部指定单个字符或者字符串

  aa="hellohello"
  bb=aa.chomp!("o") #或者 bb=aa.chomp!("llo"),但是里面如果是he的话,bb就是空值,aa不变

  puts aa    #hellohell
  puts bb    #hellohell

#删除开头第一个字符
str[0]=""
#删除结尾最后一个字符
str[-1]=""

#使用delete方法删除指定字符串,deleteh和delete!区别和chomp类似
puts "hello".delete "abcdefghijkl" #o

#tr和tr! 修改成对应的字符,一个一个比对,没有则替换成前面一个替换的字母
"hello".tr!("lexyz","pi") #hippo
hello".tr("lho","km") #mekko -> l替换成k h替换成m,o也替换成m
#到这里发现tr命令很强大啊,那么可以用它来删除了
hellohello".tr("lh","") #eoeo

ruby插件之json将字符串转化成哈希

#!/usr/bin/ruby

require 'json'
aa="{"a":"1","b":"2"}"  #字符串,json里面没有单引号
bb=JSON.parse(aa)               #使用json进行转化
puts bb.class                   #类型变为Hash
puts bb["c"]                    #没有不报错,但是为空
puts bb["a"]                    # 1
puts bb                         # {"a"=>"1", "b"=>"2"}

ruby读入文件 IO.readlines

[root@orl11-infa ~]# cat test1.rb 
#!/usr/bin/ruby

arr=IO.readlines("tt.txt")
puts arr.class puts arr puts
"------------------------" puts arr[0] [root@orl11-infa ~]# vim test1.rb [root@orl11-infa ~]# ruby test1.rb #运行结果 Array #变成数组类型 1 first line 2 second line ------------------------ 1 first line

 ruby之写入文件

#先清空后写入
#!/usr/bin/ruby
File.open("r2.txt", "w+") do |file|
  file.puts "haha"
  file.puts "heihei"
  file.close()
end

#后面追加
File.open("r2.txt", "a+") do |file|
  file.puts "haha"
  file.puts "heihei"
  file.close()
end

ruby之打印文件的绝对路径

puts File.expand_path("r2.txt")

ruby之修改文件的权限

[root@orl11-infa ~]# cat test1.rb 
#!/usr/bin/ruby
file=File.new("tt.txt","w")
file.chmod(0755)
[root@orl11-infa ~]# ll tt.txt
-rw-r--r-- 1 root root 27 10月 28 16:22 tt.txt
[root@orl11-infa ~]# ruby test1.rb
[root@orl11-infa ~]# ll tt.txt
-rwxr-xr-x 1 root root 0 10月 28 16:27 tt.txt

 ruby语法之判断if

x=1
if x > 2
   puts "x 大于 2"
elsif x <= 2 and x!=0
   puts "x 是 1"
else
   puts "无法得知 x 的值"
end
其他:对当前条件不做处理,使用next

ruby语法之循环

for i in 0..5
   puts "局部变量的值为 #{i}"
end

ruby语法:循环each

[root@orl11-infa ~]# cat test2.rb 
#!/usr/bin/ruby

aa=['awk','block','cd']
aa.each do |temp|
  if temp.include? 'c'
    puts temp
  end
end

[root@orl11-infa ~]# ruby test2.rb
block
cd

 举例:根据之前logstash处理季度和search_name的问题现在完全可以用ruby语法处理

if "cdpTest" in [tags]{
  grok {
      match => { "message" => "|%{DATA:userName}|%{DATA:opreteTimeStamp}|%{DATA:year}-%{DATA:month}-%{DATA:day} %{DATA:hour}:%{DATA:other}|%{DATA:deviceModel}|%{DATA:pageName}|%{DATA:elementName}|%{DATA:params}|%{DATA:appKey}|%{DATA:ssoSource}|%{DATA:logType}|" }
  }
  ruby {
   code => "
   bb=event.get('[month]').to_i
   bb=(bb+2)/3
   cc=(bb.to_s)<<'季度'
   event.set('quarter',cc)
   aa=event.get('[params]')
   require 'json'
   dd=JSON.parse(aa)
   if dd['search_name']
      event.set('search_name',dd['search_name'])
   end
    " 
   remove_field => [ "message" ]      
  }
}
}

 ruby语法之计算昨天的日期

#!/usr/bin/ruby
require 'date'
day=Time.now
puts day.strftime("%Y%m%d")
day1=Date.new(day.year,day.month,day.day)
day1=(day1 - 1).strftime("%Y%m%d")
puts "昨天的日期:#{day1}"
str="hhh_v"<<day1
puts str

[root@orl11-infa ~]# ruby data.rb
20191028
昨天的日期:20191027
hhh_v20191027

 到了这里,我们就会想ruby语言和shell的交互

方式一:exec  取代当前进程,不产生子进程,它执行成功后,它后面的命令不会执行
exec "curl -XGET --user elastic:pass 'http://192.168.137.10:9200/_cat/indices' >rb1.txt"
方式二:使用反引号 ``,产生子进程,后面的命令可以执行
`curl -XGET --user elastic:pass 'http://192.168.137.10:9200/_cat/indices' >rb1.txt`
方式三:使用system,产生子进程,后面的命令会执行,返回命令执行的结果(true或者false)
cmd=system "curl -XGET --user elastic:pass 'http://192.168.137.10:9200/_cat/indices' >rb1.txt"
puts cmd #true
if cmd
puts 'success'
else
puts "failure"
end
方式四:使用%x,后面的命令会执行
%x(for i in `seq 1 5`;do echo $i;done)
%x(echo "hello";echo "haha")

其他:

ruby脚本的后缀 .rb
变量放入""里面时,puts "#{kk}"
字符串转化成整形:.to_i
整形转化成字符串:.to_s
导入模块:require 'json'
ruby脚本的语法检查:ruby -c 脚本
ruby在linux命令行中执行:ruby -e 'aa="abc";if aa.include? "b";puts "ok";else "no";end'
对命令取反,使用:!(正常命令),例如满足不包括的条件 !(bb.include? temp)
字符串以什么开头:str.start_with("a")
特殊符号: tab键 s 空格 换行 回车
跳出当前循环:next
退出整个循环:break
在linux的shell中输入 irb 进入ruby的语言环境,类似于输入python进入python环境
查看元素类型:puts a.class

免责声明:文章转载自《ruby之基础语法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇备忘录模式实例1Knockout 是什么?下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

pycharm常用配置详解

  PyCharm是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制。此外,该IDE提供了一些高级功能,以用于支持Django框架下的专业Web开发。 Windows版本下载地址:https://www.jetbrains....

关于Gradle配置的小结

前言 使用 Android Studio 来开发 Android 工程的过程中,接触 Gradle 是不可避免的,比如配置签名、引入依赖等。那么 Gradle 到底是什么东西呢? Gradle 是一个基于 Apache Ant 和 Apache Maven 概念的项目自动化建构工具。它使用一种基于 Groovy 的特定领域语言 (DSL) 来声明项目...

Android 高级UI设计笔记23:Android 夜间模式之 两种常用方法(降低屏幕亮度+替换theme)

1. 夜间模式  所谓的夜间模式,就是能够根据不同的设定,呈现不同风格的界面给用户,而且晚上看着不伤眼睛。特别是一些新闻类App实现夜间模式是非常人性化的,增强用户体验。 2. 我根据网上的资料 以及自己代码亲测,总结如下两种方法: (1)降低屏幕亮度 (2)替换theme 3. 夜间模式之 降低屏幕亮度: (1)创建一个Android工程,命名为"夜间模...

WebService 的Description 属性说明(转)

转自:http://exception.thinksaas.cn/0/173/173623.html  在WebMethod的description 中可使用超文本, 举例: 如上图中,红框类的WebService的接口说明是如何实现的?1、加粗字体的标题2、换行3、链接4、图标 这是服务接口http://www.webxml.com.cn/WebSer...

Ubuntu10.04下安装SQLite3(转贴)

Ubuntu linux下安装sqlite3 1.介绍:sqlite3是linux上的小巧的数据库,一个文件就是一个数据库。 2.安装: 要安装sqlite3,可以在终端提示符后运行下列命令: sudo apt-get install sqlite3 检查版本 sqlite3 -version 3.测试 当前目录下建立test.db测试数据库文件 s...

[.Net 5.0] 5.终于搞定了输出路径

多个项目,编译后都存放到指定目录,比如c:output,原来很简单的 debug、release修改一下输出目录就ok。 现在不行了,他会帮您放置在c:output et5.0,如果您是wpf项目,他要求net5.0-windows,这时候他又保存到c:output et5.0-windows,好烦人。 参考了(如何更精准地设置C#/.NETCore项目的...