📖 earlier posts 📖
Shell字符串操作是流行的脚本和开发语言之中最为容易和简单的一个,其特点是短小且好用如下:
变量的长度
1 2 3
| #! /bin/bash var='abcd' echo ${#var}
|
匹配字符串位置(expr index)
1 2 3 4
| #! /bin/bash one='abcdef' two='b' expr index "$one" "$two"
|
字符串的提取 (:)
1 2 3 4 5
| #! /bin/bash var='abcdef' one=0 two=3 echo ${var:$one:$two}
|
字符串替换
仅替换第一次出现字符串([@]/)
1 2 3
| #! /bin/bash var='Hello,world' echo ${var[@]/world/sun}
|
替换所有字符串([@]//)
1 2 3
| #! /bin/bash var='Hello,world,world' echo ${var[@]/world/sun}
|
在Shell脚本语言之中,主要分为echo 和 print两个输出语法,其中echo最为常见,本章主要介绍echo和print语法的输出和方法:
echo
echo语法可以显示普通的字符串、打印变量、方法等,其在Shell中最为常用:
打印普通字符串
1 2
| #! /bin/bash echo 'Hello,world'
|
打印变量
1 2 3
| #! /bin/bash var='Hello,world' echo $var
|
echo 方法
| ID |
DA |
FA |
| \ |
转义 |
echo “"Hello,world” |
| -e |
开启转义 |
echo -e “null” |
| \n |
换行 |
echo -e “null \n” |
| \c |
显示不换行 |
echo -e “null \c” |
printf
printf 是在Shell之中不为常用但依然需要用的方法,需要注意的是,printf命令是模仿C程序库(library)中的printf()程序
输出普通字符串
1 2
| #! /bin/bash printf 'hello,world'
|
输出变量
1 2 3
| #! /bin/bash var='world!' printf $var
|
printf 方法
| ID |
DA |
| \ |
转义 |
| \n |
换行 |
| \r |
回车 |
| \f |
换页 |
运算符基本格式
在Shell语言运算符之中,基本格式主要如下:
1 2
| variable_name=`expr val + val` echo "$one"
|
尝试数字进行相加
数值进行相加
1 2 3
| #! /bin/bash one=`expr 1 + 1` echo "$one"
|
在编写的过程中需要注意,此时的运算符符号不是通常的',而是"`"
函数进行相加
1 2 3 4 5
| #! /bin/bash one=10 two=20 val=`expr $one + $two` echo "$val"
|
运算符
算数运算符一览
| ID |
DA |
| + |
加法 |
| - |
减法 |
| * |
乘法 |
| / |
除法 |
| % |
取于 |
比较运算符
一个数组可以用一个名称保存多个值,数组的命名与变量的命名相同。而数组主要是由$来引用的,主要格式可分为:
1
| array_name {one two three ……}
|
数组的创建与输出
创建
数组的创建和变量一样,不用像PHP一样需要加上“$”,主要格式为:
1 2
| #! /bin/bash array_name=(one two three)
|
读取
1 2 3 4 5
| #! /bin/bash array_name=(one two three) echo "第一个键值为 ${array_name[0]}" echo "第二个键值为 ${array_name[1]}" echo "第三个键值为 ${array_name[2]}"
|
数组的函数与方法
所有元素读取
| ID |
DA |
TA |
| * |
输出所有数组中的数据 |
array_name[*] |
| @ |
输出所有数组中的数据 |
array_name[@] |
计算数组长度
| ID |
DA |
FA |
| # |
获取数组的所有长度 |
```$ |
参数可以在Shell脚本执行的时候传递给脚本,就好在你在终端下执行脚本“./test,sh Hello”此时脚本可能会输出信息为”Hello“,如下:
参数传递格式
1 2 3 4
| #! /bin/bash echo "当前执行程序为:$0"; echo "第二个输入参数为:$1”; echo “第三个输入参数为:$2”;
|
运行程序
1 2 3 4
| #! /bin/bash echo "当前执行程序为:$0"; echo "第二个输入参数为:$1"; echo "第三个输入参数为:$2";
|
参数传递函数
显示传递参数个数 ($#)
1 2 3 4 5
| #! /bin/bash echo "当前执行程序为:$0"; echo "第二个输入参数为:$1"; echo "第三个输入参数为:$2"; echo "总共传递参数个数为:$#";
|
列出所有传递参数数据($*)
1 2 3 4 5
| #! /bin/bash echo "当前执行程序为:$0"; echo "第二个输入参数为:$1"; echo "第三个输入参数为:$2"; echo "总共传递参数数据为:$*";
|
特殊变量
| ID |
DA |
FA |
| $0 |
当前Shell脚本文件名 |
|
| $! |
最后一个后台命令的进程号 |
|
| $$ |
显示当前脚本运行的PID进程号 |
|
| $? |
退出从状态 |
0 = 正确,0以外的值表示存在错误 |
输出与重定向
| ID |
DA |
FA |
| one > two |
将one重定向到two中 |
<>>> |
| two > one |
将输入重定向在one 中 |
|
| one >> two |
将输出以追加方式重定向到two中 |
|
|
|
|
| one >& two |
将输出文件one与tow合并 |
>&<& |
| two <& one |
将输入文件与two和one合并 |
|
外部变量一旦分配给值即创建,而变量客户一包含数字、字符串、字符等几乎所有数据类型,在Shell语言中,变量区分大小写,但可以由字母下划线和一些字符组成。
Shell 变量规则与变量类型
变量规则
1 2
| Variable_name = data # 创建变量 echo $Variable_name # 输出变量
|
变量类型
| ID |
DA |
FA |
| 局部变量 |
脚本或命令中定义 |
仅在当前Shell实例中有效 |
| 环境变量 |
所有的程序,包括自身都能访问的变量 |
|
| Shell变量 |
Shell变量中有一部分是环境变量有一部分是局部变量 |
特殊变量 |
| 在分配值的时候使用“=”符号完成,Shell语言规定在初始化变量时候“=”符号的任何一侧不允许有空格。 |
|
|
创建与输出变量
Shell中的变量与其他语言不同,在Shell中,变量格式以如下方式进行命名:
变量 = 数据
而不像其他编程语言之中,如PHP的变量则需要加上”$“来标明,Shell变量名称不允许有空格,但允许有下划线(_)或其他符号
创建变量
1 2
| #! bin/bash user_name="sun"
|
输出变量
1 2 3
| #! bin/bash user_name="sun" echo $user_name
|
变量的转义与运算符
转义
转义在众多开发语言之中都有的一个函数,在Shell中主要可以使用反斜杠(\)和**${}**封装来进行转义:
反斜杠
1 2 3
| #!/bin/bash name_user="sun\"top\"" echo $name_user
|
封装语句
1 2 3
| #!/bin/bash name_user="sun${top}" echo $name_user
|
连接符与变量函数
链接符
1 2 3 4
| one=1 two=2 three=$one+$two echo $three
|
变量函数
只读变量 (readonly)
只读变量即从字面意思上的变量,指当前变量仅仅可以进行输出但不可进行写入等操作
1 2 3 4
| #! /bin/bash one="hello" readonly one one="world"
|
删除变量 (unset)
1 2 3 4
| #! /bin/bash one="hello" unset one echo $one
|
通常,在实际工作需求之中可能会对正在运行的文件系统进行一些文件的特使,在这种情况下,Shell将会提供常用命令进行实现。
测试文件是否存在 (-e)
1 2 3 4 5 6 7
| #! /bin/bash file="home.jsp" if [ -e "$file" ]; then echo "文件存在" else echo "文件不存在" fi
|
测试目录是否存在(-d)
1 2 3 4 5 6 7
| #! /bin/bash dir="Public" if [ -d "$dir" ]; then echo "文件存在" else echo "文件不存在" fi
|
测试当前文件是否对运行的脚本具有读取权限(-r)
1 2 3 4 5 6 7
| #! /bin/bash public="test.sh" if [ -r "$file" ]; then echo "具有写入权限" else echo "不具有写入权限" fi
|
引入文件(. .\file)r
1 2 3
| #one.sh #! /bin/bash echo "Hello,one.sh"
|
1 2 3 4
| #two.sh #! /bin/bash . ./one.sh echo "Hello,two.sh"
|
| ID |
DA |
FA |
| -e |
测试文件是否存在 |
|
| -d |
测试目录是否存在 |
|
| -r |
测试当前文件读取权限 |
|
| . ./ |
引入文件 |
|
与许多开发或脚本语言一样,许多语言在第一次接触的时候都以“Hello,world”作为入门的第一课,目前我们需要介绍下Shell(命令过程,Shell Script)脚本语言也是一样。
本书的作用
本书总体上向读者简述了Shell脚本开发,主要列举了Shell解释其的Bash(Bourne Only Shell),和其他常见的Shell(列如sh、run)。
Shell语言的用处
Shell语言是用C语言编写的脚本语言,通常Shell即是命令语言,也是设计型语言。主要用于脚本开发,且经常出现在Linux环境下,大量的减少了相关命令参数(如批量apt-get install、或rm -rf)。
如何使用Shell
Shell脚本通常开发完时保存为“.sh”后缀“,并且给文件加上”chmod 777 file.sh“的可读写权限,之后使用”./file.sh“以运行Shell脚本。
Shell 代码规范
sha-bang
通常,shell脚本文件都以上述注释进行开头,”#!”后面跟着shell解释器所在的完整路径,该路径主要告诉当前操作系统,该文件是一种命令,我们主要称他为”sha-bang“即Shell脚本文件的第一行。
如果”sha-bang“目录不正确,则会出现一种错误的信息,如**”未找到命令”,通常我们开发完后都将以”.sh“**来命名。
输出Hello,world!
1 2
| #!/bin/bash echo "Hello,world!"
|
运行 .sh
1 2
| chmod 777 test.sh ./test.sh
|
注释
1 2
| #!/bin/bash echo "Hello,world" # 输出"Hello,world!"
|
与其他脚本语言一样,shell作为主流的脚本语言,通常以”#“进行注释,而脚本开发语言Python也和Shell脚本语言一样,使用”#“作为注释。
数据类型和其他函数
在R语言之中,与其他的语言进行相比,其中主要分为了数值(numeric)、字符(character)、日期(date)、布尔(logical)四种等数据类型,我们可以通过不同的函数对直进行判断等。
is.type(values)
is.numeric (数字型)
is.numeric通常的使用语法为is.numeric(values),即翻译做(values)是不是为numeric即数值型,通常会返回布尔型的数据分别为 true and false,如:
1 2 3
| > one <- 10 > is.numeric(one) [1] TRUE
|
1 2 3
| > two <- "hello" > is.numeric(two) [1] FALSE
|
is.character (字符串)
在这里我们需要注意的是,在赋值给two的字符串数据是需要使用""的,因为他是字符串类型的数据,而不是数值型。
1 2
| is.character(two) [1] TRUE
|
is.logical (布尔型)
由于R语言是严格区分大小写的,如你赋值给t是true,则r会报错,因为他判定这是一个字符串类型,但是你如果是大些的TRUE,他则会判断这是一个布尔型数据如:
1 2 3 4 5
| > t <- true Error: object 'true' not found > t <- TRUE > is.logical(t) [1] TRUE
|
class(values)
class(values)与is.type(values)的不同之处在于,class(values)则是告诉你该直的数据的类型信息,通过使用class可以查看特定直的数据类型,如:
Date
1 2
| > class(date) [1] "Date"
|
| ID |
DA |
FA |
| %H |
小时 |
基础格式 |
| %M |
分钟 |
|
| %S |
秒时 |
|
| %B |
月份 |
|
| %A |
星期 |
|
| %Y |
年份 |
|
| %p |
上午和下午 |
|
| %x |
直接显示日期 |
完整格式 |
| %c |
直接显示日期与时间 |
|
| %Y |
完整年份 |
|
as.integer()
character
在r语言中,时间类型是一个极为特别的,我们可以通过class告诉我们某个直的数据类型,但是如果要输出,我们可以使用r语言中的as.integer函数进行输出,其中的基本格式为
as.integer(strftime(values,’date参数’)
1 2 3 4
| > date <- as.Date("2021-1-28")
> as.integer(strftime(date,'%Y')) [1] 2021
|
我们可以根据对照上访的date数据表中的各个参数进行输出,但需要注意的是本书所提供的并不是date的全部参数,而是较为主要和常用的几个参数,读者可自行前往了解即可。
mode(values)
mode与class类似,也是直接告诉我们当前values的类型,通过使用mode\class我们都可以直接查询该values的数据类型,如本次我们以创建的向量为例:
而向量内的数据为1 2 3,所以被输出为数字型。
数据结构
在目前流行的语言之中,日R语言的殊绝结构可以说是相当的丰富且不同,主要分为向量(vector)、列表(list)、因子(factor)、矩阵(matrix)、数组(array)、数据框(data.frame)等六种类型。
向量
向量主要用于存储数值,字符型或逻辑数据的一维数组,执行组合功能的函数c()可以用于创建向量,单个向量中的数据类型是固定的,比如数值型向量中的元素就必须为向量。向量是组成R语言的一种最为常见的数据结构,分为三种类型分别为数值型、字符型、逻辑型等。
在R语言之中,创建向量的方式有很多函数都可以进行创建,分别为c()、seq()、rep()等函数可用于进行创建,本次我们将会使用c()进行演示创建向量。
c()
在R语言之中,我们可以使用c()创建一个向量
创建
1 2 3 4 5 6 7
| > c(1,2,3) [1] 1 2 3 ``` 这个时候我们会发现,所输出的向量也仅仅是输出,那么怎么让他们存储成一个直,我们可以使用赋值(=)即可: ##### 创建并存储 ```r > a = c(1,2,3)
|
输出存储于直中的向量
索引向量
在R语言之中,我们可以索引向量,这比较类似于Python之中的字典,但又与python中的字典不同:
1 2 3 4
| > c <- c(one=1.2,two=2.1,three=10,1) > c["one"] one 1.2
|
向量的长度 (length)
在r语言之中,为向量提供了一个长度查询与输出的一个函数,为length(),这个函数是单独为向量所提供长度查询的,结果如下:
向量的运算符
通常,在基本上所有的语言之中,运算符都会被通用,就是说基本上都适用,所以我们也可以进行向量和向量之间运算,如:
1 2 3 4
| > a = c(1,3,4) > b = c(1,3,4) > a+b [1] 2 6 8
|
注释
在众多语言之中,都将存在着一个注释,通常主要分为脚本语言和编程语言,主要的不同就是一个不需要编译器一个需要编译器,通常在注释上都会有一定的差别,最为明显的就是 //、#两种,通常脚本语言会使用后者,如python、shell等,而相似java、c等语言则使用前者。
“#”
1 2 3
| > > print("你好世界!") [1] "你好世界!"
|
在R语言之中,我们可以使用 快捷键ctrl+l来实现 clear and system clear的作用,这会让我们的屏幕保持干净且整洁。
“if(FALSE)”
1 2 3 4 5 6 7
| > if(FALSE) { + " + 1.one + 2.two + 3.three + " + }
|
赋值
在R语言之中,和其他语言的赋值较为不同,通常的赋值是使用等于号=,而R语言的则是小于号加一个减号<-,这样做可以更加直观的表示数据的赋值:
1 2 3 4
| > one <- 10 > two <- 20 > print(one + two) [1] 30
|
运算
正所谓计算机,通常很多语言都支持运算,我们统称为“运算符”,通过运算符,我们可以将两个变量或函数相加起来进行输出:
1 2 3 4
| > one <- 10 > two <- 20 > print(one + two) [1] 30
|
在本书中我们不会过多的讲解R语言的运算符,因为与其他语言都相互差不多,如果有兴趣的读者可自行进行学习和理解,也可翻阅知识库内的其他语言数据进行查看等。
📖 more posts 📖