Chen's Blog

Read The Fucking Source Code!


  • 首页

  • 归档

  • 分类

  • 标签

  • 关于

  • 搜索

shell之变量,字符串,数组,注释,参数传递

发表于 2018-05-20 | 分类于 shell |

Linux的Shell有很多种,常见的有Bourne Shell Bourne Again Shell C Shell K Shell Shell for Root
等,其中Bourne Again Shell,由于易用和免费,Bash在日常工作中被广泛使用,本系列文章就是基于B Shell进行探究的

linux命令集成

之前所讲的的linux命令,例如ls,cat,mkdir等等,都可以在shell里面得到执行
这里补充几个之前没提到但又比较有用的命令

  • 查看文件最后num行
    tail -n num filename
  • 查看文件最开始的num行
    head -n num filename
  • 改变创建目录的默认权限(使用777减去设置的值就是默认的权限)
    umask 026

  • 改变文件的所属
    chown user.group filename
    chown user filename
    chown .group filename

shell命令简单示例

1
2
#!/bin/bash
echo "Hello Shell"

以上就是一个简单的shell脚本示例
新建文件,按约定一般shell脚本后缀名为sh,这并不是一定的,因为Linux对于文件的识别并不是通过后缀名
后缀名对于Linux并没有作用,这样写是为了方便,算是一种行业规定,并非一定

文本开头的#!是一个约定的标记,用来告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell
echo 命令用于向窗口输出文本

shell可以直接运行,也可以作为输入源来运行
直接运行的话,需要将sh脚本赋予执行权限
作为输入源,需要使用/usr/sh来执行
前一种方式比较常见

Shell 变量

变量说明

在shell中,变量名和其他编程语言类似,变量名遵循字母数字下划线,数字不能开头
变量不需要指定类型,定义即可

1
key="test"

这里有一点值得注意,在其他编程语言中,往往为了美观,会在赋值号左右加上空格,而在shell中这样的做法是不可以的

变量赋值

在shell中,变量的赋值有两种方式
显示的赋值,例如

1
key="test"

语句赋值,shell可以使用其他语句的结果为变量赋值

1
for file in `ls /etc`

变量使用

使用一个变量,在变量名前面添加$符号,表示要获取这个变量的值

1
2
key="test"
echo $key

当变量与其他混合在一起,可以使用{}定义变量的边界

1
2
3
key_1="test1"
key_2="test"
echo ${key_1}{key_2}

此处如果不对边界加以区分,那么编译器将$以后当作变量,其输出的结果就不是预期值了

变量的一些细节

定义过的变量可以重新赋值
这也很好理解,在一般编程语言里面,变量的定义需要类型,再次赋值则不需要,而在shell里面是没有这种规定的,那么定义一个变量以后,要修改这个变量的值,那么只能和定义看上去一样了,从这个角度来说,有些资料说变量可以重定义,我认为说法是不准确的,这里准确来说应该是赋值

1
2
3
4
key="test1"
echo $key
key="test2"
echo $key

只读变量与删除变量

变量可以为只读,只需在前面加上readonly即可,只读变量的值一旦被定义,那么就不能修改

1
2
key="test"
readonly key

变量可以被删除,使用unset删除一个变量
删除的变量不能再被使用

1
2
key="test"
unset key

注意:unset不可以删除只读变量

Shell 字符串

字符串可以用单引号,也可以用双引号,也可以不用引号

单引号

单引号类的字符会保持原样,怎么写的就怎么用
例如存在变量key,在单引号中存在$key,那么他就是一个$key,与key变量没有任何关系

1
string='string test'

反引号一般也用于命令的执行,其等价于$()

双引号

双引号与单引号最大的区别在于单引号不可以有变量,而双引号可以,同时还可以存在转义字符

1
string="string test"

单双引号都可以对字符串进行拼接

1
2
3
4
key=" key "
str1="test"$key"ok"
str2="test${key}ok"
str3='test'$key'ok'

