shell
操作系统是对软硬件资源进行管理,内存管理、文件管理、CPU管理、进程管理等。linux最核心的对硬件管理就是linux的内核,而内核之外提供了一层壳,即shell,可以让程序员通过shell去调用内核,操纵硬件。
shell文件一般为.sh,启动方式:
# 新开一个bash(即子bash)来运行shell脚本
./a.sh
bash a.sh
#在当前bash运行shell脚本
. a.sh #注意空格
source a.sh #注意空格
#若没有运行权限, chmod+x a.sh
第一章:shell变量
-
shell变量名由字母、下划线、数字组成,变量名不能以数字开头。
-
shell定义的变量时=两端不能有空格。
-
shell定义的变量默认是局部变量,可以使用export将其升级为全局变量。
-
env
查看系统变量,set
查看用户定义的变量。env | grep my_var
. -
unset
释放用户定义的变量。 -
readonly a=99
定义只读变量,不能修改;只读变量不能被unset。 -
特殊变量
# $n $0 #脚本的名称与路径 $1 #脚本的第一个参数 $9 #脚本的第九个参数 ${10} #脚本的第十个参数 $* #得到所有参数,并将其视为一个字符串。加""后就不能单个遍历了哦 $@ #得到所有参数,将其视为一个数组,可以遍历的哦 $? #返回上一条指令的执行状态 $# #表示参数的个数
-
系统变量的用法
echo $HOME echo $PWD echo $USER A=1 echo A A=$((1+5)) A=$[1+5]
第二章:运算符
#!/bin/bash
sum=${$1 + $2}
echo $sum
#$[] $(()) 运算符计算的常用方式
a=$[ 5 * 3 ]
a=$((5 * 3))
a=`expr 5 \* 3`
第三章:判断语句
- 字符串的判断
a=hello
test a=hello #用test很麻烦可以用[]替换 判断为真返回0 ,判断为假返回1
echo $?
[ $a = hello ] #注意[ ] 两头有空格,等号两端有空格
echo $?
[ $a != Hello]
echo $?
-
常用的其他判断
-
两个之间比较(在shell中<是输入重定向,>是输出重定)
-eq 等于equal -nq 不等于 not equal
-lt 小于 less than -le 小于等于 less equal
-gt 大于 greater then -ge大于等于greater equal
[ 5 -lt 9 ] echo $? [ 5 -le 9 ] echo $? [ 5 -eq 9] echo $? [ 9 -gt 2 ] echo $?
-
2. 文件权限进行判断
-r 有读权限read
-w 有写权限write
-x 有执行权限execute
touch test
touch hello
chmod +x hello
[ -r test ]
echo $?
[ -x test ]
echo $?
[ -x hello ]
echo $?
3. 文件类型进行判断
-e 文件存在existence
-f 文件存在并且是一个常规文件file
-d 文件存在并且是一个目录directory
touch test
mkdir testDir
[ -e test ]
echo $?
[ -e test22 ]
echo $?
[ -f test ]
echo $?
[ -f testDir ]
echo $?
[ -d test ]
echo $?
[ -d testDir ]
echo $?
4. 多条件判断(&& || ,&&是上一条指令执行成功才执行后一条指令,||是上一条指令执行失败才执行后一条指令)
[ 5 -lt 9 ] && [ 9 -ge 20 ] && echo Ok || echo NotOk
第四章:流程控制
流程控制一般分为:顺序流程、分支流程、循环流程。
-
分支流程
#; shell中如果一行要写多个命令可以用;分开 就是直接顺序执行就可以了。 #if但分值 if [ ]; then #shell 命令 fi if [] then #shell 命令 fi # -a表示and与 [ 9 -gt 3 -a 33 -le 11] # -o表示or或 [ 9 -gt 3 -o 33 -le 11] #if 多分支 if[ ] then shell代码 elif [] then shell代码 else shell代码 if #例子 echo $0 if [ "$1"x = "hello"x ] #很常见的一个方法,字符串拼接 then echo "hello shell" fi if [ $2 -ge 0 -a $2 -lt 10 ] then echo "-ge 0" elif [ $2 -ge 10 -a $2 -lt 20 ] then echo "-ge 10" else echo "-ge 20" fi #case 多分支 )很重要 ;;也很重要 case $3 in 1) echo "one" ;; 2) echo "two" ;; 3) echo "three" ;; *) echo "else number" ;; esac
-
for循环 与while循环
#for循环 语法1 for(( 初始值;循环控制条件;变量变化 )) do 程序 done for (( i=1; i<=$1;i++ )) do sum=$[ $sum + $i ] done echo $sum #for循环 语法2 for 变量 in 值1 值2.... do 程序 done for os in linux windows macos; do echo $os ;done for i int {1..100};do echo $i; done #{}表示一个序列,两个.就够了。 #来看看$* 和 $@的却别 #!/bin/bash echo $0 for i in $* do echo $i done for i in $@ do echo $i done for i in "$*" do echo $i done for i in "$@" do echo $i done ################################### while [ 判断条件 ] do done a=1 while [ $a -le $1] do $sum2=$[ $sum2 + $a ] a=$[ $a + 1 ] done echo $sum2
第五章: read读控制台输入
read实现shell编程的IO交互,特别是读数据哈,echo实现输出。
read (选项) (参数)
选项:
-p 提示字符串
-t 超时等待时间
参数:
接受输入变量的参数
read -t 10 -p "请输入您的姓名:" num
echo "Hello, " $num "!"
第六章:函数
-
系统函数 (就是linux内核提供的一些命令)
basename和dirname
#!/bin/bash echo $(date) #$() 里面调用命令、函数 echo $(date +%s) filename="$1"_log_$(date) #log文件常见命令方法 echo filename echo file name : $(basename $0) echo file name : $(basename $0 .sh) cd $(dirname $0) echo file path : $(pwd) echo file path : $(cd $(dirname $0); pwd)
-
自定义函数
调用之前必须定义函数。返回值return,若没有return将返回最后一条命令的运行结果。
#!/bin/bash function add() { s=$[ $1 + $2 ] echo "和:" $s } read -p "请输入第一个整数" a read -p "请输入第二个整数" b add $a $b ######################################### #!/bin/bash function add(){ s=$[ $1 + $2 ] echo $s } read -p "请输入第一个整数" a read -p "请输入第二个整数" b sum=$(add $a $b) echo "和:"$sum
第七章:正则表达式
正则表达使用单个字符串来描述、匹配一些列符合某个语法规则的字符串。在linux中,grep、sed、awk等文本处理工具都支持正则表达式进行模式匹配。
-
常规匹配
ps -aux | grep 1316
-
常用特殊字符
1) ^匹配一行的开头,如
^abc 就是匹配所有以abc开头的一行。
2) $匹配一行的结尾,例如
abc$就是匹配所有以abc结尾的一行。
cat hello.sh | grep -n ^$ #匹配空行,可以显示空行的行号
3) .通配符,表示任何字符,如
a.b ,可以匹配所有a任意字符b 的字符串
a…b
a…b
4) *任意次数通配符,要与前一个字符配合使用
a*,a出现任意次,可以为0次可以为n次。
思考.*就是任意字符,出现任意次!就是可以匹配多个字符嘛。
^a.*a$ ^a.*b.*a$
5) 字符区间[ ]
[ ] 表示匹配某个范围内的一个字符。
[6,9] [0-9] [0-9]* [a-z] [a-z]* #任意长度的 小写字母字符串 [a-c,f-z]
5) 转意符\
cat hello.sh | '\$' cat hello.sh | '/\$'
实例:手机号匹配
echo "18328018088" | grep ^1[34578][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$ echo "18328018088" | grep -E ^1[345678][0-9]{9}$
第八章:文本处理工具
-
cut。cut命令从文件的每一个行剪切字节、字符和字段并将这些字节、字符和字段输出。
-f :列号,提取第几列
-d:分隔符,按照指定分隔符分割列,默认是制表符“\t”
-c:按照字符切割
cut -f 1 -d " " cut.txt cat cut.txt | cut -f 1 -d " " cat /etc/passwd | grep bash$ | cut -d ":" -f 1,6,7 cat /etc/passwd | grep bash$ | cut -d ":" -f 1-4 ifconfg ens33 | grep netmask | cut -d " " -f 10
-
-
awk
一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开部分再进行分析处理。
awk [选项参数] ‘/pattern1/{action} /pattern2/{action}…’ filename
pattern: 表示awd在数据中查找的内容,匹配模式,就是正则。
action:在查找匹配内容时所执行的一些列命令。
-F 指定输入文件分隔符
-v 赋值一个用户定义变量
cat /etc/passwd | grep ^root | cut -d ":" -f 7
cat /etc/passwd | awk -F ":" '/^root/{print $7}'
cat /etc/passwd | awk -F ":" '/^root/{print $1","$7}'
cat /etc/passwd | awk -F ":" 'BEGIN{"user ,shell"}{print $1","$7} END{print "end of file"}'
cat /etc/passwd | awk -F ":" '{print $3}'
cat /etc/passwd | awk -F ":" '{print $3+1}'
cat /etc/passwd | awk -v i=1 -F ":" '{print $3+i}'
cat /etc/passwd | awk -F ":" '{print "文件名:" FILENAME " 行号: " NR " 列号: " NF}'
awk -F ":" '{print "文件名:" FILENAME " 行号: " NR " 列号: " NF}' /etc/passwd
awk的内置变量:
FILENAME: 文件名
NR:行号
NF:列号
综合应用案例
1.归档文件
linux的归档命令 tar,-c表示归档,加上-z表示同时进行压缩,得到的文件后缀为.tar.gz;-f表示归档过程可视化
#! /bin/bash
#首先参数个数判断 是否为1
if [ $# -eq 1 ]
then
echo "参数不对,应该输入一个参数,作为待归档的目录"
exit
fi
#从删除中获得目录名称
if [ -d $1 ]
then
echo
else
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 -zgf $DEST $DIR_PATH/$DIR_NAME
if [ $? -eq 0 ]
then
echo
echo "归档失败!"
else
echo
echo "归档成功!"
fi
exit