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,我会不定期的分享一些开发技巧

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267

推荐阅读更多精彩内容

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