Bootstrap

Shell快速入门

Shell快速入门

shell脚本执行方法

  • 采用 bash 或 sh+脚本的相对路径或绝对路径(不用赋予脚本+x 权限)
 sh /home/test/shell.sh
  • 采用输入脚本的绝对路径或相对路径执行脚本(必须具有可执行权限+x)
chmod +x shell.sh
./shell.sh
  • 在脚本的路径前加上“.”或者 source
. shell.sh
source shell.sh

第三种和前两种的区别在于:
前两种在当前shell中开启一个子shell进行执行;第三种在当前shell执行;而在子 shell 中设置的当前变量,父 shell 是不可见的。

变量的定义和使用

# 变量的定义与使用 bash中变量默认都是字符串类型,无法运算
# 常用的系统变量
echo $HOME
echo $PWD
echo $SHELL
echo $USER
# 自定义变量,注意=前后不能有空格
A="helloA"
echo $A
# 撤销定义的变量
unset A
echo A
# 声明静态变量,不能unset,不能修改
# readonly B="helloB"
# 将变量提升为全局变量
# export 变量名

读取命令行的参数

# 读取脚本名称和参数
# $0表示脚本名称,$1-$9表示第一到第九个参数,更多的参数需要使用${10}
echo "脚本名称 $0"
echo "第一个参数 $1"
echo "第二个参数 $2"
# 读取参数个数
echo "参数个数: $#"
# 读取所有参数
# $*将所有参数视为一个整体
echo "所有参数: $*" 
# $@将所有参数的每个参数视为单个
echo "所有参数: $@"

读取命令执行的状态

# 判断最后一次命令执行返回的状态,0:正确;非0:异常;
echo "最后一次命令执行状态 $?"

变量运算

# 变量的运算: $((运算表达式)) 或 $[运算表达式]
A=1
B=2
echo "变量运算A+B结果为:$[$A+$B]"

if语句

# if语句的使用
# if [ 条件表达式 ]
# then 
#   分支1
# elif [ 条件表达式 ]
# then
#   分支2
# else
#   分支3
# fi
if [ $1 -eq 1 ]
then 
  echo 1
elif [ $1 -eq 2 ]
then 
  echo 2
else
  echo 3	
fi  
# 判断条件:
# 等于: -eq、不等于: -ne、小于: -lt、小于等于: -le、大于: -gt、大于等于: -ge
# 字符串之间可以用 "=" 和 "!="
[ 23 -gt 22 ]
echo $?
# 判断文件是否具有权限 -w -r -x
[ -w shell.sh ]
echo $?
# 判断文件是否存在
[ -e a.txt ]
echo $?
# 判断文件存在并为一个文件
[ -f a.txt ]
echo $?
# 判断文件存在并为一个目录
[ -d child ]
echo $?
# $$ 前一条命令执行成功执行下一条,前一条失败执行下一个
[ -e a.txt ] && echo "存在" || echo "不存在" 

case语句

# case
case $1 in
"a")
	echo "a"
;;
"b") 
	echo "b"
;;
*)
esac

循环语句

# for循环
sum=0
for((i=0;i<=10;i++))
do 
sum=$[$sum+$i]
done
echo $sum
# for循环2
for i in a b c
do 
echo $i
done
# while循环
i=1
sum=0
while [ $i -le 10 ]
do 
sum=$[$sum+$i]
i=$[$i+1]
done
echo $sum

读取控制台输入

# 读取控制台输入
read -t 5 -p "5秒内数据: " input
echo $input

自定义函数

# 自定义函数
function sum(){
  res=0
  res=$[$1+$2]
  echo "$res" 
}
read -p "first value: " v1
read -p "second value:" v2
sum $v1 $v2

正则表达式

#匹配出现goutian的行
cat /test.txt | grep goutian
#匹配以a开头的行
cat /test.txt | grep ^a
#匹配以a结尾的行
cat /test.txt | grep a$
#匹配任意一个字符 .    
cat /test.txt | grep d.g  #dag---dzg
#匹配前面的字符n个 *
cat /test.txt | grep do*g  #dg - dog - doog -- do...g
#范围匹配
[ ] 表示匹配某个范围内的一个字符,例如
[6,8]------匹配 6 或者 8
[0-9]------匹配一个 0-9 的数字
[0-9]*------匹配任意长度的数字字符串
[a-z]------匹配一个 a-z 之间的字符
[a-z]* ------匹配任意长度的字母字符串
[a-c, e-f]-匹配 a-c 或者 e-f 之间的任意字符
#转义字符 \ 用于匹配某些有意义的字符,如 $
cat /test.txt | grep 'a\$b' # 匹配包含a$b的行

awk

文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。

awk [选项参数] ‘/pattern1/{action1} /pattern2/{action2}…’ filename

  • pattern:表示 awk 在数据中查找的内容,就是匹配模式
  • action:在找到匹配内容时所执行的一系列命令
选项参数功能
-F指定输入文件分隔符
-v赋值一个用户定义变量

比较复杂还没研究透,后续补充。

一个样例:备份文件

#!/bin/bash
# 首先判断输入参数个数是否为 1
if [ $# -ne 1 ]
then
echo "参数个数错误!应该输入一个参数,作为归档目录名"
exit
fi
# 从参数中获取目录名称
if [ -d $1 ]
then
echo
else
echo
echo "目录不存在!"
echo
exit
fi
DIR_NAME=$(basename $1)
DIR_PATH=$(cd $(dirname $1); pwd)
# 获取当前日期
DATE=$(date +%y%m%d)
# 定义生成的归档文件名称
FILE=archive_${DIR_NAME}_$DATE.tar.gz
DEST=/root/archive/$FILE
# 开始归档目录文件
echo "开始归档..."
echo
tar -czf $DEST $DIR_PATH/$DIR_NAME
if [ $? -eq 0 ]
then
echo
echo "归档成功!"
echo "归档文件为:$DEST"
echo
else
echo "归档出现问题!"
echo
fi
exit

本文基于B站尚硅谷视频自学梳理。

;