Linux shell脚本学习

Shell脚本编程

在ubuntu里面 默认使用bShell(bash shell),cShell,dShelll,我们现在写的这些命令实际上都是shell命令,之所以写到.sh脚本文件里面,是因为命令过于复杂.

linux命令:

清空命令行: reset
文件操作:
ls -l
ls -la 所有
ls -l ja* 通配符查找

创建文件
touch today.c

复制文件
cp src.txt dest.txt
cp -i src.txt dest.txt 询问
cp src.txt . 复制到当前目录
cp -R 目录 dest 复制整个目录到指定路径
cp c_?1 ../ 通配符复制到上级目录

删除文件
rm file

删除目录
rm -rf 目录

查看文件类型:
file 文件

查看文件内容:
cat file
cat -n file 显示行号

查看进程
ps -ef|grep java
ps -ef|grep python
查看日志
tail -f file

查看文件最后10行
tail -n 10 file
查看文件最开始的10行
head -n 10file

创建用户
useradd –helper 查看命令的帮助
useradd -m jack 创建用户的同时 创建了home 目录
userdel -r jack 删除用户
/home/wang/bashrc 是一个启动文件,在这个文件中添加了环境变量(该用户的全局环境变量)

创建组:
groupad androidgroup
分配用户到组
usermod -G androidgroup jack

创建组和创建用户的,便于管理团队和分配个人必要权限.

文件权限

drwxr -xr -x
d rwx r-x r-x
d目录
rwx r读 w写 x执行,root用户对该目录拥有这些权限.
(第一个):文件所属用户具备的权限(root对该文件具备读写执行权限)
(第二个):文件所属用户的所属组具备的权限(读.执行)
(第三个):系统的其他用户对该文件具备的权限

rwx必须是固定顺序

权限 二进制 八进制
— 000 0
–x 001 1
-w- 010 2
-wx 011 3
r– 100 4
r-x 101 5
rw- 110 6
rwx 111 7

文件权限修改: chmod 644 文件
给用户加上执行权限chmod u+x 文件
给用户取消执行权限chmod u-x 文件

umask 022 改变创建文件时默认的权限, 创建后的权限就是 777-022 = 755.

chown 用户 文件 更改文件的用户权限

su 用户 ,切换用户.

shell脚本和命令

if 	命令
then
	命令
fi

test数值比较
-gt 大于
-eq 等于
-le 小于
-ne 不等于
test字符串比较
str1 == str2
str1 != str2
str1 < str2 (比较ASIC2 码)
-n str1 长度是否非0
-z str1 长度是否为0

文件比较
-d 检查是否存在,并且是一个目录
-e 检查file是否存在
-f 检查是否存在,并且是一个文件
-r 检查是否存在,并且可读
-w 同理(检查是否存在,并且可写)
-x 同理(检查是否存在,并且可执行)
file1 -nt file2 file1比file2新
file1 -ot file2 file1比file2旧

case命令
case 变量 in
pattern1) 命令;;
pattern2) 命令;;
*) 默认命令;;
esac

for命令
for var in list
do
	命令
done

while命令
while test command
do
	命令
done


#以ffmepg为例,enable命令 其实就是进了configure 里面的 enable命令的case里面了,然后就走了相应的逻辑.
for opt do
    optval="${opt#*=}"
    case "$opt" in
上面这段代码就是把我们传的参数,拿去遍历,然后case判断是哪个种类.



输入输出重定向
#0 STDIN
#1 STDOUT 标准输出
#2 STDERR
./xxx.sh 1> 文件路径     1> 将标准输出重定向到文件中,
#永久重定向
exec 1>test7

echo "cc xx "
echo "ll yy"

ls -a ./ff_error


#输入重定向



function myfun {
   echo "myfun"
}

myfun

myfun() {
  echo "myfun2"
}

myfun



复制代码

shell脚本命令

$# 是启动脚本时携带的参数个数
-ne 是不等于
# 例如:if [ $# -ne 1 ];then  这句的意思是如果启动时参数个数不等于1个
$1 表示第一个参数

#整数比较
-eq     等于,如:if ["$a" -eq "$b" ]
-ne     不等于,如:if ["$a" -ne "$b" ]
-gt     大于,如:if ["$a" -gt "$b" ]
-ge    大于等于,如:if ["$a" -ge "$b" ]
-lt      小于,如:if ["$a" -lt "$b" ]
-le      小于等于,如:if ["$a" -le "$b" ]
<  小于(需要双括号),如:(("$a" < "$b"))
<=  小于等于(需要双括号),如:(("$a" <= "$b"))
>  大于(需要双括号),如:(("$a" > "$b"))
>=  大于等于(需要双括号),如:(("$a" >= "$b"))

另外:$?是shell变量,表示"最后一次执行命令"的退出状态.0为成功,非0为失败.



# tr命令:
一般格式为:
tr -c ["string1_to"] ["string2_to"] ,用字符串1中字符集的补集替换次字符,要求字符集为ASCII
tr -d ["string1_to"] ["string2_to"]	,删除字符串1中所有输入字符
tr -s ["string1_to"] ["string2_to"]	,删除所有重复出现字符序列,只保留一个,即将重复出现字符串压缩为一个字符串

