安卓学习笔记--bash脚本

在linux系统下开发软件,常常感觉比较吃力的地方是看不懂各种脚本,因为脚本的语法实在是太诡异了,短短的几行脚本,写得像火星文,也许创造脚本的那些geeks智商太高,以为我们这些初入门者能看得懂他的火星文。

闲话少说,先记录一下一些简单的心得。

关于返回参数:

set -e          这一行的意思是,后面的脚本只要返回非零的值,就马上结束,后面的命令不再执行

$?           这么简化的符号是为了便于频繁的使用,这里代表上一个命令的返回值,如果是函数,就表示是函数return后面的值


脚本的输入类型有3种:

1. 用户输入

2. 前一个脚本的输出

3. 脚本的函数的参数


$n  n为1--9的数,用户输入的参数。在bash脚本里,所有参数都是字符串类型,没有数字,小数这些


read, in , case , esac 这些都是linux命令,case 与 esac搭配使用,就像if 搭配 fi


`ls`          这个不是单引号,而是键盘!号左边的键,用这2个符号包住的是linux命令,然后它执行后返回的值就可以作为其他命令的输入。


$@     这个符号代表所有传进来的参数,而且是已空格为区分

$*       代表所有参数,但不做区隔,是以整个字符串传进来

$#       表示传进来但参数的个数

$$       当前命令所在的进程号 pid


bash脚本比较运算符

-n   操作数的长度不为零

-z   操作数的长度为零

-d  操作数对应一个目录 (意思是如果当前的路径存在这么一个目录,就返回1,否则返回0,通常用来检查当前路径是否正确)

-f   操作数对应一个文件

-eq   整数相等

=  判断字符串是否相等

!= 字符串不相等


分析一个具体的脚步文件,就是一个编译全志kernel的脚本,

[plain] view plain copy
  1. #!/bin/bash       必须这样写,方便系统识别这个是bash格式的脚本                                                                                                                                                            
  2.  2   
  3.  3 set -e         如果执行的命令返回非0值,立刻中止,不再往下执行命令  
  4.  4   
  5.  5 buildroot/scripts/mkcommon.sh $@      调用另外一个脚本,同时通过$@符号把用户传进来的参数变量传给mkcommon.sh这个脚本。通常我们调用这个脚本  
[plain] view plain copy
  1. 是带了参数的,$./build.sh -p sun7i_android 这样,所以,等于说有2个参数传给下一个脚本。                            