字符串操作

  • 获取字符串长度
    使用字符串的同时,在字符串变量前面加上#可以获取其长度

    1
    2
    string="test"
    echo ${#string}
  • 提取子字符串
    在要提取的字符串后面加上:可以获取其字串

    1
    2
    string="test"
    echo ${string:1:2}
  • 查找子字符串
    使用反引号定义其语句
    查找字符e或s的位置(哪个字母先出现就计算哪个)

    1
    2
    string="test"
    echo `expr index "$string" es`

Shell 数组

bash只支持一维数组(不支持多维数组),没有限定数组的大小
和其他语言一样,其可以通过下标来得到数组值,下标从0开始

定义数组

数组名=(值1 值2 ... 值n)
数组值之间通过空格隔开

1
testarr=(1 2 3 4)

其下标可以不连续,没有范围限制

读取数组

${数组名[下标]}
和一般变量使用类似

1
key=${test_arr[0]}

可以使用*或@来获取数组中的所用元素

1
2
echo ${test_arr[*]}
echo ${test_arr[@]}

获取数组的长度

数组长度

1
2
len=${#test_arr[@]}
len=${#test_arr[*]}

元素长度

1
len=${#test_arr[n]}

Shell 注释

单行注释

shell通过#进行注释

1
2
#这是一个注释
#这也是一个注释

多行注释

shell中的多行注释,使用:<<开始,其后面添加一个标志,然后在注释完成的地方再加一个同样的标志

1
2
3
4
5
:<<EOF
test
test
test
EOF

Shell 参数传递

Shell脚本在执行的时候可以对其传递参数
可以使用$n对其传递的参数接收
例如执行test.sh 1 2 3,在test.sh内可以使用$0代表程序本身,$1代表第一个参数
这和C语言main函数的参数接收是一样的

参数处理 说明
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数
$- 显示Shell使用的当前选项,与set命令功能相同
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误

优化apk的odex处理

发表于 2018-03-03 | 分类于 Android |

前文讲到了apk的反编译流程,但在有的情况下会出现apk的资源文件和代码文件分开的情况,这种情况会出现如下目录结构,并且在apk文件里面并没有dex文件。

阅读全文 »

Android 反编译技术流程

发表于 2018-03-03 | 分类于 Android |

作为一名Android开发者,很多的时候需要去学习别人优秀的代码,原本在GitHub上就有很多开源的项目代码,但有的时候在使用软件时候遇到自己想要的功能时,想要学习实现的代码时,这时候就需要使用到反编译这项技术了。

阅读全文 »

Android SDK目录说明

发表于 2017-12-19 | 分类于 Android |

在SDK目录下有很多文件夹,了解这个文件夹都包含哪些内容,更有利于Android的开发,也是作为Android开发者应该了解的。本文就SDK目录进行说明。

阅读全文 »

APK在Android Studio下如何签名

发表于 2017-12-18 | 分类于 Android |

Android系统要求每一个Android应用程序必须要经过数字签名才能够安装到系统中,也就是说如果一个Android应用程序没有经过数字签名,是没有办法安装到系统中的!

阅读全文 »

Android_7.1.1_r6源码编译

发表于 2017-12-17 | 分类于 Android |

上篇文章讲述了如何下载Android源码,在篇文章就来说一说Android源码编译。其实一般来说如果修改的软件和底层没什么关系,直接提取相应的源代码到Android Studio编译就可以了,如果是与底层有关的,做练习的话还是应该编一个的。在公司里都会有相应的编译环境的,大多数都是进行过二次开发的的系统源代码。话不多说,编译不编译还是看自己需求。接下来就来分享下编译的过程吧:

阅读全文 »
1…161718…34
chen

chen

200 日志
19 分类
276 标签
GitHub E-Mail Weibo QQ StackOverflow
友情链接
  • 虚位以待
0%
© 2016 — 2019 chen | Site words total count:
由 Hexo 强力驱动
|
主题 — NexT.Pisces
Hosted by GitHub Pages & Coding Pages