Shell 脚本

首先作为一个开发者我们需要知道我们所学习的东西的使用用处!shell脚本作为应用程序和linux内核中间件!应用程序调用shell脚本,linux内核执行相关脚本,返回结果给应用程序!

shell脚本输出命令

echo [选项] [输出内容]
      选项:
           -e:支持反斜线控制的字符转换(具体参见表 1)
           -n:取消输出后行末的换行符号(内容输出后不换行)
 
例子: 输出"hello world":    echo -e "\"hello world\""
注意: echo 命令中如果使用了"-e"选项,则可以支持控制字符
           控制字符	       作 用
           \\	           输出\本身
           \a	           输出警告音
           \b	           退格键,也就是向左删除键
           \c	           取消输出行末的换行符。和“-n”选项一致
           \e	           Esc键
           \f	           换页符
           \n	           换行符
           \r	           回车键
           \t	           制表符,也就是Tab键
           \v	           垂直制表符
           \Onnn	       按照八进制 ASCII 码表输出字符。其中 0 为数字 0,nnn 是三位八进制数
           \xhh	           按照十六进制 ASCH 码表输出字符。其中 hh 是两位十六进制数

查看历史命令

history [选项] [历史命令保存文件]
         选项:
              -c:清空历史命令
              -w:把缓存中的历史命令写入历史命令保存文件中。如果不手工指定历史命令保存文件,则放入默认历史命令保存文件 ~/.bash_history 中	
	对于简化管理操作、排查系统错误都有重要的作用,而且使用简单方便,建议大家多使用历史命令

例子: 输出过去命令历史: history	

    使用上、下箭头调用以前的历史命令 
    使用"!n"重复执行第 n 条历史命令
	使用"!!"重复执行上一条命令
	使用"!字符串"重复执行最后一条以该字符串开头的命令
	使用"!$"重复上一条命令的最后一个参数

命令快速自动补全

在 Bash 中,命令与文件补全是非常方便与常用的功能,我们只要在输入命令或文件时按 Tab,就会自动进行补全	

Bash 常用快捷键

    快捷键	        作 用
    Ctrl+A	        把光标移动到命令行开头。如果我们输入的命令过长,则在想要把光标移动到命令行开头时使用
    Ctrl+E	        把光标移动到命令行结尾
    Ctrl+C	        强制中止当前的命令
    Ctrl+L	        淸屏,相当于 clear 命令
    Ctrl+U	        刪除或剪切光标之前的命令。假设输入了一行很长的命令,无须使用退格键一个一个字符地刪除, 使用这个快捷键会更加方便
    Ctrl+K	        删除或剪切光标之后的内容
    Qrl+Y	        粘贴 Ctrl+U 或 Ctrl+K 剪切的内容
    Ctrl+R	        在历史命令中搜索,按下 Ctrl+R 组合键之后,就会出现搜索界面,只要输入搜索内容,就会从历史命令中搜索
    Ctrl+D	        退出当前终端
    Ctrl+Z	        暂停,并放入后台。这个快捷键涉及工作管理的内容,我们会在后续中详细介绍
    Ctrl+S	        暂停屏幕输出
    Ctrl+Q	        恢复屏幕输出

Linux标准输入输出