然后我们继续看mkcommon.sh这个脚本:
[python] view plain copy
  1. #!/bin/bash  
  2. #  
  3. # scripts/mkcommon.sh  
  4. # (c) Copyright 2013  
  5. # Allwinner Technology Co., Ltd. <www.allwinnertech.com>  
  6. # James Deng <csjamesdeng@allwinnertech.com>  
  7. #  
  8. # This program is free software; you can redistribute it and/or modify  
  9. # it under the terms of the GNU General Public License as published by  
  10. # the Free Software Foundation; either version 2 of the License, or  
  11. # (at your option) any later version.  
  12.   
  13. BR_SCRIPTS_DIR=`dirname $0`   ---------获取当前的路径,因为我们执行这个脚本的位置是在lichee这个目录下面的,dirname是一个linux命令,$0就是脚本的名字,通常$1--9代表参数,那么$0代表命令或者脚本本身。也就是mkcommon.h这个脚本本身所在的路径。  
  14.   
  15. if [ "$1" = "pack" ] ; then       ----如果传进来的第一个参数是pack的话  
  16.     ${BR_SCRIPTS_DIR}/build_pack.sh    ---跑去执行pack的脚本  
  17.     exit 0  
  18. fi  
  19.   
  20. # source shflags  
  21. . ${BR_SCRIPTS_DIR}/shflags/shflags ----用一个点号,然后后面跟的通常也是一个脚本,是用来代替source这个命令的,就是把一些外部的变量或者模块导入进来  
  22.   
  23. . ${BR_SCRIPTS_DIR}/mkcmd.sh     ----这个导入进来的是一些负责编译的函数  
  24.   
  25. # define option, format:  
  26. #   'long option' 'default value' 'help message' 'short option'  
  27. DEFINE_string 'platform' 'sun7i' 'platform to build, e.g. sun7i' 'p'  ---这里定义可选的平台        
  28. DEFINE_string 'board' '' 'board to build, e.g. evb' 'b'         ----定义可选的板  
  29. DEFINE_string 'module' '' 'module to build, e.g. buildroot, kernel, uboot, clean' 'm'  --定义编译的模组类型  
  30. DEFINE_boolean 'independent' false 'output build to independent directory' 'i'        ----不清楚  
  31.   
  32. # parse the command-line  
  33. FLAGS "$@" || exit $?        ----检查命令行,就是传递进来的参数,FLAGS相信就在刚才source进来的函数  
  34. eval set -- "${FLAGS_ARGV}"   ----暂时看不懂  
  35.   
  36. chip=${FLAGS_platform%%_*}      ---初始化这些变量  
  37. platform=${FLAGS_platform##*_}  
  38. board=${FLAGS_board}  
  39. module=${FLAGS_module}  
  40.   
  41. if [ "${platform}" = "${chip}" ] ; then   ---为什么platform = chip就把platform设置为linux呢?  
  42.     platform="linux"  
  43. fi  
  44.   
  45. if [ -z "${module}" ] ; then            ---大概是默认的意思吧,就是当用户没有设定这一项的时候就给它个默认值,-z就是长度为0的意思  
  46.     module="all"  
  47. fi  
  48.   
  49. if ! init_chips ${chip} || \      ------看不太懂  
  50.    ! init_platforms ${chip} ${platform} ; then  
  51.     mk_error "invalid platform '${FLAGS_platform}'"  
  52.     exit 1  
  53. fi  
  54.   
  55. if [ ${FLAGS_board} ] && \  
  56.    ! init_boards ${chip} ${platform} ${board} ; then  
  57.     mk_error "invalid board '${FLAGS_board}'"  
  58.     exit 1  
  59. fi  
  60.   
  61. # init output directory  
  62. init_outdir       ----初始化输出的目录的函数,具体的实现在之前source进来的脚本  
  63.   
  64. if [ ${module} = "all" ]; then   ---如果用户选择module的类型是all的话,就调用mklichee这个命令,也就是函数  
  65.     mklichee  
  66. elif [ ${module} = "boot" ] ; then  
  67.     mkboot  
  68. elif [ ${module} = "buildroot" ] ; then  
  69.     mkbr  
  70. elif [ ${module} = "kernel" ] ; then  
  71.     mkkernel  
  72. elif [ ${module} = "uboot" ] ; then  
  73.     mkuboot  
  74. elif [ ${module} = "clean" ] ; then  
  75.     mkclean  
  76. elif [ ${module} = "mrproer" ] ; then  
  77.     mkmrproer  
  78. elif [ ${module} = "distclean" ] ; then  
  79.     mkdistclean  
  80. else                   ------如果什么都不是,就报错  
  81.     mk_error "invalid module '${module}'"  
  82.     exit 1  
  83. fi  
  84.   
  85. exit $?      ---退出并返回最后一个命令返回的值  






http://blog.csdn.net/johnny_nass_hu/article/details/38848827

安卓系统下的bash shell,ssh服务器,gcc编译器以及vim文本编辑器等 使用vim编辑多个文件 vim file1 file2 file3 ... :next查看或编辑后一个文档的内容 :prev查看或编辑前一个文档的内容 :first查看或编辑第一个文档的内容 :last查看或编辑最后一个文档的内容 vim -o|-O file1 file2 file3 -o:水平显示多个文件 -O:垂直显示多个文件 Ctrl+w arrow(箭头) 光标移动 Ctrl+w,s讲一个文件水平分屏显示 Ctrl+w,v将一个文件垂直分屏显示 :qa 全部退出 :wa 全部保存 将其他文件中的内容填充到当前文件中 :r (/PATH/TO/SOMEFILE)这是解释 跟shell交互 :!命令(command) 部分另存为 :w(全部保存) :m,nw(从第m行到第n行) :m,+n :.,$w 默认系统中所支持的shell cat /etc/shells bash特性 命令别名:自定义命令 alias:可以用来定义和设置命令的别名 注意:使用alias命令定义的别名其生命周期仅限于当前shell的生命期;如果修改.bashrc配置文件,其中保存的别名并不会立即生效,只有在重新加载该文件内容之后才会生效且永久生效;为了能够保证设置别名有效,通常两种操作都做 撤销别名:unalias . .bashrc:将.bashrc的命令读取 命令历史: bash进程会保存其会话中用户曾经执行的命令,以方便用户重复执行某个命令通过bash提供的历史命令文件来持久保存此前执行过的命令,用户由私有历史文件 登陆shell的时候,bash会自动读取~/.bash_history文件中所记录的所有命令 history命令: -c:清空历史缓冲区中的历史命令; -d OFFSET:删除特定历史命令条目; 重复执行前一个命令的方法: 使用上方向箭头,回车执行 Ctrl+p !-1 !! 重复执行历史缓冲区的命令 !#(#=数字):重复执行历史命令中的编号为#的命令 !(string)字符串:从历史缓冲区中查找最近一次执行过的以string开头的命令并执行 !?string:从历史缓冲区中查找最近一次包含string的命令并执行 !- number:执行历史缓冲区中倒数第number个命令 Ctrl+r:在历史缓冲区中实施搜索,回车执行即可: 重复使用历史命令中的一部分: !$ 、ESC .、ALT+:表示最后一次命令中最后一个参数; !^:第一个位置的参数 !:number:最后一次命令中第number个位置的参数 !number1:number2在历史缓冲区中第number1个命令的第number2个参数 快捷键 C-->Ctrl M-->Alt E-->Esc DEL-->Backspace C-l:clear 清屏 C-a:将光标跳至命令行行首 C-e:将光标跳至命令行行尾 C-k:删除光标所在位置至行尾的命令行信息 C-u:删除光标所在位置至行首的命令行信息 C-c:结束前台进程。取消命令的运行 命令补全机制: 命令本身字符串的补全 参数的补全 使用TAB键可以完成命令补全: 如果给出的字符串不能作为唯一标识,则bash不予补全;再次敲击TAB键,bash会给出参考列表;如果参考列表中的内容过多,bash会询问是否显示该列表;根据提供的参数路径来进行补全,如果参数没有任何提示信息,则默认从工作目录进行查找; 命令行展开: ~:bash会自动将其展开为当前登陆用户的家目录 ~STRING:bash会自动将其展开为以STRING为用户名为用户的家目录 ~+:调用shell变量pwd的值 ~-:调用shell变量oldpwd的值 {}:在花括号中可以填充一个以","分隔的路径列表,bash会将其展开为多个独立的路径; 命令的执行结果 任何以个Linux命令都有两种执行结果: 命令的正常输出结果:跟用户需求相关的返回内容: ``:反向单引号,反引号 $():标准的命令引用格式 wc:统计一个文件中的行数、字数及字节数 -c:只显示字节数 -l:只显示行数 -w:只显示字数 命令的执行状态返回值;跟命令执行成与否相关的返回命令 引用功能: '':强引用 凡是被单引号引用的内容,bash一律将其视为普通字符,即便本身有特殊功能和作用也是如此,但是单引号本身是个例外 "":弱引用 被双引号引用的内容有一些特殊字符仍然会保留器特殊含义 比如:$、\、"" 转义功能:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值