shell程序的特点:
1、简单易学
2、解释性语言,不需要编译即可执行
Shell又称命令解释器,它能识别用户输入的各种命令,并传递给操作系统。它的作用类似于
Windows操作系统中的命令行,但是,Shell的功能远比命令行强大的多。在UNIX或者localhost中,Shell既是用户交互的界面,也是控制系统的脚本语言。
·Bourne Shell:标识为sh,该Shell由Steve Bourne在贝尔实验室时编写。在许多Unix系统中,该Shell是root用户的默认的Shell。·Bourne-Again Shell:标识为bash,该Shell由Brian Fox在1987年编写,是绝大多数localhost发行版的默认的Shell。 ·Korn Shell:标识为ksh,该Shell由贝尔实验室的David Korn在二十世纪八十年代早期编写。它完全向上兼容 Bourne Shell 并包含了C Shell 的很多特性。 ·C Shell:标识为csh,该Shell由Bill Joy在BSD系统上开发。由于其语法类似于C语言,因此称为C Shell。
1 [root@localhost ~]# cat /etc/shells 2 /bin/sh 3 /bin/bash 4 /sbin/nologin 5 /usr/bin/sh 6 /usr/bin/bash 7 /usr/sbin/nologin
1 [root@localhost ~]# echo $SHELL 2 /bin/bash
1. 熟练使用vi(vim)编辑器 2. 熟练掌握Linux基本命令 3. 熟练掌握文本三剑客工具(grep、sed、awk) 4. 熟悉常用服务器部署、优化、日志及排错
1、掌握Shell脚本基本语法 2、形成自己的脚本开发风格 3、从简单做起,简单判断,简单循环 4、多模仿,多参考资料练习,多思考 5、学会分析问题,逐渐形成编程思维 6、编程变量名字要规范,采用驼峰语法表示 7、不要拿来主义,特别是新手
骆驼式命名法就是当变量名或函数名是由一个或多个单词连结在一起,而构成的唯一识别字时,第一个单词以小写字母开始;从第二个单词开始以后的每个单词的首字母都采用大写字母
#编辑.sh文件时自动生成关于脚本文件说明的注释 [root@localhost ~]# cat /root/.vimrc autocmd BufNewFile *.py,*.cc,*.sh,*.java exec ":call SetTitle()" func SetTitle() if expand("%:e") == 'sh' call setline(1,"#!/bin/bash") call setline(2,"#########################") call setline(3,"#File name:".expand("%")) call setline(4,"#Version:v1.0") call setline(5,"#Email:[email protected]") call setline(6,"#Created time:".strftime("%F %T")) call setline(7,"#Description:") call setline(8,"#########################") call setline(9,"") endif endfunc
(1)交互式执行
1 [root@localhost ~]# for filename in `ls /etc` 2 > do 3 > if echo "$filename" | grep "passwd" 4 > then 5 > echo "$filename" 6 > fi 7 > done
(2)作为程序文件执行(常用)
对于一组需要经常重复执行的Shell语句来说,将它们保存在一个文件中来执行。我们通常称这种包含多个Shell语句的文件为Shell脚本,或者Shell脚本文件。脚本文件是普通的文本文件,可使用任何的文本编辑器查看或修改Shell脚本。
1 [root@localhost ~]# mkdir /test 2 [root@localhost ~]# cd /test 3 [root@localhost test]# vim test1.sh 4 #!/bin/bash 5 for filename in `ls /etc` 6 do 7 if echo "$filename" | grep "passwd" 8 then 9 echo "$filename" 10 fi 11 done
(1)bash ./filename.sh(产生子进程,再运行,使用当前指定的bash shell去运行)
(2)./filename.sh(产生子进程,再运行,使用脚本里面指定的shell去运行。使用该种方式执行需要x权限)
(3)source ./filename.sh(source命令是一个shell内部命令,其功能是读取指定的shell程序文件,并且依次执行其中的所有的语句,并没有创建新的子shell进程,所以脚本里面所有创建的变量都会保存到当前的shell里面)
(4). ./filename.sh(和source一样,也是使用当前进程执行)
root@localhost test]# echo 'userdir=`pwd`' > test3.sh 2 [root@localhost test]# cat test3.sh 3 userdir=`pwd` 4 (1)[root@localhost test]# bash test3.sh 5 [root@localhost test]# echo $userdir 6 7 [root@localhost test]# 8 (2)[root@localhost test]# chmod a+rx test3.sh 9 [root@localhost test]# ./test3.sh 10 [root@localhost test]# echo $userdir 11 12 [root@localhost test]# 13 (3)[root@localhost test]# source test3.sh 14 [root@localhost test]# echo $userdir 15 /test 16 (4)[root@localhost test]# . test3.sh 17 [root@localhost test]# echo $userdir 18 /test
可以使用exit num指定脚本的退出状态码。
可以使用数字,字母,和下划线给变量命名 不能用数字开头 如果给同一个变量赋值多次,最后一次赋值会覆盖之前的值
echo $PATH echo ${PATH} printf "$PATH\n" printf "${PATH}\n"
注意:$,\,反单引号`,单引号,双引号
$:会将$符号后面的字符识别的成一个变量,引用变量里面的值;
\:会将所有特殊字符转义,会让特殊字符失去原有的含义;
反单引号:会将反单引号里面的内容当成一个命令来执行;
单引号:会让所有处于单引号里面的特殊字符失效;
双引号:会让所有处于双引号里面的特殊字符失效,除了$,反单引号,\在双引号里面保留自己的特殊含义。
set:查看所有的变量和函数 declare:查看所有的变量和函数 env:显示所有的全局变量
在命令行中定义:退出当前进程后该变量就失效,其他终端上无法使用该变量
在文件中定义:永久生效 当前用户生效的文件 ~/.bashrc和 ~/.bash_profile 所有用户生效的文件 /etc/bashrc, /etc/profile,/etc/profile.d/*.sh su和su -切换方式加载的文件不同: 1 [root@node13 ~]# su - student 2 Last login: Sun Sep 18 23:06:43 CST 2022 on pts/0 3 /etc/profile 4 /etc/profile.d/name3.sh 5 /etc/bashrc 6 /home/student/.bash_profile 7 /home/student/.bashrc 8 /etc/bashrc 9 10 [root@node13 ~]# su student 11 /home/student/.bashrc 12 /etc/bashrc 13 /etc/profile.d/name3.sh
(1)局部变量(普通变量):只在某个特定范围生效的变量,比如只能在当前进程中使用的变量,只能在函数中使用的变量。
在命令行设置:在当前进程生效 在脚本文件中设置:在脚本文件中生效 在函数中定义普通变量: local var="value",只在当前函数中生效在用户登录时加载的文件中设置:在脚本文件中无法使用
2)全局变量(环境变量):可以在创建他们的shell及其派生出来的子进程中使用(su 切换用户的时候会读取新的环境变量)。
自定义环境变量和bash内置的环境变量。 自定义环境变量 export var或 export var="value"declare -x var="value", declare +x var可取消环境变量 bash内置环境变量 shell程序在运行时,会接受一组变量来确定登录用户名、命令路径、终端类型、登录目录等等,这些变量就是环境变量。shell内置的环境变量是所有的shell程序都可以使用的变量,环境变量会影响所有的脚本的执行结果。
unset var
与其他的程序设计语言一样,shell也有很多运算符。
1 [root@localhost ~]# r=$((2+5*8)) 2 [root@localhost ~]# echo $r 3 42 4 [root@localhost ~]# let r=3+2 5 [root@localhost ~]# echo $r 6 5 7 [root@localhost ~]# r=`expr 4+2` 8 [root@localhost ~]# echo $r 9 4+2 10 [root@localhost ~]# r=`expr 4 + 2` 11 [root@localhost ~]# echo $r 12 6 13 #使用expr计算字符的长度 14 [root@localhost test4]# char="i have a" 15 [root@localhost test4]# expr length "$char" 16 8 17 [root@localhost ~]# r=$[3+2] 18 [root@localhost ~]# echo $r 19 5 20 [root@localhost ~]# awk 'BEGIN {print 2+3*2}' 21 8 22 [root@localhost test4]# echo "6.282 3.14" | awk '{print ($1-$2)}' 23 3.142 24 [root@localhost ~]# declare -i r=3+2 25 [root@localhost ~]# echo $r 26 5
1 [root@localhost test4]# cat 1.sh 2 #!/bin/bash 3 a=$1 4 b=$2 5 echo a+b=$(($a+$b)) 6 echo a-b=$((a-b)) 7 echo a*b=$((a*b)) 8 echo a/b=$((a/b)) 9 echo a%b=$((a%b)) 10 [root@localhost test4]# ./1.sh 10 3 11 a+b=13 12 a-b=7 13 a*b=30 14 a/b=3 15 a%b=1
1 [root@localhost test4]# cat 1.1.sh 2 #!/bin/bash 3 read -p "please input two number:" a b 4 echo $a+$b=$(($a+$b)) 5 echo $a-$b=$((a-b)) 6 echo $a*$b=$((a*b)) 7 echo $a/$b=$((a/b)) 8 echo $a%$b=$((a%b)) 9 [root@localhost test4]# ./1.1.sh 10 please input two number:3 4 11 3+4=7 12 3-4=-1 13 3*4=12 14 3/4=0 15 3%4=3
1 [root@localhost ~]# str1="hello world" 2 #返回变量长度 3 [root@localhost ~]# echo ${#str1} 4 11 5 6 #变量截取 7 #指定起始位置,一直到结束 8 [root@localhost ~]# echo ${str1:1} 9 ello world 10 #指定长度,不指定起始位置默认从开头开始 11 [root@localhost ~]# echo ${str1::3} 12 hel 13 #指定起始位置和长度 14 [root@localhost ~]# echo ${str1:1:3} 15 ell 16 #从右边第几个字符开始,及字符的个数 17 [root@localhost ~]# echo ${str1:0-1:1} 18 d 19 #输出右边的几个字符 20 [root@localhost ~]# echo ${str1:0-5} 21 world 22 [root@localhost ~]# echo ${str1: -5} 23 world 24 #提取完整字符串 25 [root@localhost ~]# echo ${str1:-5} 26 hello world
1 #获取后缀名tar.gz 2 [root@localhost ~]# filename=testfile.tar.gz 3 [root@localhost ~]# file=${filename#*.} 4 [root@localhost ~]# echo $file 5 tar.gz 6 #获取后缀名.gz 7 [root@localhost ~]# filename=testfile.tar.gz 8 [root@localhost ~]# file=${filename##*.} 9 [root@localhost ~]# echo $file 10 gz 11 #截取testfile.tar 12 [root@localhost ~]# filename=testfile.tar.gz 13 [root@localhost ~]# file=${filename%.*} 14 [root@localhost ~]# echo $file 15 testfile.tar 16 17 #截取testfile 18 [root@localhost ~]# filename=testfile.tar.gz 19 [root@localhost ~]# file=${filename%%.*} 20 [root@localhost ~]# echo $file 21 testfile