输出
        在输出重定向中,">"代表的是覆盖,">>"代表的是追加	
         不同标准输入输出: 例子 history >> ./command.log  history命令的结果就会追加到当前目录的command.log文件内容中	 
        
        例子: 系统中并不存在test这样的一个目录,但是如果我执行ls test -al命令的话,系统就会报错!如何将错误信息保存在相关错误log中呢?
         首先想到的是通过标准输入输出来记录,如:ls test -al >> ./err.log然而事与愿违,错误信息并未追加到err.log中,后来发现
         2 代表错误输出,只有这样才能把命令的错误输出保存到指定的文件中。这里大家需要注意"2>>"一定不能有空格,否则会报错
             正确的写法是 ls test -al 2>>./err.log 
        	  
                      类型符号	                                                作 用
                   标准输出重定向	               命令 > 文件	                以覆盖的方式,把命令的正确输出输出到指定的文件或设备中
                                                   命令 >> 文件	                以追加的方式,把命令的正确输出输出到指定的文件或设备中
                   标准错误输出重定向	           错误命令2 > 文件	            以覆盖的方式,把命令的错误输出输出到指定的文件或设备中
                                                   错误命令2 >> 文件	            以追加的方式,把命令的错误输出输出到指定的文件或设备中
                   正确输出和错误输出同时保存	       命令 > 文件2>&1	            以捜盖的方式,把正确输出和错误输出都保存到同一个文件中
                                                   命令 >> 文件2>&1	            以追加的方式,把正确输出和错误输出都保存到同一个文件中
                                                   命令&>文件	                以覆盖的方式,把正确输出和错误输出都保存到同一个文件中
                                                   命令&>>文件	                以追加的方式,把正确输出和错误输出都保存到同一个文件中
                                                   命令>>文件1 2>>文件2	        把正确的输出追加到文件1中,把错误的输出追加到文件2中
        											
        上的方式虽然可行,但是在实际操作中,并不会这样做。实际操作中尽量将正确或错误的输出全部保存在同一个文件中
           例子: 将正确或错误的输出全部保存在同一文件中  ls test -al >>./command.log 2>&1 	
 												
输入
    wc [选项] [文件名]
        选项:
            -c:统计字节数
            -w:统计单词数
            -l:统计行数	

shell(bash)多命令顺序执行

    	      多命令执行符	        格 式	                作 用
              ;	                命令1 ; 命令2	            多条命令顺序执行,命令之间没有任何逻辑关系
              &&	            命令1 && 命令2	            如果命令1正确执行($?=0),则命令2才会执行
                                                            如果命令1执行不正确($?≠0),则命令2不会执行
              II	            命令1 || 命令2	            如果命令1执行不正确($?≠0),则命令2才会执行
                                                            如果命令1正确执行($?=0),则命令2不会执行

grep 提取符合条件的字符串行(在文件中提取和匹配符合条件的字符串行)

    grep [选项] "搜索内容" 文件名	
          选项:
              -A 数字:列出符合条件的行,并列出后续的 n 行;
              -B 数字:列出符合条件的行,并列出前面的 n 行;
              -c:统计找到的符合条件的字符串的次数;
              -i:忽略大小写;
              -n:输出行号;
              -v:反向査找;
              --color=auto:搜索出的关键字用颜色显示	
 grep 是行提取命令,所以只要一行数据中包含"搜索内容",就会列出整行的数据
 
 例子: 查找用户信息文件/etc/passwd中有多少可以登录的用户: grep "/bin/bash" /etc/passwd
 
 和find命令的区别: find命令是完全匹配查找,而grep是包含匹配查找

shell通配符用法

 通配符	作 用
 ?	    匹配一个任意字符
 *	    匹配 0 个或任意多个任意字符,也就是可以匹配任何内容
 []	    匹配中括号中任意一个字符。例如,[abc] 代表一定匹配一个字符,或者是 a,或者是 b,或 者是 c
 [-]	匹配中括号中任意一个字符,- 代表一个范围。例如,[a-z] 代表匹配一个小写字母
 [^]	逻辑非,表示匹配不是中括号内的一个字符。例如,[^0-9] 代表匹配一个不是数字的字符
 
 例子:假设当前目录下存在 011,0abc,abc三个目录
     ls ?abc  的结果是 0abc,并不会存在abc,因为?不能匹配空
	 ls 0* 的结果是 011,0abc
     ls [0-9]* 的结果是 011,0abc
	 ls [^0-9]* 的结果是 abc

