美文网首页
NDK<第九篇>:Shell脚本

NDK<第九篇>:Shell脚本

作者: NoBugException | 来源:发表于2022-10-27 16:35 被阅读0次

shell 是一种脚本语言。
脚本:本质是一个文件,文件里面存放的是 特定格式的指令,系统可以使用脚本解析器 翻译或解析 指令 并执行(它不需要编译)
shell 既是应用程序 又是一种脚本语言(应用程序 解析 脚本语言)

#!/bin/bash

# 第一行主要用于指定解释器(包括:bin/sh、bin/bash、usr/bin/sh、usr/bin/bash)

# 我是单行注释

# 执行脚本的方式有三种:sh test.sh、. test.sh、source test.sh
# 决定路径执行:./test.sh,这种执行方式需要可执行权限,给脚本添加可执行权限:chmod 777 test.sh
# ./test.sh 方式执行需要指定解释器

# 三种变量:局部变量、环境变量、shell变量

# 变量:
name="hello" # 等号两边不能有空格
echo ${name} # 输出普通变量

function test() {
    local name="test hello" # 局部变量用local关键字修饰,local必须在函数中使用
    echo ${name}
}
name="only_read"
readonly name # readonly修饰符,修饰只读变量
echo $name # 或者 ${name}
name1="name1"
unset name1 # 删除变量,不能删除只读变量,删除后的变量无法被访问

# 单引号和双引号字符串的区别
name2='name2' # 单引号字符串,字符串内不能转义,不能包含变量
name3="name3\"${name2}" # 双引号字符串,字符串内可以有转义,也可以包含变量
echo ${name3}

# 字符串拼接
str1="1""2""3"'4''5' # 字符串字面量拼接
str2='6'
str3=${str1}${str2} # 字符串变量拼接
echo $str3
str4=`date`'==='$str3 # 命令拼接
echo $str4

