shell语法练习

    xiaoxiao2023-10-31  150

    变量的定义和使用

    编写shell脚本,第一行是#!/bin/bash代表是个shell脚本

    输入参数:

    形式说明$0当前程序的名称$n程序的输入参数n=1 第一个参数n2 第二个参数1…n$*所有输入的参数$#输入参数的个数$?命令执行的状态,一般返回0代表成功

    先来一个简单的输出shell

    #!/bin/bash echo "haha" A=10 #代表输出自己 echo $0 #代表输出第一个参数 echo $1 #代表输出第二个参数 echo $2 #$?表示执行是否成功 0代表成功 非0代表失败 echo "this \$? is $?" #$* 列出所有传入的参数 echo "this \*? is $*" #$# 代表输入了几个参数 echo "this \#? is $#"

    执行./demo.sh haha hehe之后输出如下

    [root@cdh-master test]# ./demo.sh haha hehe haha ./demo.sh haha hehe this $? is 0 this \*? is haha hehe this \#? is 2

    循环

    for循环:

    #!/bin/bash for i in `seq 1 15` do echo "数字 $i" done

    seq代表取值,上面代码就是取1-15的值

    for循环中的逻辑放在do和done的中间,运行上面的代码就会输出1-15之间的数字。

    使用for循环求和:

    #!/bin/bash j=0 for((i=0;i<=100;i++)) do j=`expr $i + $j` done echo $j

    使用加号需要用expr关键字来修饰

    使用for循环,循环压缩文件

    #!/bin/bash j=0 for i in `find /app/bigdata/test -name "*.sh"` do tar -cvf chs.tgz $i done

    通过find命令找到某个文件夹下的所有.sh结尾的文件,然后通过tar命令来压缩。

    while循环:

    #!/bin/bash i=0 while((i<100)) do echo "数字 $i" i=`expr $i + 1` done

    也可以使用下面的方式

    #!/bin/bash i=0 while [[ $i -lt 100 ]] do echo "数字 $i" i=`expr $i + 1` done

    使用while读取文件

    #!/bin/bash i=0 while read line do echo $line #小于号代表读取出来的内容指向哪里 done</app/bigdata/test/text.txt

    条件

    if语句:

    if语句后面不需要{},只需要;,语句的第一样一定要使用tab键输入,不能使用空格。空格在shell中不能随便写,代表一个特殊的分割符

    #!/bin/bash a=300 b=200 if (($a<$b));then echo "a<b" else echo "a>b" fi

    例子: -d是判断目录是否存在

    #!/bin/bash if [[ ! -d /app/bigdata/hello ]];then mkdir -p /app/bigdata/hello else echo "目录已经存在" fi ------------------- #!/bin/bash dir=/app/bigdata/test/haha.txt if [[ ! -d $dir ]];then vi $dir else echo "文件经存在" cat $dir fi

    算数运算

    算数运算符关系运算符布尔运算符字符串运算符文件测试运算符

    算数运算符

    运算符说明例子+加法`expr $a + $b`-减法`expr $a - $b`*乘法`expr $a * $b`/除法`expr $a / $b`%取余`expr $a % $b`=赋值a=$b==相等[ a = = a== a==b ]!=不相等[ a ! = a!= a!=b ]

    注意:条件表达式要放在中括号内,并且要有空格!

    算数运算符中我们不能直接使用运算符得到结果比如1+1,只会输出一个字符串“1+1”,想要得到结果有四种方式,建议使用第四种

    使用 ( ( ) ) ‘ (()) ` (())(( 4 + 5 ))`使用 [ ] ‘ [] ` [][ 4 + 5 ]`使用let命令 n=10 let n=n+1使用expr外部程式 a=`expr 4 + 5` 命令描述例子-eq等于[ $a -eq $b ]-ne不等于[ $a -ne $b ]-gt大于[ $a -gt $b ]-lt小于[ $a -lt $b ]-ge大于等于[ $a -ge $b ]-le小于等于[ $a -le $b ]

    布尔运算符:

    命令描述例子!非运算[ !false ]-a与运算[ $a -lt 20 -a $b -gt 100 ]-o或运算[$a -lt 20 -o $b -gt 100]

    逻辑运算符

    命令描述例子&&逻辑中的and[[ $a -lt 100 && $b -gt 200]]||逻辑中的or[[ $a -lt 100 || $b -gt 200]]

    字符串运算符

    命令描述例子=两个字符串相等[ a = a= a=b ]!=两个字符串不等[ a ! = a!= a!=b ]-z字符串长度是否为0 0返回true[ -z $a ]-n字符串长度是否为0 非0返回true[ -n “$a” ]$字符串是否为空 非空返回true[ $a ]

    文件测试运算符

    $file代表文件的路径

    命令描述例子-b文件是否是块设备文件[ -f $file ]-c文件是否是字符设备文件[ -f $file ]-d目录是否存在[ -d $file ]-f文件是否存在[ -f $file ]-g文件是否设置了SGID位[ -f $file ]-k文件是否设置粘着(Sticky Bit)位[ -f $file ]-p文件是否有名管道[ -f $file ]-u文件是否置了SUID位[ -f $file ]-r文件是否可读[ -f $file ]-w文件是否可写[ -f $file ]-x文件是否可执行[ -f $file ]-s文件是否为空[ -f $file ]-e文件(包括目录)是否存在[ -f $file ]

    重定向

    Linux中一切皆文件

    描述符:

    标准输入standard input0 (默认设备键盘)标准输出standard input1 (默认设备显示器)错误输出error input2 (默认设备显示器)

    输出重定向>比如cat 0< text.txt

    输出重定向< 比如echo hello > filename

    方法函数

    定义一个函数

    第一种:

    name() { }

    第二种:

    [ function ] funname [()] { action; [return int;] }

    例子:

    #!/bin/bash aa="this is aa" bb="this is bb" function test(){ echo $1 cc="this. is cc" dd="this is dd" echo $cc echo "我是一个函数" } #调用函数并传参 test 10 #!/bin/bash a=1; factorial(){ #此处$1是西面调用的时候传过来的参数 for i in `seq $1` do let a*=$i done echo "$1 的阶乘 $a " } #此处$1是外部传入的参数 factorial $1

    函数的返回值

    #!/bin/bash fun2(){ read -p "请输入数值" num let 2*num } fun2 echo "fun2 return value: $?"

    $?代表取上一条指令的返回值,上面的函数返回值为0。0代表执行成功,非0表执行失败(数值在0-255之间)

    可以通过echo的方法返回一个数值

    #!/bin/bash fun2(){ read -p "请输入数值" num echo $[2*$num] } result=`fun2` echo "fun2 return value: $result"

    使用shell脚本编译FFmpeg

    FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。FFmpeg是一个多媒体视频处理工具,具有非常强大的功能,包括视频采集功能,视频格式转换,视频抓图,给视频添加水印等。

    FFmpeg组成部分

    FFmpeg工具:1.FFmpeg 2.FFplay 3.FFprobe

    FFmpeg开发库:

    LibavcdecLibavutilLibavfrmatLibavdebiceLibavfilterLibswscaleLibswresample

    FFmpeg下载地址:http://www.ffmpeg.org/download.html

    如果我们编译到Android中使用,需要用到Android的NDK

    NDK下载:

    wget https://dl.google.com/android/repository/android-ndk-r17c-linux-x86_64.zip

    下载完NDK配置环境变量

    vim /etc/profile

    NDKROOT=/app/bigdata/test/android-ndk-r17c export PATH=$NDKROOT:$PATH

    sorce /etc/profile

    然后执行ndk-build如果打印下面的信息就说明配置OK

    [root@cdh-master android-ndk-r17c]# ndk-build Android NDK: Could not find application project directory ! Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.

    把下载的ffmpeg的压缩包上传到服务器

    解压tar -xjf ffmpeg-4.1.3.tar.bz2报错

    [root@cdh-master test]# tar -xjf ffmpeg-4.1.3.tar.bz2 tar (child): bzip2: Cannot exec: No such file or directory tar (child): Error is not recoverable: exiting now tar: Child returned status 2 tar: Error is not recoverable: exiting now

    因为没有安装bzip2,给它安装

    yum install bzip2

    在解压OK

    下面开始编译ffmpeg,因为编译的时候需要指定很多参数,所以把它们写到一个shell脚本中方便查看和执行。

    进入到ffmpeg-4.1.3的解压目录中,新建一个build.sh

    #!/bin/bash #NDK的安装目录 NDK_ROOT=/root/ndk/android-ndk-r17c #TOOLCHAIN 变量指向ndk中的交叉编译gcc所在的目录 TOOLCHAIN=$NDK_ROOT/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/ #FLAGS与INCLUDES变量 可以从AS ndk工程的.externativeBuild/cmake/debug/armeabi-v7a/build.ninja中拷贝,需要注意的是**地址** FLAGS="-isystem $NDK_ROOT/sysroot/usr/include/arm-linux-androideabi -D__ANDROID_API__=21 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -mthumb -Wa,--noexecstack -Wformat -Werror=format-security -std=c++11 -O0 -fPIC" INCLUDES="-isystem $NDK_ROOT/sources/cxx-stl/llvm-libc++/include -isystem $NDK_ROOT/sources/android/support/include -isystem $NDK_ROOT/sources/cxx-stl/llvm-libc++abi/include" #执行configure脚本,用于生成makefile #--prefix : 安装目录 #--enable-small : 优化大小 #--disable-programs : 不编译ffmpeg程序(命令行工具),我们是需要获得静态(动态)库。 #--disable-avdevice : 关闭avdevice模块,此模块在android中无用 #--disable-encoders : 关闭所有编码器 (播放不需要编码) #--disable-muxers : 关闭所有复用器(封装器),不需要生成mp4这样的文件,所以关闭 #--disable-filters :关闭视频滤镜 #--enable-cross-compile : 开启交叉编译(ffmpeg比较**跨平台**,并不是所有库都有这么happy的选项 ) #--cross-prefix: 看右边的值应该就知道是干嘛的,gcc的前缀 xxx/xxx/xxx-gcc 则给xxx/xxx/xxx- #disable-shared enable-static 不写也可以,默认就是这样的。 #--sysroot: #--extra-cflags: 会传给gcc的参数 #--arch --target-os : PREFIX=./android/armeabi-v7a2 ./configure \ --prefix=$PREFIX \ --prefix=$PREFIX \ --enable-small \ --disable-programs \ --disable-avdevice \ --disable-encoders \ --disable-muxers \ --disable-filters \ --enable-cross-compile \ --cross-prefix=$TOOLCHAIN/bin/arm-linux-androideabi- \ --disable-shared \ --enable-static \ --sysroot=$NDK_ROOT/platforms/android-21/arch-arm \ --extra-cflags="$FLAGS $INCLUDES" \ --extra-cflags="-isysroot $NDK_ROOT/sysroot" \ --arch=arm \ --target-os=android make clean make install

    保存执行几分钟后,会看到生成了一个andorid目录,里面就是编译完成的文件。

    最新回复(0)