Shell脚本的学习记录

最近项目需要,需要大量的对apk进行反编译,然后嵌入自己的sdk,然后在打包,之前本来是一个一个走终端命令的,但是效率太低了还要打包,签名,最后决定研究一下bash脚本,然后自己写了一个的脚本支持的功能:

  1. 批量/单个反编译
  2. 批量/单个打包并签名

脚本有点长我就把github的地址贴出来直接去那边看就行了:

https://github.com/Danny1451/MassApkToolShell

下面是研究和学习脚本时的一些记录和一些坑cool

首先重要的事情说三遍:

shell 脚本 不能随便加空格

shell 脚本 不能随便加空格

shell 脚本 不能随便加空格

 


vim 对齐

方法二:

gg(把关标定位到最上面),V(进入VISUAL模式),shift+g(选中整篇文本),然后=。

 


if语句和一些基本变量

1.定义变量时, =号的两边不可以留空格.
 

eg:
gender=femal————right
gender =femal———–wrong
gender= femal———–wrong


2.条件测试语句 [ 符号的两边都要留空格.

eg:
if [ $gender = femal ]; then——-right.
echo “you are femal”;
fi

if[ $gender...-----------------------wrong
if [$gender...----------------------wrong.

3.条件测试的内容,如果是字符串比较的话, 比较符号两边要留空格!

eg:
if [ $gender = femal ]; then——-right.
if [ $gender= femal ]; then——–wrong.
if [ $gender=femal ]; then———wrong.

4.如果if 和 then写在同一行, 那么,注意, then的前面要跟上 ; 号.如果 then 换行写, 那么也没问题.
 

eg:
if [ $gender = femal ]; then——-right.
if [ $gender = femal ]
then——————————-right.
if [ $gender = femal ] then——-wrong. then前面少了 ; 号.


提示出错信息:
syntax error near unexpected token then
同理,还有很多出错信息 比如
syntax error near unexpected token fi 等都是这样引起的.

5.if 后面一定要跟上 then. 同理
elif 后面一定要跟上 then.
不然提示出错信息:
syntax error near unexpected token else

1)if 语句后面需要跟着then,同时前面要有分号;
2) 空格非常重要,shell 会认为空格前的为一个命令,如果a=3 认为是赋值操作,如果写成a = 3,那么就会认为a为一个命令 this=`ls -l |grep ‘^-’ | wc -l `
3) 操作符之间要用空格分开 ,如 test ! -d $1,其中的!和-d就要用空格分开
空格是命令解析中的重要分隔符

6. 命令和其后的参数或对象之间一定要有空格

if [ -x"~/Workspace/shell/a.sh" ];then

只有 -x 后有空格才表示紧跟其后的字符串是否指向一个可执行的文件名,否则就成了测试 -x"~/Workspace/shell/a.sh" 这个字符串是不是空。

 

7.取变量值的符号'$'和后边的变量或括号不能有空格

 


helloworld的demo

sh编写 开头写

 

#!/bin/bash

 

echo   注释功能

 

编写完之后 没有权限用 

chmod u+x ./helloworld.sh 提升文件的权限

 

1.打开终端

2.可以在终端,用vim命令,打开vim编辑

3.输入


 

#i/bin/bash

echo 'hello world'

4.输完后,命名a.sh

:w a.sh

 

5.退出vim

 

:wq

 

 


 

字符串拼接

 

如果想要在变量后面添加一个字符,可以用一下方法:

$value1=home

$value2=${value1}"="

echo $value2

把要添加的字符串变量添加{},并且需要把$放到外面。

这样输出的结果是:home=,也就是说连接成功。

 

又如:

[root@localhost sh]# var1=/etc/
[root@localhost sh]# var2=yum.repos.d/
[root@localhost sh]# var3=${var1}${var2}
[root@localhost sh]# echo $var3

/etc/yum.repos.d/

 

 


判断文件是否存在


 

myPath="/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 0

fi

# 两个变量判断是否相等

if [ "$var1" = "$var2" ]; then

 echo '$var1 eq $var2'

else

 echo '$var1 not eq $var2'

fi

-f 和-e的区别

Conditional Logic on Files

-a file exists.

-b file exists and is a block special file.

-c file exists and is a character special file.

-d file exists and is a directory.

-e file exists (just the same as -a).

-f file exists and is a regular file.

-g file exists and has its setgid(2) bit set.

-G file exists and has the same group ID as this process.

-k file exists and has its sticky bit set.

-L file exists and is a symbolic link.

-n string length is not zero.

-o Named option is set on.

-O file exists and is owned by the user ID of this process.

-p file exists and is a first in, first out (FIFO) special file or

named pipe.

-r file exists and is readable by the current process.

-s file exists and has a size greater than zero.

-S file exists and is a socket.

-t file descriptor number fildes is open and associated with a

terminal device.

-u file exists and has its setuid(2) bit set.

-w file exists and is writable by the current process.

-x file exists and is executable by the current process.

-z string length is zero.

 

是用 -s 还是用 -f 这个区别是很大的!

 

 


获取指定目录下的所有文件

#============ get the file name ===========  
Folder_A=/home/youname/shell/gotfilename/bin  
for file_a in ${Folder_A}/*; do  
    temp_file=`basename $file_a`  
    echo $temp_file  
done     

   

 


字符串替换

 

[chengmo@localhost ~]$ test='c:/windows/boot.ini'
[chengmo@localhost ~]$ echo ${test/\//\\}
c:\windows/boot.ini
[chengmo@localhost ~]$ echo ${test//\//\\}
c:\windows\boot.ini

 

 

 

${变量/查找/替换值} 一个“/”表示替换第一个,”//”表示替换所有,当查找中出现了:”/”请加转义符”\/”表示。

 


Select 表达式

select表达式是bash的一种扩展应用,擅长于交互式场合。用户可以从一组不同的值中进行选择:

select var in ... ; do

 break;

done

.... now $var can be used ....


示例代码:

 

#!/bin/sh



echo "What is your favourite OS?"

select var in "Linux" "Gnu Hurd" "Free BSD" "Other"; do

  break;

done

echo "You have selected $var"

如果 以上脚本运行出现 select :NOT FOUND 将 #!/bin/sh 改为 #!/bin/bash 该脚本的运行结果如下:


 

What is your favourite OS?

1) Linux

2) Gnu Hurd

3) Free BSD

4) Other

#? 1

You have selected Linux

字符串替换

 

file=/dir1/dir2/dir3/my.file.txt

我們可以用 ${ } 分別替換獲得不同的值:

${file#*/}:拿掉第一條 / 及其左邊的字串:dir1/dir2/dir3/my.file.txt

${file##*/}:拿掉最後一條 / 及其左邊的字串:my.file.txt

${file#*.}:拿掉第一個 .  及其左邊的字串:file.txt

${file##*.}:拿掉最後一個 .  及其左邊的字串:txt

${file%/*}:拿掉最後條 / 及其右邊的字串:/dir1/dir2/dir3

${file%%/*}:拿掉第一條 / 及其右邊的字串:(空值)

${file%.*}:拿掉最後一個 .  及其右邊的字串:/dir1/dir2/dir3/my.file

${file%%.*}:拿掉第一個 .  及其右邊的字串:/dir1/dir2/dir3/my

 

 

 

 

DannyLau

奋斗的菜鸟程序猿【移动开发者 / iOS /coocs2dx/ Android】 电影迷/LOL/万青粉 不拖延会死星人

发表评论

电子邮件地址不会被公开。