Linux运维第二阶段(八)shell基础
一、shell的两种主要语法:Bourne家族(sh/ksh/bash/psh/zsh);C家族(csh/tcsh)。
注:bash和zsh在不同程度上支持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).
2、shell脚本的运行方式:
赋予权限直接运行(通过绝对路径或相对路径);
通过bash调用执行(#bash hello.sh)
三、bash的基本功能:
1、#history 选项
-c (清空历史命令
-w历史命令保存文件 (缓存中的历史命令写入文件,默认保存位置:~/.bash_history
#vi /etc/profile (可修改文件历史命令保存条数
注:用history命令查看到的是缓存中的,可用#history �Cw 直接写入文件
历史命令的调用:上下键;!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 �CA 3 “root”/etc/passwd
#grep �Cn “/bin/bash” /etc/passwd
#grep �Cv “/bin/bash” /etc/passwd
#netstat �Can | grep “ESTABLISHED” | wc �Cl
#rpm �Cqa | grep httpd
8、通配符:
* 匹配0个或任意多个字符,可匹配任何内容
? 匹配1个任意字符
[] 匹配括号中任意一个字符,例:[abc]中的一个
[-] 匹配括号中范围内的一个字符,例:[a-z]中的一个字符
[^] 匹配不是括号中的一个字符,例:[^0-9]代表不是数字的字符
9、bash中的其它特殊符号
‘’ 单引号内的所有特殊符号都没有特殊含义,包括$、``反引号
“” 双引号中的特殊符号都没有特殊含义,除$、``反引号、\转义符外
`` 反引号里的内容是系统命令,在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 �Cu|-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 �Ca | 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 �Ct 30 �Cp “please input your name: “name
echo “Name is $name”
read �Ct 30 �Cp “please input your age: “ age
echo �Ce “\n”
echo “Age is $age”
read �Ct 30 �Cn 1 �Cp “please select yourgender[m/f]: “ gender
echo �Ce “\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�Ci cc=$aa+$bb
#cc=$(expr $aa + $bb)
#letcc=$aa+$bb
>数组变量类型:
#name[0]=sz
#name[1]=sd
#name[2]=sb
#echo ${name}(仅输出第一个下标变量
#echo ${name[*]} (输出数组所有内容
注:调用数组时使用${数组[下标]}的方式。
>环境变量
#declare�Cx test=123 (同#exporttest=123
>#declare�Cr test (设为只读,不能修改,不能取消,不能删除
>#decalre�Cp 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/issue:tty1-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�Ca (查询所有快捷键
#stty关键字 快捷键 (设置快捷键:#stty intr^p(^p是手工输入的),强制中止改为ctrl+p