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站尚硅谷视频自学梳理。