一、基本用法
1.脚本文件开头为
#!/bin/bash
并设置权限为可执行:
chmod +x file
2.给变量赋值及读取变量
#给变量赋值
name = "Sam"
#读取变量
echo ${name}或echo $name
3.把命令的输出,赋值给一个变量
cat readme.txt
ret=$(cat readme.txt)或ret=`cat readme.txt`
echo $ret
4.运算
#let计算
let "a=5+6"
echo $a
#expr会把表达式的结果输出,运算符和各个数字之间需要有空格
expr 5 + 6
#双括号计算
a=$((5+6))
5.判断语句
语句格式:
if <condition>
then
<cmd>
else
<cmd>
fi
temp=35
if [ ${temp} -ge 30 ]
then
echo "It's hot, we should turn on the AC."
fi
判断表达式:
Operator | Description |
! EXPRESSION | The EXPRESSION is false. |
-n STRING | The length of STRING is greater than zero. |
-z STRING | The lengh of STRING is zero (ie it is empty). |
STRING1 = STRING2 | STRING1 is equal to STRING2 |
STRING1 != STRING2 | STRING1 is not equal to STRING2 |
INTEGER1 -eq INTEGER2 | INTEGER1 is numerically equal to INTEGER2 |
INTEGER1 -gt INTEGER2 | INTEGER1 is numerically greater than INTEGER2 |
INTEGER1 -lt INTEGER2 | INTEGER1 is numerically less than INTEGER2 |
-d FILE | FILE exists and is a directory. |
-e FILE | FILE exists. |
-r FILE | FILE exists and the read permission is granted. |
-s FILE | FILE exists and it's size is greater than zero (ie. it is not empty). |
-w FILE | FILE exists and the write permission is granted. |
-x FILE | FILE exists and the execute permission is granted. |
6.循环语句
语句格式:
#for循环
for var in <list>
do
<commands>
done
#until循环
until [ <some test> ]
do
<commands>
done
二、习题练习
1.找到本地的一个代码目录,统计里面.cpp文件(或者.java .py等等)的个数。
ls *.cpp|wc -l
2.用下面的命令在/tmp目录生成一个脚本文件1.sh
- printf '#!/bin/bash\ngrep "processor\|model name" /proc/cpuinfo\n' > /tmp/1.sh
- 如果尝试执行这个脚本: /tmp/1.sh会出错。请修改文件属性,让脚本可以执行,给出执行结果。
printf '#!/bin/bash\ngrep "processor\|model name" /proc/cpuinfo\n' > /usr/local/test/1.sh
chmod +x 1.sh
3.用下面的命令在/tmp目录中生成目录和文件
- $ mkdir -p /tmp/bash/data && touch /tmp/bash/data/foo.txt
- 建立一个目录/tmp/bash/bakup,并把文件/tmp/bash/data/foo.txt拷贝到/tmp/bash/bakup/foo_bakup.txt
- 把文件/tmp/bash/bakup/foo_bakup.txt改名为/tmp/bash/bakup/foo_bakup_YYYYMMDD.txt 其中YYYYMMDD是当天日期:年/月/日。
cp /usr/local/test/data/foo.txt /usr/local/test/data2/foo_bakup_20190221.txt
4.用下面的命令在/tmp目录中生成文件1.txt和2.txt
- seq 1 100 > /tmp/1.txt; seq 2 101 > /tmp/2.txt
- 查看两个文件各多少行。
- 查看每个文件的前5行和最后5行。
- 比较两个文件的差异。
wc -l 1.txt
head -n 5 1.txt
tail -n 5 1.txt
diff -a 1.txt 2.txt
5.统计根目录下的文件日期。用ls -l /会得到根目录下的文件和目录信息。其中有文件的修改日期。请用 cut / awk / sort / uniq 中的一个或几个,统计一下这些日期出现的频率。
ls -l / | awk '{print $6,$7}' | sort | uniq -c | tail -n +2
6.用uname -a可以看到操作系统的一些信息,用空格分割。使用sed或其他工具,把每一个信息单词分行打印出来
sed 's/ /\n/g' name.txt
7.hostname
- 假设hostname被赋值给变量h: h=$(hostname)
- 把hostname在屏幕上显示出来,输出如下:The host name is <hostname>
printf "The host name is <%s>\n" ${h}
8.&&和||
- 命令test $(( RANDOM )) -ge 30000的输出是随机的,有时候是0,有时候是1。
- 请用&&的方法,当结果是0的时候,输出”I got a small number”
- 请用||的方法,当结果是1的时候,输出”I got a large number”
9.保存find结果
- 用find命令时,如果遇到没有查看权限的目录或文件,find会输出到standard error。
- 将命令find /etc的standard out保存到/tmp/find.stdout,将standard error保存到/tmp/find.stderr。统计这两个文件的行数。
find /etc 1> find.stdout
find /etc 2> find.stderr
10.写一个脚本,命令行参数是1-2个文件名。功能如下:
- 如果没有命令行参数,或者命令行参数大于2个,输出使用格式
- 如果只有一个参数:(1)文件不存在,提示错误(2)文件存在,则输出文件内容
- 如果有两个参数:(1)如果任何一个文件不存在,提示错误(2)如果两个文件都存在,用diff比较结果
#!/bin/bash
if [ $# == 0 ];then
echo "请输入一个或两个文件名"
elif [ $# == 1 ];then
if [ -f $1 ];then
cat $1
else
echo "文件不存在"
fi
elif [ $# == 2 ];then
if [ -f $1 ] && [ -f $2 ];then
diff $1 $2
else
echo "文件不存在"
fi
fi
11.写一个函数lucky_number(),输出是一个1-100的随机整数。调用这个函数20次,输出20个结果
#!/bin/bash
lucky_number() {
for i in {1..20}; do
printf "The lucky number is %s\n" $(( RANDOM ))
done
}
lucky_number
12.命令 factor $n 是可以将 n 分解质因数,打印从1-100的素数,每个一行。
factor `seq 100` | awk -F '[: ]' '{if(NF == 3) print $1}'