shell知识点

概念

啥叫shell脚本呢?其实就是一个批处理文件,里面写了许多的命令,只需要运行这个文件,就相当于一次执行了许多命令
shell脚本的后缀名是 .sh

一个最简单的shell示例

第一种书写shell脚本的方式

#就相当于常规命令的操作集合
ls
pwd
ls -lah  /bin

如何执行它呢?

  • 将这个文件命名为: test.sh
  • 然后给它修改权限: chmod u=x test.sh
  • 然后执行: ./test.sh即可(之所以加 ./ 是为了加载执行该脚本所必须的环境变量)

    一般我们约定凡是自定义的脚本建议放到 /usr/local/sbin/ 目录下,这样做的目的是:一来可以更好地管理文档、二来以后接管你的管理员都知道自定义的脚本放在那里,方便维护

第二种书写shell脚本的方式

#! /bin/bash
# #!是表示该文件使用是bash语法,如果不设置该行,那么你的shell脚本就不能被执行;#表示注释
# In this script we will use variables
# Writen by util.you.com@gmail.com

d=`date`
echo "the script begin at $d"
echo "now we will sleep 2 seconds."

sleep 2
d1=`date`
# 定义变量的格式:变量名=`变量的值`
# 当在当前脚本中需要引用变量时,需要加上$符号即可
echo "the script end at $d1"

然后将该文件命名为 demo.sh【通常是以sh作为后缀的,只是习惯而已,没有sh也可以执行】
然后这样运行:

逻辑判断

if-else 的逻辑判断

  • 不带 else 的
#! /bin/bash

echo -n "请输入你的成绩: "
# read 命令表示从控制台读取内容,此处即是读取用户输入的数字并且赋值给变量 score
read score

if [ $score -lt 60 ]
then
  echo "抱歉,你没有通过考试."
fi

执行结果如下:

  • 带有 else 的
#! /bin/bash

echo -n "请输入你的成绩: "
# read 命令表示从控制台读取内容,此处即是读取用户输入的数字并且赋值给变量 score
read score

if [ $score -lt 60 ]
then
  echo "抱歉,你没有通过考试."
else
  echo "恭喜你,顺利通过考试."
fi

执行结果如下:

  • 带有 elif 的
#! /bin/bash

echo -n "请输入你的成绩: "
# read 命令表示从控制台读取内容,此处即是读取用户输入的数字并且赋值给变量 score
read score

if [ $score -lt 60 ] # 调用变量通过 $ 符号
then
  echo "抱歉,你没有通过考试."
elif [ $score -gt 60 ] && [ $score -lt 90 ]
then
  echo "你的成绩属于中等水平"
elif [ $score -gt 90 ] && [ $score -lt 100 ] # 注意:[] 符号前后必须有空格,否则报错
then
  echo "恭喜你,你的成绩属于优秀"
else
  echo "抱歉,你的输入有误."
fi

执行结果如下:

case 逻辑判断

#! /bin/bash

read -p "请输入一个整数: " n

a=`expr $n % 2` # 凡是需要调用到内置函数处理的都需要使用表达式引号 ``

case $a in
  0)
echo "您输入的数字是偶数."
;;
  *)
echo "您输入的数字是奇数."
;;
esac

执行结果如下:

循环

for 循环

#!/bin/bash

for i in `seq 1 5`; do # seq: 用于产生从某个数到另外一个数之间的所有整数
  echo $i
done

执行结果如下:

while 循环

#! /bin/bash

a=10 # 注意:a 后面不要有空格

while [ $a -ge 1 ]; do # 注意:[] 括号前后一定要有空格
  echo "$a"
  a=`expr $a - 1 ` # 注意:凡是使用到加减乘除等运算时,都需要使用 expr 表明此处需要运算符号
done

执行结果如下:

函数

#! /bin/bash

echo "请输入两个整数,并使用空格隔开: "
read num1 num2

sum(){
  a=`expr $num1 + $num2`
  echo "$num1 + $num2 = $a"
}

sum $num1 $num2 # 注意:这里必须要调用sum函数,并且传入用户输入的两个参数

执行结果如下:

echo 的好玩点

#! /bin/bash        

echo "Hello World 1"
echo -n "Hello world" #不带换行
echo -e "\e[0;33;1mhello\e[0m world" #带颜色的玩法
echo -e "\e[0;33;4mhello\e[0m world" #带颜色+下划线
echo -e "\e[0;33;5mhello\e[0m world" #带颜色+闪烁

