比较与判断
1. 字符串判断
str1 = str2 当两个串有相同内容、长度时为真
str1 != str2 当串str1和str2不等时为真-n str1 当串的长度大于0时为真(串非空)-z str1 当串的长度为0时为真(空串)str1 当串str1为非空时为真2. 数字的判断int1 -eq int2 两数相等为真int1 -ne int2 两数不等为真int1 -gt int2 int1大于int2为真int1 -ge int2 int1大于等于int2为真int1 -lt int2 int1小于int2为真int1 -le int2 int1小于等于int2为真3. 文件的判断-r file 用户可读为真-w file 用户可写为真-x file 用户可执行为真-f file 文件为正规文件为真-d file 文件为目录为真-c file 文件为字符特殊文件为真-b file 文件为块特殊文件为真-s file 文件大小非0时为真-t file 当文件描述符(默认为1)指定的设备为终端时为真4. 复杂逻辑判断-a 与-o 或! 非Example
This example can be used as a executable file for android local compilation.
#!/bin/bashPRODUCT=$1HARDWARE=$2IMAGE=$3if [ "$PRODUCT" = "-h" -o -z "$PRODUCT" ]; then echo "Usage:" echo " ./mk.sh [product] [hardware version] [kernel/lk/userdata/ramdisk/recovery/system]" echo " Eg: ./mk.sh 8865 p0 lk // Default is kernel" echo " Eg: ./mk.sh 8865 p0 // make bootimage" exit 0fiif [ "$IMAGE" = "kernel" ]; then IMAGE=bootimagefiif [ "$IMAGE" = "lk" ]; then IMAGE=abootfiif [ "$IMAGE" = "userdata" ]; then IMAGE=userdataimagefiif [ "$IMAGE" = "ramdisk" ]; then IMAGE=ramdiskfiif [ "$IMAGE" = "recovery" ]; then IMAGE=recoveryimagefiif [ "$IMAGE" = "system" ]; then IMAGE=systemimagefiif [ -z "$PRODUCT" ]; then PRODUCT=8865fiif [ -n "$PRODUCT" ]; then # not null PRODUCT=cp${PRODUCT}ufiif [ -z "$IMAGE" ]; then # null IMAGE=bootimagefiif [ -z "$HARDWARE" ]; then # null HARDWARE=p0fiecho "make HARDWARE_VER=${HARDWARE} ${IMAGE}"if [ "$TARGET_PRODUCT" != "$PRODUCT" ]; then # -o means "|" source build/envsetup.sh# First definition: 1. release; 2. debug# Second definition: product# Second definition: 1. user; 2. userdebug; 3. eng choosecombo 1 $PRODUCT 3fimake HARDWARE_VER=$HARDWARE $IMAGE#/build.sh cp7576u -v eng -b p1 -i bootimg
循环:
#!/bin/bashval=1if [ -z "$1" -o -z "$2" ]; then echo " ./autotest.sh [sleep] [count]" echo " Eg: ./autotest.sh 1 50" exit 0fisudo adb rootwhile(true)do sudo adb shell "echo '384,14'>/sys/class/graphics/fb0/dynamic_pclk"; echo "No ${val}:" echo "Clock Source: 384MHz, Divider: 14" sudo adb shell cat /sys/class/graphics/fb0/dynamic_pclk; sleep $1; echo "" echo "Clock Source: 384MHz, Divider: 15" sudo adb shell "echo '384,15'>/sys/class/graphics/fb0/dynamic_pclk"; sudo adb shell cat /sys/class/graphics/fb0/dynamic_pclk; echo ""; echo ""; val=`expr $val + 1`; if [ "$val" = "$2" ]; then exit 0 fi sleep $1;done
#!/bin/sh# 判断文件是否存在# link:www.jb51.net# date:2013/2/28myPath="/var/log/httpd/"myFile="/var /log/httpd/access.log"# 这里的-x 参数判断$myPath是否存在并且是否具有可执行权限if [ ! -x "$myPath"]; then mkdir "$myPath"fi# 这里的-d 参数判断$myPath是否存在if [ ! -d "$myPath"]; then mkdir "$myPath"fi# 这里的-f参数判断$myFile是否存在if [ ! -f "$myFile" ]; then touch "$myFile"fi# 其他参数还有-n,-n是判断一个变量是否是否有值if [ ! -n "$myVar" ]; then echo "$myVar is empty" exit 0fi# 两个变量判断是否相等if [ "$var1" = "$var2" ]; then echo '$var1 eq $var2'else echo '$var1 not eq $var2'fi
case user guide
case分支语句的格式如下:
case$变量名in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
*)
默认执行的命令序列 ;;
esac
case语句结构特点如下:
case行尾必须为单词“in”,每一个模式必须以右括号“)”结束。
双分号“;;”表示命令序列结束。
匹配模式中可是使用方括号表示一个连续的范围,如[0-9];使用竖杠符号“|”表示或。
最后的“*)”表示默认模式,当使用前面的各种模式均无法匹配该变量时,将执行“*)”后
的命令序列。
shell的基本语法
赋值一般采用以下形式:变量名=字符串
1. “=”号两边是不能有空格的,不然会出错的。(这点初学者特别容易出错)
2. 若赋值语句中,“=”后面没有任何内容,则该变量为一个空字符串,若只声明而没赋值,则该变量默认也是一个空字符串。
3. 若一个变量中含有空格、制表符、换行符,则要用双引号括起来,不然会出错。
4. 在shell程序文件中,如果想引用已经定义的变量,一般要在变量名前加“$”符号,这个符号含义是告诉shell,后面是一个变量。
5. 单引号(‘…’):单引号也称为强引用,引用所有内容。在单引号中,没有字符拥有特殊含义。
6. 双引号(“…”):双引号也称为弱引用,除了3个元字符$(美元符号)、`(反引号)和/(反斜线)外引用所有内容。在双引号中,这3个字符还保留它们各自的特殊含义。
7. 反引号(`…`):命令替换,命令替换允许在一条命令中嵌入一条命令。shell首先执行嵌入的命令,并且用输出替换该命令。然后shell再执行整个命令。
8. 在shell变量引用中,一个变量与一个长字符串的组合,如果当前变量处在字符串的最后,可以利用直接引用的方式;如果处在中间或开头的位置,则可以用花括号将变量名包含起来。如下:程序:
[c-sharp]view plaincopy
- #!/bin/bashaddress=beijingecho$addressecho${address}testechotest$address
输出:
beijingbeijingtesttestbeijing
shell中的通配符(用于模式匹配)
1. “*”符号
“*”符号用于匹配字符串中0次或多次出现的字符,如:s*可以匹配shell、shanghai等。在使用“*”符号时要注意一点,在匹配文件名与路径名时,“.”符号与“/”必须显示匹配,如:*test不能匹配“.httest”文件,而要用“.*test”来匹配,同时“/home/test”需要用”/*/test”来匹配。
2. “?”符号
“?”符号仅匹配对应位置的一个字符。如:m?ke可匹配”mike”、”make”等,但不能匹配”mooke”。
3. “[]“符号
“[]“称号的作用是匹配该字符组所限定范围内的任何一个字符,方括号中的字符可以由直接级出的字符组成,如:[adehk];也可以由表示限定范围的起始字符和终止字符及中间的连接字符”-”组成。如:[a-zA-H]、[0-9]等。
4. “!”符号
“!”符号是与”[]“符号配合使用的,”!”的作用是匹配不在方括号中列出的字符。例如:t[!a-h]st,则可表示tyst、t9st,但不能表示test。
shell中的输入
shell中输入是由函数read实现,原型为:read 变量1 [变量2]
利用read函数可以交互地为变量赋值,当然也可以通过制表符或空格为多变量赋值,说明如下:
1. 如果变量个数多于输入串中字符串个数,则依次赋值,剩下变量取空值。
2. 如果变量个数等于输入串中字符串个数,则一一对应赋值。
3. 如果变量个数少于输入串中字符串个数,刚除依次赋值外,最后一个变量接纳剩下的字符串。
例如:
[c-sharp]view plaincopy
- #!/bin/bashecho"inputyournameandage:"readnameageecho"yournameis:"$nameecho"yourageis:"$age
如果你输入Jim 15 则输出:
input your name and age:your name is: Jimyour age is: 15
shell中的输出
shell中输出是由echo函数实现的,echo可直接输出其后面所跟变量的值或直接输出其后面的字符串。echo函数后面以空格隔开,以换行符终止。如果数据之间要保留多个空格,则要用双引号把它们括起来以便shell对它们进行正确的操作。另:echo函数还定义了一组转义字符,在使用转义字符时要加入”-e”选项。其转义字符如下:
“/a” :响铃报警,”/b” :后退一字符,”/f” :换页,”/n” :显示换行,”/t” :制表符,”/v” :垂直制表符,”/r” :回车符,”//” :反斜线。例如:
[c-sharp]view plaincopy
- #!/bin/bashecho-ehello,’/n’world!echohello,’/n’world!echo’-e’hello,’/n’world!echo-ehello,"/n"world!echo-ehello,/nworld!echohello,/nworld!
输出:
hello,world!hello,/nworld!hello,world!hello,world!hello,nworld!hello,nworld!
shell中的数组
shell支持一维数组,但并不限定数组大小,数组下标从0开始。
在操作数组时,取值方式是:${数组名[下标]} ;赋值方式是:数组名[下标]=值 (为单个数组元素赋值);如果要对整个数组的所有元素赋值,可以采用:数组名=(值1,值2,值3,…),值与值之间要用空格隔开。
遍历数组除用循环外还可用:“数组名[*]”或“数组名[@]”,例如:
[c-sharp]view plaincopy
- #!/bin/basharray1[0]=beijingarray1[1]=shanghaiarray2=(guangzhou,shenzhen,chengdu)echo"/${array1[0]}="${array1[0]}echo"/$array1[1]="$array1[1]echo"/${array1[*]}="${array1[*]}echo"/$array1="$array1echo"/${array2[*]}="${array2[*]}echo"/${array2[@]}="${array2[@]}echo"/$array2="$array2echo"/$array2[1]="$array2[1]
输出:
${array1[0]} = beijing$array1[1] = beijing[1]${array1[*]} = beijing shanghai$array1 = beijing${array2[*]} = guangzhou,shenzhen,chengdu${array2[@]} = guangzhou,shenzhen,chengdu$array2 = guangzhou,shenzhen,chengdu$array2[1] = guangzhou,shenzhen,chengdu[1]
注:数组的赋值与输出有点麻烦。对于数组修改操作,可以再对其重新赋值;但如果要删除一个已经赋值后的元素则需要借助一个外部命令:unset,如:unset array[0]可清空下标为0的元素,此时数组大小减一;unset array[@]可以清空整个数组元素所有元素。例如:
[c-sharp]view plaincopy
- #!/bin/bashaddress=(beijing,shanghai,shandong)address[0]=nanjingecho${address[*]}unsetaddress[0]echo${address[*]}
输出:
beijing shanghai shandongshanghai shandong
注:关于数组输入与输出规则比较多,得多练习掌握。
主要参考文章:
http://chenzhiwei.net/2010/07/linux-shell-study-notes-part-1/
生活不会永远都困难;祝你爱情蜜甜,事业大进步