Linux 命令与 Shell 脚本

Linux 命令与 Shell 脚本

【Linux文件处理 Day1】

前几天主要介绍了正则表达式的使用方法,这一期打算介绍一些 Linux 命令和 Shell 脚本,这些知识虽然不是我们必须要掌握的,但是它可以提高工作效率,而且这些知识对于开发者来说都是通用的,Android,iOS,后端,前端等,都需要一些 Linux 和正则表达式的知识。对于iOS开发者来说,Linux 的一些操作命令是薄弱环节,作者打算花费几天时间总结一下这方面的知识,旨在能够帮助更多同学不再害怕“命令”。如果在文中有不正确的地方,希望同学们能指点小弟一下。

【特别说明】下文提到所有的命令行的根路径均为:/Users/wangsuyan/desktop/linux,使用 man 某个命令 ,比如 man rm,可以查看详细使用。

  • 绝对路径:从根目录开始的全路径,一定是以 "/" 开头的;
    pwd : 当前所在的目录,pwd:/Users/wangsuyan/desktop/linux,这个路径也称为绝对路径;
  • . : 表示当前目录,pwd 可以显示当前所在的目录;
  • .. : 上一级目录,/Users/wangsuyan/desktop/linux 的上一级目录为:/Users/wangsuyan/desktop;
  • touch : 创建文件,touch lefe.js,创建文件 lefe.js,如果当前目录下已经有文件 lefe.js 文件,将修改 lefe.js 文件的创建时间;创建文件所在的目录不能包含没有创建的文件夹;
  • rm:移除文件,rm lefe.js 将移除 lefe.js 文件;
  • mv: 移动文件,mv lefe.js ../lefe2.js 将 lefe.js 文件移动到上一级目录,并重命名为 lefe2.js,lefe.js 文件将不在原目录下;
  • cat: 查看文件内容,cat lefe.js 查看 lefe.js 的内容;
  • head: 查看文件的内容,默认为前 10 行,head lefe.js 查看文件的前 10 行内容;
  • head -n 20 lefe.js 查看文件的前 20 行内容;
  • tail: 查看文件的内容,默认为末尾 10 行,tail lefe.js 查看文件的末尾 10 行内容;tail -n 20 lefe.js 查看文件的末尾 20 行内容;
  • cd(change directory): 进入文件目录;
  • mkdir(make directory): 创建目录,mkdir lefe 创建文件夹 lefe,mkdir -p lefe/lefe2/lefe3 创建多个目录;
  • rmdir(remove directory): 移除目录,rmdir lefe 删除 lefe 目录,将提升
  • rmdir: lefe: Directory not empty ,rmdir 只能删除目录中无文件的时候,使用 rm -r lefe 可以删除 lefe 目录及其所有的子目录;
  • cp: 复制目录到指点目录中,cp lefe.js ../ 复制 lefe.js 文件到指定的目录中,cp -r lefe ../ 复制目录到指点目录;
  • ls: 显示当前目录下的目录,ls -l : 显示文件的详细信息,ls -a 显示目录下所有文件或文件夹,包含隐藏的文件;
  • chmod: 改变文件的权限,chomd +x ./lefe.sh 改 lefe.sh 的添加执行权限,一般运行脚本前需要给脚本添加此权限;
  • file: 查看文件的类型,file lefe: lefe: directory,是目录文件;
  • find: 查找文件;
  • gzip: 压缩文件,gzip lefe.js 压缩 lefe.js 文件;
  • gunzip: 解压文件,gunzip lefe.js.gz;
  • tar: 压缩文件及其子文件,tar -zcvf lefe.tgz ./lefe 压缩文件夹 lefe 为 lefe.tgz, tar -zxvf ./lefe.tgz 解压 lefe.tgz 文件;

【Linux字符处理 Day2】

  • |:管道,两个命令之间可以使用管道符“|”链接,它可以把一个命令的输入作为下一个命令的输出;
  • grep: 搜索文本,
  • grep day lefe.js 搜索 lefe.js 文件中的 day;
  • grep -n day lefe.js 搜索 lefe.js 文件中的 day,可以显示文本所出现的行;
  • grep -i day lefe.js 搜索 lefe.js 文件中的 day,忽略大小写;
  • grep -c day lefe.js 搜索 lefe.js 文件中的 day 出现的次数;
  • grep -v day lefe.js 搜索 lefe.js 文件中不包含 day 的行;
  • sort: 文本排序
  • cat sort.js | sort 对文本进行排序;
  • cat sort.js | sort -r 对文本进行反向排序;
  • cat sort.js | sort -n 对文本进行排序,指定为数字,比如: 2,12,3 如果不使用参数 -n 排序结果为 12, 2, 3;反之为 2, 3, 12:
  • uniq: 删除重复的行,一般与 sort 配合使用,先排序,然后多结果进行去重;
  • cat lefe.js | sort | uniq 显示没有重复的行;
  • tr: 文本转换
  • cat lefe.js | tr -d 'day':删除 lefe.js 文件中的 'd','a' 和 ‘y’;
  • paste: 文本合并
  • paste -d '>' lefe.js sort.js:合并 lefe.js 和 sort.js 文件,是以行合并的,使用 '>' 链接两个文件中的行;
  • find: 查找文件,find 查找路径 -name 文件名
  • find ~/Desktop/linux -name 'lefe.js':查找 ~/Desktop/linux 下文件名为 lefe.js 的文件;
  • find ~/Desktop/linux -name '*.js':查找 ~/Desktop/linux 下后缀为 ‘js’ 的文件;

