bash学习记录

一、基本用法

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}'

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值