格式为 \e[背景色;前景色;高亮格式m

执行结果如下:

字符串操作

判断字符串是否为空

#! /bin/bash

s=""
if [ -z ${s} ]  #注意:这里的[  ]前后必须有空格隔开,这个格式是固定的,shell中格式很严格
then
echo "字符串为空"
fi

执行结果如下:

上述命令中使用了 -z 运算符来判断字符串是否为空(在下面的字符串图中可以查找到),在 linux 中还有许多其它的运算符,如下图所示:

  • 关于文件测试的运算符

  • 关于字符串比较的运算符

获取字符串的长度

使用 str 本身的方法

#! /bin/bash

str="abcdef"
echo "$str 字符串的长度是:${#str}"

执行结果如下:

使用 awk 的 length 方法

#! /bin/bash

str="abcdef"
echo ${str} | awk '{print length($0)}' # 这里的 $0 表示是第一个输入,此处即指 ${str}

执行结果如下:

备注:最好用 {} 来放置变量;也可以用 length($0) 来统计文件中每行的长度

使用 wc 的 -L 参数

#! /bin/bash

str="ABCDEF"
echo ${str} | wc -L

执行结果如下:

备注:-L 参数,对多行文件来说,表示打印最长行的长度!比如:cat /etc/passwd | wc -L 表示/etc/passwd文件最长行的长度;
对单行字符串而言,表示当前字符串的长度

使用 expr 的 length 方法

#!/bin/bash

str="ABCDEF"
expr length ${str}

执行结果如下:

使用 expr 的 .* 技巧

#!/bin/bash

str="abef"
expr $str : ".*"

执行结果如下:

备注:.* 代表任意字符,即用任意字符来匹配字符串,结果是几就代表字符串的长度是几

关于获取字符串长度的方法很多,这里只是举例了几个,如果没有您需要的还请翻阅其它资料

替换目标字符串

截取子字符串

操作的API

示例如下:

转义字符处理

关于整数的处理

关于逻辑处理

小技巧:&&|| 还可以用来拼接命令,达到按前一个命令成功与否来决定是否执行后一个命令的效果

示例如下:

文件名的获取

#!/bin/bash

s="/root/test/dir/subdir/abc.txt"
echo ${s##*/} # abc.txt
echo ${s%/*} # /root/test/dir/subdir
echo ${s##*.} # txt

执行结果如下:

小技巧:

  • 1、获取文件名:${path##*/} (相当于basename命令的功能) ,path只是一个变量名称而已;
  • 2、获取目录名:${path%/*}(相当于dirname命令的功能);
  • 3、获取后缀名:${path##*.}

重定向

标准输入流、标准输出流、标准错误流

重定向一览表

把程序打印的内容输出到文件

#!/bin/bash

#以下两种方式都会将 `Hello World`写入到hello.txt中(若不存在则创建)
echo "Hello World" > hello.txt #hello.txt原有的内容将被覆盖
echo "你好哦" >> hello.txt #hello.txt原有内容后追加'Hello World'

执行结果如下:

重定向标准错误流(stderr)

把程序的错误信息输出到文件,例如文件路径中不存在+++这个文件:

#!/bin/bash

#以下两种方式都会将输出的错误信息输出到 'err.txt'中(若不存在则创建)
ls +++ 2> err.txt
ls +++ 2>> err.txt #err.txt原有内容后追加内容

执行结果如下:


可以看到已经将你操作 ls +++ 的错误成功地输出到 err.txt 中了

查看当前目录大小

#! /bin/bash

cap=`du -h --max-depth=1 ./`
echo $cap

执行结果如下:


   转载规则


《shell知识点》 拉丁小毛 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
Java 中 IO 操作总结 Java 中 IO 操作总结
java IO 操作分析直接看代码吧 package jdk.util.sourceCode; import java.io.*; /** * 经常会遇到各种 IO 流操作,IO 流操作一般分为两类:字符流和字节流。 * 以 "R
2020-01-06
下一篇 
国内真实刑事案件 国内真实刑事案件
1992年河南洛阳美女任雪事件 1990年代末吉林省前郭县系列灭门事件 1983年震惊全国的内蒙古牙克石红旗沟事件 1992年跨越辽吉晋冀四省的恶性事件 1994年山东济南厅级干部买凶事件 1996年南京大学刁爱青事件 1998
2020-01-04
  目录