嵌入式开发之初学shell(1)

Learn shell(1)

题目:

  • 从一个给定文件(1000ValuesCalcMean,该文件有1000行,每行只有一列数据)中读取数据,求取所有数据的平均数。

思路:检查给定文件状态,利用for line in ' cat /filename' or awk or while read line;do 来读取数据

  • Shell 输入/输出重定向
    大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回​​到您的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是你的终端。
    重定向命令列表如下:
命令说明
command > file将输出重定向到 file。
command < file-将输入重定向到 file。
command >> file将输出以追加的方式重定向到 file。
n > file-将文件描述符为 n 的文件重定向到 file。
n >> file将文件描述符为 n 的文件以追加的方式重定向到 file。
n >& m将输出文件 m 和 n 合并。
n <& m将输入文件 m 和 n 合并。
<< tag将开始标记 tag 和结束标记 tag 之间的内容作为输入。

需要注意的是文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。

  • 方法一:
#第一种方法
#!/bin/bash
sum=0
avg=0
i=0
#file=/home/suliu/Desktop/suliu/1000ValuesCalcMean
#cd /home/suliu/Desktop/suliu/1000ValuesCalcMean
if test -e /home/suliu/Desktop/suliu/1000ValuesCalcMean

then 
	for line in `cat /home/suliu/Desktop/suliu/1000ValuesCalcMean`
	do
		sum=`expr $sum + $line`
		i=`expr $i + 1`
	done
	avg=`expr $sum / $i`
	echo -e "$avg\n" > ./mean_result_suliu.txt
else
	echo "0"
fi

  • 方法二:
#第二种方法
#!/bin/bash
sum=0
if test -e /home/suliu/Desktop/suliu/1000ValuesCalcMean

then
   cat /home/suliu/Desktop/suliu/1000ValuesCalcMean | awk '{sum += $1} END {print sum/1000 > "mean_result_201930310130_冯志强.txt"}'    
else
    echo "0"
fi

  • 方法三:用到了数组
#第三种方法
#!/bin/bash
i=0
sum=0
avg=0
declare -a data
if test -e ./1000ValuesCalcMean
then
while read line;
   do 
       data[i]=$line
       i=`expr $i + 1`
   done
       for j in ${data[*]}
   do
       sum=`expr $sum + $j`
   done
       avg=`expr $sum / $i`
       echo -e "$avg\n" > ./mean_result_suliu.txt
else 
       echo "0"
fi

注:关于shell脚本的一些用法

  1. 运行 Shell 脚本有两种方法
  • 作为可执行程序
    chmod +x ./test.sh #使脚本具有执行权限
    ./test.sh #执行脚本
  • 作为解释器参数
    /bin/sh test.sh
    /bin/php test.php

变量赋值

your_name="asdf"

使用变量

your_name="qinjx"
echo $your_name
echo ${your_name}
(变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界)

只读变量

readonly myUrl

  • 获取字符串长度
    string="abcd"
    echo ${#string} # 输出 4

使用双引号拼接

greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1

使用单引号拼接

greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2 $greeting_3

定义数组

array_name=(value0 value1 value2 value3)

  • 读取数组
    ${数组名[下标]}

  • 使用 @ 符号可以获取数组中的所有元素,例如:
    echo ${array_name[@]}

获取数组的长度

  • 获取数组长度的方法与获取字符串长度的方法相同,例如
    length=${#array_name[@]}
    或者
    length=${#array_name[*]}

取得数组单个元素的长度

lengthn=${#array_name[n]}

以 # 开头的行是注释,会被解释器忽略。 多行注释还可以使用以下格式:

:<<EOF
注释内容...
注释内容...
注释内容...
EOF

传递参数

#!/bin/bash
echo "Shell 传递参数实例!";
echo "第一个参数为:$1";
echo "参数个数为:$#";
echo "传递的参数作为一个字符串显示:$*";

Ubuntu 常用解压与压缩命令

  • .tar 文件
仅打包,并非压缩
tar -xvf FileName.tar        # 解包
tar -cvf FileName.tar DirName # 将DirName和其下所有文件(夹)
打包
  • .gz文件
.gz
gunzip FileName.gz  # 解压1
gzip -d FileName.gz # 解压2
gzip FileName       # 压缩,只能压缩文件
  • .tar.gz文件、 .tgz文件
tar -zxvf FileName.tar.gz               # 解压
tar -zcvf FileName.tar.gz DirName       # 将DirName和其下所有文件(夹)压缩
tar -C DesDirName -zxvf FileName.tar.gz # 解压到目标路径
  • .zip文件
    感觉.zip占用空间比.tar.gz大
unzip FileName.zip          # 解压
zip FileName.zip DirName    # 将DirName本身压缩
zip -r FileName.zip DirName # 压缩,递归处理,将指定目录下的所有文件和子目录一并压缩
  • .rar文件
    mac和linux并没有自带rar,需要去下载
rar x FileName.rar      # 解压
rar a FileName.rar DirName # 压缩

参考链接

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值