Linux运维 第二阶段 (八)shell基础

Linux运维第二阶段(八)shell基础

一、shell的两种主要语法:Bourne家族(sh/ksh/bash/psh/zsh;C家族(csh/tcsh)。

         注:bashzsh在不同程度上支持csh的语法。

         #vi  /etc/shells                 (可查询linux支持的shell

二、1、#echo  -e|-n  输出内容

         -e      可支持反斜线\控制的字符转换(\\,\a,\b,\c,\e,\f\,\n,\r,\t,\v,\0mmm,\xhh

         -n      取消输出行末的换行符号,内容输出后不换行

例:#echo  -e  “ab\bc”

         #echo  -e  “a\tb\tc\nd\te\t\f\”

         #echo  -e  “\e[1;31mabcd \e[0m”       (输出内容加颜色)

         注:字体颜色(30m-37m分别代表:黑、红、绿、黄、蓝、洋红、青、白);背景颜色(40m-47m.

         2shell脚本的运行方式:

    赋予权限直接运行(通过绝对路径或相对路径);

    通过bash调用执行(#bash  hello.sh

三、bash的基本功能:

         1、#history  选项

            -c      (清空历史命令

            -w历史命令保存文件  (缓存中的历史命令写入文件,默认保存位置:~/.bash_history

         #vi  /etc/profile      (可修改文件历史命令保存条数

         注:用history命令查看到的是缓存中的,可用#history –w 直接写入文件

         历史命令的调用:上下键;!n重复执行第n条历史命令;!!重复执行上一条命令;!字串,重复执行最近一次以该字串开关的命令;!$重复上一条命令的最后一个参数

         2、命令与文件的补全(tab键)

         3、命令别名:#alias  别名=‘原命令’unalias取消别名

         例:#alias  vi=’vim’               (临时生效

     命令执行顺序:绝对路径、相对路径;别名;bash内部命令;环境变量PATH定义的路径依次查找。

         4、常用快捷键:ctrl+A,ctrl+E,ctrl+C,ctrl+L,ctrl+u,ctrl+K(删除或剪切光标之后的内容),ctrl+Y(粘贴),ctrl+S(暂停屏幕输出),ctrl+Q(恢复屏幕输出),ctrl+D(退出当前终端),ctrl+Z(暂停放入后台),ctrl+R(在历史命令中搜索)

         5、设备  设备文件名     文件描述符     类型

        键盘   /dev/stdin         0       标准输入

        显示器 /dev/stdout        1       标准输出

        显示器 /dev/stderr        2       标准错误输出

命令>文件|设备          错误命令2>文件|设备      覆盖方式

命令>>文件|设备         错误命令2>>文件|设备     追加方式

命令>文件 2>&1           命令&>文件                覆盖方式正确输出错误输出都保存

命令>>文件 2>>&1         命令&>>文件               追加方式正确输出错误输出都保存

命令>>文件1 2>>文件2                   正确输出追加至文件1,错误输出追加至文件2

#wc 选项 文件

     -c       统计字节数byte

     -w       统计单词数word

     -l       统计行数line

6、多命令顺序执行:

              命令1;命令2     (多个命令顺序执行,命令之间没有任何逻辑关系

         &&     命令1&&命令2     (当命令1正确执行($?=0)命令2才会执行;命令1执行不正确($?!=0)命令2不会执行

         ||     命令1||命令2     (当命令1执行不正确($?!=0)命令2才会执行;当命令1正确执行($?=0)命令2不会执行

注:一般情况下最好让&&在前||在后,否则会错误执行,例:命令&&命令||命令

7 #grep 选项 “搜索内容”

         -A number        列出符合条件的行,并列出后续n

         -B number        列出符合条件的行,并列出前n

         -i               ignore忽略大小写

         -v               invert-match取反

         -c               统计找到符合条件的字符串的次数

         -n               line-number输出行号

         --color=auto     搜出的关键字用颜色显示

例:#grep –A 3 “root”/etc/passwd

         #grep –n “/bin/bash” /etc/passwd

         #grep –v “/bin/bash” /etc/passwd

         #netstat –an | grep “ESTABLISHED” | wc –l

         #rpm –qa | grep httpd

8、通配符:

      *        匹配0个或任意多个字符,可匹配任何内容

                匹配1个任意字符

         []       匹配括号中任意一个字符,例:[abc]中的一个

         [-]      匹配括号中范围内的一个字符,例:[a-z]中的一个字符

         [^]      匹配不是括号中的一个字符,例:[^0-9]代表不是数字的字符

9bash中的其它特殊符号

         ‘’         单引号内的所有特殊符号都没有特殊含义,包括$``反引号

         “”         双引号中的特殊符号都没有特殊含义,除$``反引号、\转义符外

         ``           反引号里的内容是系统命令,在bash中会先执行,同$()一样

         $()          引用系统命令,与反引号作用一样

         \           在转义符\之后的特殊符号将失去特殊含义,变为普通字符,例:\$,输出$

         $           调用变量的值,例:$name

         ()          一串命令执行时,()内的命令在子shell中执行

         {}          一串命令执行时,{}内的命令在当前shell中执行,也可用于变量变形与替换

         []          用于变量的测试

         #           shell中表示注释

注:(){}的区别:执行一串命令时()里的命令需重新开一个子shell执行,而{}里的命令是在当前shell下执行;两者都把命令放在括号里,且命令之间用;分号隔开,()内最后一个命令可以不用分号,{}内最后一个命令要加上分号;{}内的第一条命令与左括号之间必须要有一个空格,()内则不用;两者括号里的某个命令的重定向只影响该命令,但括号外的重定向则影响括号里的所有命令。

例:     #name=sb

         #(name=sd;echo $name)

         #echo $name

         #{ name=sd;echo $name;}

         #echo $name

四、bash的变量和运算符

         1、变量:

         变量名称由字母、数字、下划线组成,不能以数字开头,例:2name

         变量的默认类型是字符串型,如要进行数值运算,则必须指定为数值型;

         变量用等号连接,且左右两侧不能有空格;

         变量值中若有空格,要用单引号或双引号包括,例:test=”hello world”,注意双引号里有三个特殊符号拥有特殊含义:$``反引号、\

         在变量的值中,不能有转义符\

         如需增加变量的值,可进行变量值的叠加,两种格式:”$变量名${变量名},例:#test=”$test”456#test=${test}456

         如要把命令的结果作为变量值赋予变量,则要使用``反引号或$(),例:#test=$(date)#test=`date`

         环境变量名建议大写,便于区分。

         2、变量的分类:

         用户自定义变量:最常见的,由用户自由定义变量名和变量值;

         环境变量:保存系统操作环境的相关数据,可自由定义,如当前登录用户、家目录、命令提示符;

         位置参数变量:主要用来向脚本传递参数和数据,变量名不能自定义,变量作用是固定的;

         预定义变量:bash中已定义好的变量,变量名不能自定义,变量作用是固定的。

        3#set                   (查看系统中所有变量

            #env                   (仅查看环境变量environment

            #set –u|-x            -u,有此项调用未声明变量时会报错,默认无任何提示;-x,有此项在命令执行之前会把命令先输出一次

            #unset 变量名          (变量删除

        4#export AGE=”18”     (声明为环境变量

            #env | grep AGE        (查询环境变量

            #unset AGE             (删除AGE变量

  • PATH变量:系统查找命令的路径,用冒号分隔

注:在命令行中输入了一个命令,没写绝对路径,系统就会到PATH定义的路径中寻找,有则执行。无则提示“Command not fount”;脚本可拷贝至PATH定义的某一路径中,也可通过变量的叠加实现。

例:#cp /root/sh/hello.sh /bin

#PATH=”$PATH”:/root/sh                  仅临时生效,永久生效写入配置文件/etc/profile

#echo $PATH

  • PS1变量:命令提示符设置,默认:[\u@\n \W]\$

#echo $PS1

#PS1=’[\u@\h \W]\$ ‘

  • LANG语系设置

#echo $LANG               (对当前系统生效,由配置文件i18n赋予变量LANG

#locale –a | wc-l        (可支持的所有语系

#locale                   (当前系统的语系

/etc/sysconf/i18n         (系统默认语系,重启后生效

注:纯字符界面下显示中文:en_US.UTF-8改为zh_CN.UTF-8,并安装zhcon中文插件;图形界面和远程连接登录,需先工具配置正确并设为中文环境zh_CN.UTF-8

         5、位置参数变量

         $n     n为数字,$0代表命令本身,$1-$9为第一到第九个参数,10以上的参数表示方法为:${10}

         $*     代表命令行中所有参数,$*把所有的参数看作一个整体

         $@   代表命令行中所有参数,$@把每个参数区分对待

         $#     代表命令行中所有参数的个数

         6、预定义变量:

         $?     最后一次执行命令的返回状态,0表示上一个命令正确执行,非0上一个命令执行不正确

         $$      当前进程的PID

         $!     后台运行的最后一个进程的PID

         7、接收键盘输入:

         #read  选项 变量名

              -p              在等待read输入时,输出提示信息

              -t秒数          指定等待时间

              -n字符数        只接受指定的字符数

               -s             隐藏输入的数据,适用于机密信息的输入

注:变量名可以自定义,如不指定,则保存至默认变量REPLY;如果只提供一个变量名,则整个输入行赋予该变量,如有多个变量,则输入行分为若干字,一个接一个的赋予各个变量,而命令行上的最后一个变量取得剩余的所有字。

         例:#vi read.sh

#!/bin/bash

#Author:

read –t 30 –p “please input your name: “name

echo “Name is $name”

read –t 30 –p “please input your age: “ age

echo –e “\n”

echo “Age is $age”

read –t 30 –n 1 –p “please select yourgender[m/f]: “ gender

echo –e “\n”

echo “Sex is $gender”

         8#declare +/-选项 变量名

         -        设定

         +        取消

         -a       array数组

         -i       integer整数

         -x       environment环境变量

         -p       print显示被声明为什么变量

         -r       声明为只读变量,一旦为只读,不能修改变量的值,不能删除不能取消只读属性

> 数值运算方式:

         #aa=11

         #bb=22

         #cc=$(( $aa+$bb))

         #cc=$[  $aa+$bb]

         #declare–i cc=$aa+$bb

         #cc=$(expr $aa + $bb)

         #letcc=$aa+$bb

    >数组变量类型:

        #name[0]=sz

        #name[1]=sd

        #name[2]=sb

        #echo ${name}(仅输出第一个下标变量

        #echo ${name[*]}      (输出数组所有内容

注:调用数组时使用${数组[下标]}的方式。

         >环境变量

         #declare–x test=123       (同#exporttest=123

         >#declare–r test     (设为只读,不能修改,不能取消,不能删除

         >#decalre–p name(查询变量属性

         #declare+x test       (取消环境变量属性

         9、变量的测试与内容置换

五、环境变量配置文件

         1、使配置文件立刻生效:

#source 配置文件

         #.配置文件  

         2、登录时生效的环境变量配置文件:

         /etc/profile/etc/profile.d/*.sh~/.bash_profile~/.bashrc/etc/bashrc

         /etc/profile:调用/etc/profile.d/*.sh~/.bash_profile

         ~/.bash_profile:在PATH变量后加入:HOME/bin这个目录,脚本可放至~/bin下,可直接执行

         ~/.bashrc:定义默认别名

         /etc/basrc:定义PS1变量;定义了umask默认权限,non-login过程生效;定义了PATH变量,non-login过程生效调用/etc/profile.d/*.sh

         ~/.bash_logout:注销时生效的环境变量配置文件;

         ~/.bash_history:历史命令保存文件。

         3/etc/issuetty1-tty6本地终端欢迎界面,支持的转义符可用#man agetty查询

         /etc/issue.net:远程登录欢迎信息,如ssh/telnet。需同时更改配置文件/etc/ssh/sshd_config#Banner none下加入Banner/etc/issue.net,不支持/etc/issue中的转义符

         /etc/motd:用户登录之后显示的欢迎信息,本地远程都可显示,前两个文件/etc/issue/etc/issue.net是在用户登录之前显示的。

         #stty–a   (查询所有快捷键

         #stty关键字 快捷键    (设置快捷键:#stty intr^p(^p是手工输入的),强制中止改为ctrl+p

 


                                        来自兄弟连培训


本文出自 “Linux运维重难点学习笔记” 博客,请务必保留此出处http://jowin.blog.51cto.com/10090021/1651520

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。