## 字符范围
[a-z]:a-z内的字符组成的字符串
[A-Z]:A-Z内的字符组成的字符串
[0-9]:数字串
/octal:一个三维的八进制数,对应有效的ASCII字符
[0*n]:表示字符0重复出现指定次数n,例[0*2]表示匹配[00]字符串

## 保存输出
要保存输出结果,需将之重定向到一个文件,例:重定向输出到文件results.txt,输入文件cops.txt:
$tr -s "[a-z]" results.txt

## 去除重复出现的字符
$more cops.txt
And the cowwwwws went homeeeeeee
Or did theyyyy
如果要去除重复字符或将其压缩在一起,可以使用-s选项,因为都是字母,故使用[a-z]:
$tr -s "[a-z]"And the cows went home
Or did they
## 删除空行
可使用-s来作这项工作,换行的八进制表示为\012,例:
$more plane.txt
and 0500 399999 2773888
or 093999 3766666
data 39

tr -s "[\012]"
and 0500 399999 2773888
or 093999 3766666
data 39

## 大小写转换
除了删除控制字符,转换大小写是tr最常用的功能,为此需指定即将转换的小写字符[a-z]和转换结果[A-Z]
$ echo "May Day,May Day,Going Down..."
$ tr "[a-z]" "[A-Z]" "May Day,May Day,Going Down..."
MAY DAY,MAY DAY,GOING DOWN...
同样也可以使用字符类[:lower:]和[:upper:] ,使用是一样的.

复制代码

shell脚本练习

#!/bin/bash
# num 类型赋值
NDK=10
# 属性 字符串赋值
text="I love sheell"
# 波浪线下面的`` 引用一个命令
text1=`date`
# $(who) 也是同样的效果,引用一个命令
text2=$(who)


echo $NDK
echo $text
echo "$text very match"
# 对特殊字符需要打印,得用\转译
echo "\$NDK"

echo $text1
echo $text2


# if 嵌套语句 只能写命令,不写命令得用test 命令
#!/bin/bash
testuser=wang01
# 判断用户是否存在, 找到返回数据,没找到返回0; 0是true,取非,就是找到了.
if !(grep $testuser /ect/passwd)
then
    echo "ok"
    ls -a /home/$testuser/
#
elif ls -d /home/$testuser
then
    echo "用户不存在,主目录仍然存在"
#
else
    ##嵌套if 
    #if   
    #then
    echo "$testuser not exist"
fi       
#  


#!/bin/bash
#test命令.如果条件成立,test命令状态为0退出,if条件成立. 提供了快捷方式 [] 括起来
var="lala"
if test $var
then
    echo "test条件成立"
else
    echo "test条件不成立"
fi
#快捷方式 if [$var]
#!bin/bash
a=10
b=5
#test命令简单形式 [] 前后必须加空格,不加空格报错
if [ $a -gt $b ]
then
	echo "$a greater than $b"
else
	echo "$a smaller than $b"
fi



#!/bin/bash
#test命令.如果条件成立,test命令状态为0退出,if条件成立.
var="lala"
if test $var
then
    echo "test条件成立"
else
    echo "test条件不成立"
fi
#类似于这样
strl=""
if [ strl = "" ]
then
    echo "有内容"
else
    echo "没内容"
fi


a=10
b=5
#test命令简单形式
if [ $a -gt $b ]
then
    echo "$a greater than $b"
else
    echo "$a smaller than $b"
fi


mydir=/usr/wang

#-d检查目录是否存在
if [ -d $mydir ]
then
    echo "$mydir exist"
    cd $mydir
    ls -la
else
    echo "mydir not exist"
fi

#多个条件
mydir2=/usr/wang/android_all
#任意数学赋值或者比较表达式
if [ -d $HOME ] && [ -w $mydir2 ]
then
    cd $mydir2
    touch test1.txt
else
    echo "no"
fi

#switch 语句
testuser2=wang

case $testuser2 in
wang)
     echo "hi,$testuser2";;
ricky)
     echo "hello,ricky";;
*)
     echo "defaults";;
esac

#IFS字段分隔符
list="Mother\'s Father Brother"
list2="windows--linux--macos"
IFS=$--
for item in $list2
do
    echo $item
done

#赋值
a=10
while [ $a -gt 0 ]
do
    echo "num:$a"
    #赋值不用使用$符号
    a=$[ $a - 1 ]
    if [ $a -eq 5 ]
    then
        echo "break"
        break
    fi
done

复制代码

shell脚本练习-编译ffmpeg

#早期版本编译ffmpeg,编写shell之前,执行 ./configure --disable-yasm,检查系统版本,生成config.mak配置文件(比如说检查gcc的版本,生成一个config.mak,老版本在ffmpeg根目录下,新版本在ffbuild文件夹里面), 禁用软件yasm
#nasm和yasm fasm 

#编译过程中, gcc会生成 .o 临时文件,最后再链接生成动态库

#--enable-cross-compile gcc支持交叉编译,但是得配置使用,在linux上进行编译最终都是使用的gcc进行编译的.  交叉编译(编译不同操作系统的动态库,编译不同CPU平台的动态库,比如在linux下编译armCPU架构的动态库)


复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享