单引号,双引号,反引号

  单引号括起来的字符都是普通字符,就算特殊字符也不再有特殊含义
  双引号括起来的字符中,"$"、"\"和反引号是拥有特殊含义的,"$"代表引用变量的值
  反引号代表引用命令	  
  
  例子: 定义变量 $ name=stephen
        echo "$name"   结果: stephen         注意:双引号如果需要输出$,`则需要加转义符'\'
		echo '$name'   结果: $name
		echo `date`    结果: Thu 12/27/2018  注意:反引号里面的内容只能是shell命令

Shell(Bash)小括号和大括号用法及区别

  小括号和大括号的区别主要在于:
      () 执行一串命令时,需要重新开启一个子 Shell 来执行。
      {} 执行一串命令时,在当前 Shell 中执行。
      () 和 {} 都是把一串命令放田括号里面,并且命令之间用";"隔开。
      () 最后一条命令可以不用分号。
      {} 最后一条命令要用分号。
      {} 的第一条命令和左括号之间必须有一个空格。
      () 里的各命令不必和括号有空格。
      () 和 {} 中括号里面的某条命令的重定向只影响该命令,但括号外的重定向则会影响到括号里的所有命令   

Bash变量定义及规范

   变量名命名规范:只能存在字母,数字,下划线,但数字不能作为变量名的开头,例如:'3name'这是错误的变量命名	  
   变量用等号"="连接值,"="左右两侧不能有空格
   变量值中如果有空格,则需要使用单引号或双引号包含,如 test="hello world!"
   双引号括起来的内容"$"和反引号者都拥有特殊含义,而单引号括起来的内容都是普通字符
   在变量值中,可以使用转义符"\"

(Shell)Bash用户自定义变量及使用

   用户自定义变量只需要遵守规则: 变量名=变量值,注意‘=’符号两边不能存在空格,否则linux会把它当做系统命令执行,从会出现报错的情况。
   
   set 命令可以用来查看系统中的所有变量(用户自定义变量和环境变量)和设定 Shell 的执行环境
   env只能用来查看系统中的环境变量
   
   例子环境变量内容叠加
   1.首先在系统内存在PATH环境变量
   2.我们在/home/stephen/sh路径下存在demo.sh脚本
   3.我们在PATH环境变量下添加/home/stephen/sh路劲
   4.命令如下: PATH=$PATH:/home/stephen/sh
   5.我们现在可以在系统任意目录下执行demo.sh脚本,而不需要执行脚本路径了

Shell环境变量设置方法详解

   	环境变量和用户自定义变量的唯一区别是:环境变量是全局变量,而用户自定义变量是局部变量。
    定义环境变量的方式是:定义好自定义变量后,采用export命令将自定义变量声明为环境变量即可。		

Shell PATH变量用法详解:系统查找命令的路径

    echo $PATH	查看系统PATH环境变量   :/usr/lib/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin	
	被定义到PATH环境变量中的路径下的脚本是可以直接运行的,系统会自动在path环境变量下面去寻找路径
    注意':'分隔路径

Shell PS1变量:命令提示符设置

    PS1变量可以用来帮助用户自定义命令提示符,就是terminal中每行命令前面的那一串(即为提示符)
        \d:显示曰期,格式为"星期 月 日"
        \H:显示完整的主机名。如默认主机名"localhost.localdomain"
        \h:显示简写的主机名。如默认主机名"localhost"
        \t:显示 24 小时制时间,格式为"HH:MM:SS"
        \T:显示 12 小时制时间,格式为"HH:MM:SS"
        \A:显示 24 小时制时间,格式为"HH:MM"
        \@:显示 12 小时制时间,格式为"HH:MM am/pm"
        \u:显示当前用户名
        \v:显示 Bash 的版本信息
        \w:显示当前所在目录的完整名称
        \W:显示当前所在目录的最后一个目录
        \#:执行的第几条命令
        \$:提示符。如果是 root 用户,则会显示提示符为"#";如果是普通用户,则会显示提示符为"$"
		
	执行echo $PS1命令,可以看到类似如下结果[\u@\h \W]\$ 
    修改命令提示符: PS1='[\u@\h \w]\$'	 需要注意的是PS1变量的内容必须要用单引号才能生效,否则报错	

Shell(Bash)位置参数变量用法

    在linux中,若一条命令或者脚本执行时,后面可以跟着一系列参数,我们采用位置参数变量来表示这些参数。
	
	   位置参数变量	                作 用
       $n	                        n 为数字,$0 代表命令本身,$1〜$9 代表第 1〜9 个参数,10 以上的参数需要用大括号包含, 如${10}
       $*	                        这个变量代表命令行中所有的参数,把所有的参数看成一个整体
       $@	                        这个变量也代表命令行中所有的参数,不过 $@ 把每个参数区别对待
       $#	                        这个变量代表命令行中所有参数的个数
	   
	   
	   例子: 具体参数变量使用,去运行此脚本内容即可知晓
	   #!/bin/bash
	   x=$1
	   y=$2
	   z=$(($x + $y))
	   echo $z
	   echo /$* parameters is $*
	   echo /$@ parameters is $@
	   
	   j=0
	   for i in "$*"
	   do
	   echo "The parameters is: $i"
	   j=$(($j+1))
	   done
	   echo "j is:$j"
       
       x=0
	   for y in "$@"
	   do 
	   echo "the Parameters $x id $y"
	   x=$(($x+1))
	   done
	   echo "x is: $x"

Shell 预定义变量

    预定义变量是在 Shell 一开始时就定义的变量,这一点和默认环境变量有些类似
	
	预定义变量	        作 用
    $?	                最后一次执行的命令的返回状态。如果这个变量的值为 0,则证明上一条命令正确执行;如果这 个变量的值为非 0 (具体是哪个数由命令自己来决定),则证明上一条命令执行错误
    $$	                当前进程的进程号(PID)
    $!	                后台运行的最后一个进程的进程号(PID)
	
	
	echo "the current process id is:" $$
	grep "echo" ./test.sh &
	echo "the last process id is:" $!
	注意:上面shell脚本的第二句的&符号,表示将该‘grep "echo" ./test.sh’命令放入后台执行

Shell接收键盘输入或其他文件描述符的输入 read

	[root@localhost ~]# read [选项] [变量名]
	
	[选项]
	-p "提示信息":在等待read输入时,输出提示信息
    -t 秒数:read命令会一直等待用户输入,使用此选项可以指定等待时间
    -n 字符数:read命令只接收指定的字符数就会执行
    -s: 隐藏输入的数据,适用于机密信息的输入
 		
	[变量名]
    变量名可以自定义。如果不指定变量名,则会把输入保存到默认变量REPLY中;
    如果只提供了一个变量名,则将整个输入行赋予该变量;
    如果提供了一个以上的变量名,则输入行分为若干字,一个接一个地赋予各个变量,而命令行上的最后一个变量取得剩余的所有字;
     
    例子: 
	read -t 30 -p "please input x:" x
	echo "user input x:" $x
	read -t 30 -p "please input y:" y
	echo "user input y:" $y
	echo "x+y=" $(($x+$y))
	
    例子2:
	username=stephen
	password=root
	read -t 30 -p "please enter username" uname
	read -t 30 -p "please enter password" passwd
	if [ "$username" = "uname" ] && [ "$password" = "$passwd" ];then
	echo "login success!"
	else
	echo "login failed!"
	fi

Shell数值运算

    首先用户需要注意的是,脚本命令定义的变量默认为”字符串型“
	例如: 
	x=3
	y=4
	z=$x+$y
	echo "x+y="$z    输出结果是x+y=3+4
	这里我们就可以发现,shell变量默认类型为“字符串型”
	
	如何声明变量类型  
	
	1.使用declare声明变量类型
	 declare [+/-] [选项] 变量名
	      选项:
	          -:给变量设定类型属性
              +:取消变量的类型属性
              -a:将变量声明为数组型
              -i:将变量声明为整数型(integer)
              -r:将变量声明为只读变量。注意,一旦设置为只读变量,既不能修改变量的值,也不能删除变量,甚至不能通过 +r 取消只读属性
              -x:将变量声明为环境变量
              -p:显示指定变量的被声明的类型
			  
	我们使用declare重写上面的例子:
    x=3
    y=4
    declare -i z=$x+$y
    echo "x+y="$z		
	
	2.数组类型定义及使用
    直接上例子:
    comment[0]=I
    comment[1]=love
    comment[2]=you
    echo ${comment}
    输出结果是:I love you

	3.申明环境变量
	 在之前我们已经学习了使用export将变量声明为环境变量,但是此次我们学习使用declare来申明环境变量
	 例子:declare -x test  
	 
	4.采用linux运算命令来进行数值运算
	expr或let
	重写案例一的方案:使用expr
	x=3
	y=4
	z=$(expr $x + $y)    (注意: 在使用 expr 命令进行运算时,要注意"+"号左右两侧必须有空格,否则运算不执行)
	echo "x+y="$z 
	重写案例一的方案:使用let
	x=3
	y=4
	let z=$x+$y
	echo "x+y="$z
	
	5.使用"$((运算式))"或"$[运算式]"方式运算
	重写案例一:  使用$((运算式))
	x=3
	y=4
	z=$(( $x+$y ))
	echo "x+y="$z		
	重写案例二: 使用$[运算式]
	x=3
	y=4
	z=$[$x+$y]
	echo "x+y="$z		
	
	6. 取消变量的设置
	   unset 变量名 (相当于删除变量)

Shell常用运算符

    数值越大优先级越高
	
    优先级	       运算符	                                说 明
    13	           -,+	                                    单目负、单目正
    12	           !,~	                                    逻辑非、按位取反或补码
    11	           *, /, %	                                乘、除、取模
    10	           +, -	                                    加、减
    9	           <<, >>	                                按位左移、按位右移
    8	           <=, >=, <, >	                            小于或等于、大于或等于、小于、大于
    7	           == ,!=	                                等于、不等于
    6	           &	                                    按位与
    S	           ^	                                    按位异或
    4	           |	                                    按位或
    3	           &&	                                    逻辑与
    2	           II	                                    逻辑或
    1	           =,+=,•=,*=,/=,%=,&=, |=, <<=, >>=	    赋值、运算且赋值		

Shell变量测试及内容置换

    变量置换方式	       变量y没有设置	                    变量y为空值	            变量y设置值
    x=${y-新值}	       x= 新值	                        x 为空	                x=$y
    x=${y:-新值}       x= 新值	                        x= 新值	                x=$y
    x=${y+新值}	       x 为空	                        x= 新值	                x=新值
    x=${y:+新值}       x 为空	                        x 为空	                x=新值
	
    x=${y=新值}	       x= 新值	                        x 为空	                x=$y
                       y= 新值	                        y 值不变	                y值不变   
					   
    x=${y:=新值}	   x= 新值	                        X= 新值	                x=$y
                       y= 新值	                        y= 新值	                y值不变
					   
    x=${y?新值}	       新值输出到标准错误输出(屏幕)	    x 为空	                x=$y
    x=${y:?新值}	   新值输出到标准错误输出	            新值输出到标准错误输出	x=$y	

Shell source命令:使环境变量配置文件强制生效

source 配置文件
忽略脚本文件的权限。该命令主要用于让重新配置的环境变量配置文件强制生效

Shell(主要的)环境变量配置文件及其分类

    /etc/profile
	      -USER 变量:根据登录的用户给这个变量赋值(就是让 USER 变量的值是当前用户)。
          -LOGNAME 变量:根据 USER 变量的值给这个变量赋值。
          -MAIL 变量:根据登录的用户来定义用户的邮箱为 /var/spool/mail/ 用户名。
          -PATH 变量:根据登录用户的 UID 是否为 0,判断 PATH 变量是否包含 /sbin、/usr/sbin 和 /usr/local/sbin 这三个系统命令目录。
          -HOSTNAME 变量:根据主机名给这个变量赋值。
          -HISTSIZE 变量:定义历史命令的保存条数。
          -umask:定义 umask 默认权限。注意:/etc/profile 文件中的 umask 权限是在"有用户登录过程(输入了用户名和密码)"时才会生效的。
          -调用 /etc/profile.d/*.sh文件,也就是调用 /etc/porfile.d/ 目录下所有以 .sh 结尾的文件
	 
    /etc/profile.d/*.sh
    /etc/bashrc
	
	~/.bash_profile
    ~/.bashrc
	
	/etc/profile、/etc/profile_d/*.sh 和 /etc/bashrc 这三个环境变量配置文件会对所有的登录用户生效;
	而 ~/.bash_profile 和 ~/.bashrc 这两个环境变量配置文件只会对当前用户生效(因为每个用户的家目录中都有这两个文件)

Shell登陆信息及修改方法详解

   录 tty1~tty6 这 6 个本地终端时,会有几行的欢迎界面。这些欢迎信息是保存在哪里的?可以修改吗?当然可以修改,这些欢迎信息保存在 /etc/issue 文件中
      
	  /etc/issue支持的转义符
      转义符      作 用
      \d	      显示当前系统日期
      \s	      显示操作系统名称
      \1	      显示登录的终端号,这个转义符比较常用
      \m	      显示硬件体系结构,如i386、i686等
      \n	      显示主机名
      \o	      显示域名
      \r	      显示内核版本
      \t	      显示当前系统时间
      \u	      显示当前登录用户的序列号	   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值