# 获取字符串长度的5种方式
echo "hello" | wc -L # 1、wc -L 获取当前行的长度
expr length ${str3} # 2、使用expr length可以获取string的长度
echo "abc" |awk -F "" '{print NF}' # 3、awk获取域的个数
echo "Alex" |awk '{print length($0)}' # 4、通过awk+length的方式获取字符串长度
str5=Alex
echo ${#str5} # 通5、过 ${#str5} 的方式获取字符串长度

# 提取字符串
str6=123456789.jpg
echo ${str6##*56} # 从左向右截取最后一个string后的字符串 ,输出:789.jpg
echo ${str6#*56} # 左向右截取第一个string后的字符串,输出:789.jpg
echo ${str6%%56*} # 从右向左截取最后一个string后的字符串,输出:1234
echo ${str6%56*} # 从右向左截取第一个string后的字符串,输出:1234
echo ${str6:1:3} # 截取字符串,输出:234

# 数组
echo "====数组==== 数组越界不会报错"
array=(1 2 3 4 5 6)
echo ${array} # 输出数组,默认输出角标为0的数据
echo ${array[5]} # 输出数组角标为5的数据
array[0]=7 # 数组赋值
echo ${array} # 输出数组
array=([0]=0 [1]=1 [2]=2 [3]=3 [4]=4 [5]=5 [6]=6) # 数组初始化或赋值
echo ${array[6]} # 输出数组角标为6的数据
for((i=0;i<7;i++)) # for循环遍历数组
do
    echo "array[$i]=${array[$i]}"
done
echo ${array[*]} # 输出整个数组
echo "a len: ${#array[*]}" # 输出数组的长度
a=(1 2 3 4 5 6)
b=("hello" "zhaixue.cc")
c=(${a[*]} ${b[*]}) # 数组拼接
echo ${c[*]} # 输出整个数组
echo "c length: ${#c[*]}" # 输出:c length: 8
unset c[6] # 删除数组中的元素
echo "c length: ${#c[*]}" # 输出:c length: 7

# 参数传递
# $0    代表执行的文件名
# $1    代表传入的第1个参数
# $n    代表传入的第n个参数
# $#    参数个数
# $*    以一个单字符串显示所有向脚本传递的参数。
# $@    与$*相同,但是使用时加引号,并在引号中返回每个参数
# $$    脚本运行的当前进程号
# $!    后台运行的最后一个进程的ID
# $?    显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

# 运算符 需注意:条件表法式需要放在方括号之间,并且要有空格。使用expr进行计算时需要使用反引号。
# 加法    expr $a + $b
# 减法    expr $a - $b
# 乘法    expr $a \* $b
# 除法    expr $b / $a
# 取余    expr $b % $a
# 赋值    a=$b
# 相等    [ $a == $b ]
# 不相等   [ $a != $b ]
a=10
b=20
c=`expr $a + $b` # 加法运算
echo "a + b : $c"

# 关系运算符
# 关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
# 关系用 [] 来表示,
echo "====关系运算符===="
a=1
b=2
# 检测两个数是否相等 [ $a -eq $b ]   -eq
if [ $a == $b ]
then
    echo "a和b相等"
else
    echo "a和b不相等"
fi

# 或者

if [ $a -eq $b ]
then
    echo "a和b相等"
else
    echo "a和b不相等"
fi

# 检测两个数是否不相等    [ $a -ne $b ]   -ne
if [ $a != $b ]
then
    echo "a和b不相等"
else
    echo "a和b相等"
fi

# 或者

if [ $a -ne $b ]
then
    echo "a和b不相等"
else
    echo "a和b相等"
fi

# 检测左边的数是否大于右边的 [ $a -gt $b ]   -gt
if [ $a -gt $b ]
then
    echo "a大于b"
else
    echo "a等于b或a小于b"
fi

# 检测左边的数是否小于右边的 [ $a -lt $b ]   -lt
if [ $a -lt $b ]
then
    echo "a小于b"
else
    echo "a等于b或a大于b"
fi

# 检测左边的数是否大于等于右边的   [ $a -ge $b ]   -ge
if [ $a -ge $b ]
then
    echo "a大于等于b"
else
    echo "a小于b"
fi

# 检测左边的数是否小于等于右边的   [ $a -le $b ]   -le
if [ $a -le $b ]
then
    echo "a小于等于b"
else
    echo "a大于b"
fi


# 布尔运算符
# 非运算   [ ! false ] !
# 或运算   [ $a -lt 20 -o $b -gt 100 ] -o
# 与运算   [ $a -lt 20 -a $b -gt 100 ] -a

# 逻辑运算符
# 逻辑的 AND   [[ $a -lt 100 && $b -gt 100 ]]  &&
# 逻辑的 OR    [[ $a -lt 100 || $b -gt 100 ]]  ||

# 布尔运算符和逻辑运算符的区别:
# 语法上,逻辑运算需要双括弧,布尔运算只需要单大括弧功能上,逻辑运算具有特殊的短路功能,
# 即是在AND运算中第一个表达式为false时则不执行第二个表达式,
# 在OR运算中第一个表达式为true时不执行第二个表达式。

# 字符串运算符
# 检测两个字符串是否相等   [ $a = $b ] =
# 检测两个字符串是否不相等  [ $a != $b ]    !=
# 检测字符串长度是否为0   [ -z $a ]   -z
# 检测字符串长度是否不为 0 [ -n “$a” ] -n
# 检测字符串是否为空 [ $a ]  $

# 文件测试运算符
# 检测文件是否是块设备文件  [ -b $file ]    -b file
# 检测文件是否是字符设备文件 [ -c $file ]    -c file
# 检测文件是否是目录 [ -d $file ]    -d file
# 检测文件是否是普通文件(既不是目录,也不是设备文件)    [ -f $file ] 返回 true    -f file
# 检测文件是否设置了 SGID 位  [ -g $file ]    -g file
# 检测文件是否设置了粘着位(Sticky Bit)  [ -k $file ]    -k file
# 检测文件是否是有名管道   [ -p $file ]    -p file
# 检测文件是否设置了 SUID 位  [ -u $file ]    -u file
# 检测文件是否可读  [ -r $file ]    -r file
# 检测文件是否可写  [ -w $file ]    -w file
# 检测文件是否可执行 [ -x $file ]    -x file
# 检测文件是否为空(文件大小是否大于0)   [ -s $file ]    -s file
# 检测文件(包括目录)是否存在    [ -e $file ]    -e file
file="/home/westos/Desktop/textcpp/test.sh"
if [ -e $file ]
then
   echo "文件存在"
else
   echo "文件不存在"
fi

# 运算指令
# (( )) 可以直接使用双圆括弧计算其中的内容,如((var=a+b))
# let 在计算表达式的时候我们可以直接使用let,如let var=a+b。
# expr 
var=`expr a+b`
echo $var
# bc计算器 :bc计算器支持shell中的小数进行运算,并且可以交互式或者非交互式的使用
var=$(echo "(1.1+2.1)"|bc)
echo $var
# $[]: 计算中括弧中的内容,如echo $[1+2]


# 控制语句
a=1
b=1
# if-fi
if [ $a -eq $b ]
then
    echo "a等于b"
fi

# if-else-fi
if [ $a -eq $b ]
then
    echo "a等于b"
else
    echo "a不等于b"
fi

# if else-if else
if [ $a -gt $b ]
then
    echo "a大于b"
elif [ $a -lt $b ]
then
    echo "a小于b"
else
    echo "a等于b"
fi


# for循环
for a in 1 5 3 4
do
    echo ${a} # 一次输出 1 5 3 4
done

array=(1 2 3 4 5 6 7 8)
for((i=0;i<8;i++)) # for循环遍历数组
do
    echo "array[$i]=${array[$i]}"
done

for loop in 1 2 3 4 5
do
    echo "The value is: $loop"
done

# while循环

a=1
b=4
while [ $a -lt $b ]
do
    echo "${a}"
    let a++
done

# 无限循环
# for (( ; ; ))
# do
#     echo 111
# done

# while true
# do
#      echo 222
# done

# until循环
# until 循环执行一系列命令直至条件为 true 时停止
a=1
until [ $a -gt 3 ]
do
    echo "until循环:$a"
    let a++
done

# 跳出循环

var=1
while(( $var < 5 ))
do
        if(( $var>3 ))
        then
             echo "break跳出循环"
             break
        fi
        echo "$var"
        var=`expr $var + 1`
done


var=1
while(( $var < 5 ))
do
        echo "$var"
        var=`expr $var + 1`
        if [ $var -gt 2 ] && [ $var -lt 4 ]
        then
             echo "continue跳出循环:$var"
             continue
        elif [ $var -eq 4 ] 
        then
             echo "break跳出循环"
             break
        fi
done


# case-esac多选择语句
echo "====case-esac多选择语句===="
var=100
case $var in # 分支语句开始
10)
    echo "输出10"
    ;; # 相当于break
100)
    echo "输出100"
    ;; # 相当于break
esac # 分支语句结束


# select-in语句
# select in是shell中独有的一种循环,非常适合终端的交互场景,它可以显示出带编号的菜单,
# 用户输入不同编号就可以选择不同的菜单,并执行不同的功能
echo "What is your favourite OS?"
select var in "Linux" "Gnu Hurd" "Free BSD" "Other"; 
do
  echo "You have selected $var"
  break;
done


# 函数

function funName() { # function可以省略
    echo "执行了funName函数"
}
funName # 执行函数

funWithParam(){
    echo "第一个参数为 $1 !"
    echo "第十个参数为 ${10} !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73 # 执行函数并传递参数


# 重定向
#一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:
#    1、标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
#    2、标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
#    3、标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。

# > 标准输出覆盖重定向:将命令的输出重定向输出到其他文件中
# >>    标准输出追加重定向:将命令的输出重定向输出到其他文件中
# >&    标识输出重定向:将一个标识的输出重定向到另一个标识的输入
# < 标准输入重定向:命令将从指定文件中读取输入而不是从键盘输入
# | 管道符,从一个命令中读取输出并作为另一个命令的输入


# 输入重定向
# 可以让命令从文件中获取,这样本来的命令需要从标准输入stdin中获取,
# 转换为从我们的指定文件中获取。这样本来需要从键盘输入的命令就会转移到文件读取内容
# command1 < file 
# 0<1.txt cat # 重定向输入流

# 输出重定向
# 输出重定向也是将本来需要输出标准输出文件stdout中转化为我们的指定文件中
# cat 1.txt > 2.txt # 将1.txt的内容覆盖到2.txt
# cat 1.txt 1>  2.txt # 将1.txt的内容覆盖到2.txt
# cat 1.txt >> 2.txt # 将1.txt的内容追加到2.txt
# cat 1.txt 1>> 2.txt # 将1.txt的内容追加到2.txt

# 标准错误文件重定向
# 借助标准错误文件的文件描述符来重定向stderr
# command 2>file
# 将stdout标准输出文件和stderr标准错误文件合并重定向到一个指定文件中
# command > file 2>&1

# /dev/null 文件
# 如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null中,
# /dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;
# 如果尝试从该文件读取内容,那么什么也读不到。
# 但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。
# command > /dev/null

[本章完...]

相关文章

  • NDK<第九篇>:Shell脚本

    shell 是一种脚本语言。脚本:本质是一个文件,文件里面存放的是 特定格式的指令,系统可以使用脚本解析器 翻译或...

  • FDK_AA编译

    fdk_aac版本:0.1.6,ndk版本:15,shell脚本如下: NDK=/Users/admin/Desk...

  • LAME编译

    在mac下编译lame,lame版本:3.10,ndk版本:15,shell脚本如下: NDK=/Users/ad...

  • X264编译

    shell脚本如下: NDK=/Users/admin/Desktop/xxx/e/ndks/android-nd...

  • MacOS下编译FFmpeg android版

    遇到的问题 用了最新的ffmpeg和ndk进行编译,出了些问题,shell脚本对不同ffmpeg、ndk版本,不是...

  • 编译最新版FFmpeg

    FFmpeg 编译步骤: 配置环境(NDK,FFmpeg安装包) 配置FFmpeg的shell脚本 执行脚本生成s...

  • Mac系统下Android FFmpeg编译

    1.下载源码 2.下载NDK(android-ndk-r17c) 3.配置编译shell脚本 armv7a平台 x...

  • NDK - shell 脚本基础

    Shell 是一个C语言编写的程序,它是用户使用Linux的桥梁。是一门命令语言,又是一门程序设计语言。 Linu...

  • FFMPEG build shell 脚本

    #!/bin/bash #全局变量,多个shell脚本都可以使用 export ANDROID_NDK_HOME=...

  • android独立工具链的使用

    NDK 提供 make-standalone-toolchain.sh shell 脚本以允许您从命令行执行定制的...

网友评论

      本文标题:NDK<第九篇>:Shell脚本

      本文链接:https://www.haomeiwen.com/subject/wtsgzrtx.html