Learn shell(1)
题目:
- 从一个给定文件(1000ValuesCalcMean,该文件有1000行,每行只有一列数据)中读取数据,求取所有数据的平均数。
思路:检查给定文件状态,利用
for line in ' cat /filename'
orawk
orwhile 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脚本的一些用法
- 运行 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 # 压缩
参考链接