【Shell 脚本 Day3】

经过前几天对 Linux 命令的学习,已经掌握了大部分常用的命令,但是如果想要做的更好,可以学习一下 Shell 脚本,它可以把多条命令按自己的方式来执行。它可以提高我们的工作效率。比如最常见的是 pod install 命令,每次需要在终端输入:

cd /Users/wangsuyan/Desktop/project/Kmart
pod install

这种输入需要我们切换到项目的根目录,我们往往不记得自己项目的目录,查找时比较耗时。我们完全可以使用一个脚本(podlgsk.sh),直接执行(./podlgsk.sh)。

#!/bin/bash
cd /Users/wangsuyan/desktop/project/Kmart
pod install

执行(执行前需要给脚本执行权限,chmod +x podlgsk.sh):

$ ./podlgsk.sh

感受到脚本的“魅力”后,我们可以感受一下 @唐巧_body 查找未使用的图片的 shell 脚本。关于查找项目中未使用的图片也可以参考这里的 Python 脚本,用了你就会爱上它(开玩笑呢,别当真)。

#!/bin/sh

cd /Users/wangsuyan/Desktop/project/Kmart
PROJ=`find . -name '*.xib' -o -name '*.[mh]'`

for png in `find . -name '*.png'`
do
    name=`basename $png`
    if ! grep -qhs "$name" "$PROJ"; then
        echo "$png is not referenced"
    fi
done

【解析】

  1. cd /Users/wangsuyan/Desktop/project/Kmart,进入项目所在的目录;
  2. 查找项目中所有 png 图片;
  3. 遍历所有的 png 图片,使用 grep 命令查找项目中是否使用过该图片,如果未使用将打印出 xxx is not referenced;

【知识点】
cd 命令(进入项目的根目录);
find 命令(查找符合要求的文件,这里注意查找 xib,.h 和 .m 文件);
grep 命令(查找文本内容);
正则表达式,比如:'.[hm]' 和 '.xib'。 关于正则表达式的使用,上一期已经专门介绍了
Shell 脚本中的 for 循环,if 条件判断。

了解了 Shell 脚本的使用后,下一次将介绍一些它的基本语法,帮助读者可以看懂 Shell 脚本。

【Shell 脚本 Day4】

使用 Pod 的同学经常会遇到 "error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation." 错误,其实是 [CP] Check Pods Manifest.lock 这个脚本所起的作用。

Pod 中有 Manifest.lock 和 Podfile.lock 这两个文件,只要这两个文件的内容不一样就会报错上面这个错误。Podfile.lock 是大家共用的文件(用来保证我们每个人的Pod库版本一样),而Manifest.lock是本地的文件(自己用)。而【图2】中这个脚本正是做这样的事情。

解释下这个脚本:
shell 脚本总是以:#!/bin/bash 或者 #!/bin/sh 开头,它主要告诉系统执行这个文件需要那个解释器,进入 /bin 目录下可以看到 bash 和 sh 解释器;

  • diff 命令:判断两个文件的不同,比如 diff /Users/lefe/Desktop/project/Kmart/Podfile.lock /Users/lefe/Desktop/project/Kmart/pods/Manifest.lock >~/Desktop/shell.log 比较两个文件的不同,并重定向到 shell.log 文件中;
  • > 重定向符号,可以把输出命令输出到某个文件中而不是控制台;
  • echo 是脚本的输出,相当于 printf;
  • exit 1 退出,有了这个命令 Xcode 就会报错,你可以在 Xcode 中新建一个脚本,试试下面这个脚本:
echo "This is a test shell created by Lefe_x"
exit 1
  • $?: 指上条命令执行的结果,也就是 diff 执行的结果;

  • 下面是 shell 中的 if 语句:

if 条件 ; then
fi

如何在终端执行脚本:
假如有个叫 podlgsk.sh 的脚本,只要给予它执行权限(chmod +x podlgsk.sh),注意只需要给一次执行权限就行,下次运行脚本时就不需要给予执行权限了,然后直接 ./podlgsk.sh 即可。

===== 我是有底线的 ======
喜欢我的文章,欢迎关注我的新浪微博 Lefe_x,我会不定期的分享一些开发技巧

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 12,239评论 2 33
  • Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音。了解发音是有意...
    萤火虫de梦阅读 99,594评论 9 467
  • 1.Linux下如何用命令查看实时日志(完整命令) tail -f 路径.log查看前多少行 tai-200f 路...
    qianyewhy阅读 2,330评论 0 11
  • 建立一个脚本 Linux中有好多中不同的shell,但是通常我们使用bash (bourne again shel...
    某人在阅读 2,027评论 0 0
  • 吃到食伤! 酸香脆爽的水腌菜拌油香酥肉,配以瞬间就能激活味觉细胞的油辣子,一碗光吃,第二碗用酸辣透着甜...
    爻言之阅读 458评论 0 0