安卓学习笔记--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的脚本,

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

然后我们继续看mkcommon.sh这个脚本:

#!/bin/bash
#
# scripts/mkcommon.sh
# (c) Copyright 2013
# Allwinner Technology Co., Ltd. <www.allwinnertech.com>
# James Deng <csjamesdeng@allwinnertech.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.

BR_SCRIPTS_DIR=`dirname $0`   ---------获取当前的路径,因为我们执行这个脚本的位置是在lichee这个目录下面的,dirname是一个linux命令,$0就是脚本的名字,通常$1--9代表参数,那么$0代表命令或者脚本本身。也就是mkcommon.h这个脚本本身所在的路径。

if [ "$1" = "pack" ] ; then       ----如果传进来的第一个参数是pack的话
    ${BR_SCRIPTS_DIR}/build_pack.sh    ---跑去执行pack的脚本
    exit 0
fi

# source shflags
. ${BR_SCRIPTS_DIR}/shflags/shflags ----用一个点号,然后后面跟的通常也是一个脚本,是用来代替source这个命令的,就是把一些外部的变量或者模块导入进来

. ${BR_SCRIPTS_DIR}/mkcmd.sh     ----这个导入进来的是一些负责编译的函数

# define option, format:
#   'long option' 'default value' 'help message' 'short option'
DEFINE_string 'platform' 'sun7i' 'platform to build, e.g. sun7i' 'p'  ---这里定义可选的平台      
DEFINE_string 'board' '' 'board to build, e.g. evb' 'b'         ----定义可选的板
DEFINE_string 'module' '' 'module to build, e.g. buildroot, kernel, uboot, clean' 'm'  --定义编译的模组类型
DEFINE_boolean 'independent' false 'output build to independent directory' 'i'        ----不清楚

# parse the command-line
FLAGS "$@" || exit $?        ----检查命令行,就是传递进来的参数,FLAGS相信就在刚才source进来的函数
eval set -- "${FLAGS_ARGV}"   ----暂时看不懂

chip=${FLAGS_platform%%_*}      ---初始化这些变量
platform=${FLAGS_platform##*_}
board=${FLAGS_board}
module=${FLAGS_module}

if [ "${platform}" = "${chip}" ] ; then   ---为什么platform = chip就把platform设置为linux呢?
    platform="linux"
fi

if [ -z "${module}" ] ; then            ---大概是默认的意思吧,就是当用户没有设定这一项的时候就给它个默认值,-z就是长度为0的意思
    module="all"
fi

if ! init_chips ${chip} || \      ------看不太懂
   ! init_platforms ${chip} ${platform} ; then
    mk_error "invalid platform '${FLAGS_platform}'"
    exit 1
fi

if [ ${FLAGS_board} ] && \
   ! init_boards ${chip} ${platform} ${board} ; then
    mk_error "invalid board '${FLAGS_board}'"
    exit 1
fi

# init output directory
init_outdir       ----初始化输出的目录的函数,具体的实现在之前source进来的脚本

if [ ${module} = "all" ]; then   ---如果用户选择module的类型是all的话,就调用mklichee这个命令,也就是函数
    mklichee
elif [ ${module} = "boot" ] ; then
    mkboot
elif [ ${module} = "buildroot" ] ; then
    mkbr
elif [ ${module} = "kernel" ] ; then
    mkkernel
elif [ ${module} = "uboot" ] ; then
    mkuboot
elif [ ${module} = "clean" ] ; then
    mkclean
elif [ ${module} = "mrproer" ] ; then
    mkmrproer
elif [ ${module} = "distclean" ] ; then
    mkdistclean
else                   ------如果什么都不是,就报错
    mk_error "invalid module '${module}'"
    exit 1
fi

exit $?      ---退出并返回最后一个命令返回的值









  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
安卓系统下的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、付费专栏及课程。

余额充值