shell脚本入门 —— 命令篇

1.什么是脚本

安装一定逻辑关系记录命令的文件
在此文件有可执行权限的情况下可以用文件名称发起脚本内记录命令的执行
shell脚本是一种解释形语言,文件内记录的动作需要解释器shell

2.常用命令

2.1.diff

比较两个文件的不同
diff
[num1,num2][a|c|d][num3,num4]
a       ##添加
c       ##改变
d       ##删除
num1,num3   ##第一个文件的内容
num3,num4   ##第二个文件的内容

diff -r /mnt/westos/ /mnt/linux/
diff -u file file1 > file.path  ##生成补丁文件file.path
patch  file file.path       ##给文件file打补丁
patch -b file file.path     ##-b标示备份原文件为file.orig

2.2.grep

grep [options]
grep -c     ##计算找到 '搜寻字符串' 的次数
grep -n     ##在显示符合范本样式的那一列之前,标示出该列的编号。
grep -n3    ##列出匹配到字符的行,并显示上下相邻的3行
grep -A3    ##列出匹配到字符的行,并显示相邻的前3行
grep -B3    ##列出匹配到字符的行,并显示相邻的后3行
grep -i     ##忽略字符大小写差别
grep -v     ##反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!
grep -E     ##将范本样式为延伸的普通表示法来使用,意味着使用能使用扩展正则表达式。
grep ^test  ##匹配的字符串test在行首。
grep test$ ##匹配的字符串test在行尾。
grep "\<test"   ##匹配test开头的单词。
grep "test\>"   ##匹配test结尾的单词。

2.3.cut

cut命令用来显示行中的指定部分,删除文件中指定字段。cut经常用来显示文件的内容。 
说明:该命令有两项功能,其一是用来显示文件的内容,它依次读取由参数file所指 明的文件,将它们的内容输出到标准输出上;其二是连接两个或多个文件,如cut fl f2 > f3将把文件fl和几的内容合并起来,然后通过输出重定向符“>”的作用,将它们放入文件f3中。 当文件较大时,文本在屏幕上迅速闪过(滚屏),用户往往看不清所显示的内容。因此,一般用more等命令分屏显示。为了控制滚屏,可以按Ctrl+S键,停止滚屏;按Ctrl+Q键可以恢复滚屏。按Ctrl+C(中断)键可以终止该命令的执行,并且返回Shell提示符状态。
cut(选项)(参数)
-f ##提取指定字段:
-d ##指定字段分隔符:
-n ##与“-b”选项连用,不分割多字节字符;

cut -c 1-4|1,4      ##打印第一到第四个字符|打印第一个和第四个字符
cut -d : -f 1,7 | -f 1-3    ##以":"分隔,打印第一串和第三串字符

2.4.awk

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
awk '{pattern + action}' {filenames}
##pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。 pattern就是要表示的正则表达式,用斜杠括起来。

cat /etc/passwd |awk  -F ':'  '{print $1}'     ##只是显示/etc/passwd的账户(以:分割的第一列字符串)
awk -F: '/root/' /etc/passwd        ##搜索/etc/passwd有root关键字的所有行
awk -F: '/root/{print $7}' /etc/passwd     ##搜索/etc/passwd有root关键字的所有行,并显示对应的shell
cat /etc/passwd |awk  -F ':'  '{print $1"\t"$7}'      ##只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以tab键分割
cat /etc/passwd |awk  -F ':'  'BEGIN {print "name,shell"}  {print $1","$7} END {print "blue,/bin/nosh"}'     ##只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以逗号分割,而且在所有行添加列名name,shell,在最后一行添加"hallo,/bin/nosh"。

TEST="#################################"
awk -F ":" -v TEST=$TEST 'BEGIN {print TEST ":"} {print $2} END{print TEST}' /etc/passwd

2.5.echo

echo 命令用于字符串的输出

echo -n             ##不自动换行
echo -e             ##-e 开启转义
echo -e "\r \r"     ##刷新覆盖
echo -e "OK! \c"    # -e 开启转义 \c 不换行
echo -e "\e[1;31mThis is red text\e[0m"     ##\e[1;31m 将颜色设置为红色 ,  \e[0m 将颜色重新置回
echo -e "\e[1;42mGreed Background\e[0m"     ##\e[1;42m 将颜色设置为绿色 
##颜色码:重置=0,黑色=40,红色=41,绿色=42,黄色=43,蓝色=44,洋红=45,青色=46,白色=47
echo -e "\033[37;31;5mMySQL Server Stop...\033[39;49;0m"        ##文字闪动
##结束非常规字符序列的"m"要紧跟前面的数字,不能有空格
##输出带有颜色的文本,echo命令必须带有选项"-e"
echo -en '\033[60G' && echo OK      ##光标跳到第60列,然后显示一个OK
   \a 发出警告声;
   \b 删除前一个字符;
   \c 最后不加上换行符号;
   \f 换行但光标仍旧停留在原来的位置;
   \n 换行且光标移至行首;
   \r 光标移至行首,但不换行;
   \t 插入tab;
   \v 与\f相同;
   \\ 插入\字符;
   \nnn 插入nnn(八进制)所代表的ASCII字符;

2.6.sed

sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。
sed [options] 'command' file(s) 
sed [options] -f scriptfile file(s)

sed 's/sbin/westos' passwd      ##将passwd文件中的sbin替换为westos
sed '1,5s/sbin/westos/g' passwd     ##替换第一行到第五行,使用后缀 /g 标记会替换每一行中的所有匹配
sed -n 's/sbin/westos/p' passwd         ##-n选项和p命令一起使用表示只打印那些发生替换的行:
sed -i 's/sbin/westos/p' passwd     ##直接编辑文件选项-i,会匹配file文件中每一行的第一个sbin替换为westos
##当需要从第N处匹配开始替换时,可以使用 /Ng: 
echo ababababab | sed 's/ab/AB/2g' 
abABABABAB
##以上命令中字符 / 在sed中作为定界符使用,也可以使用任意的定界符: sed 's:test:TEXT:g' sed 's|test|TEXT|g' 定界符出现在样式内部时,需要进行转义: sed 's/\/bin/\/usr\/local\/bin/g'

sed '/^$/d' file   ##删除空白行 
sed '2d' file       ##删除文件的第2行
sed '2,$d' file        ##删除文件的第2行到末尾所有行:
sed '$d' file      ##删除文件最后一行
sed '/^test/'d file     ##删除文件中所有开头是test的行

echo this is a test line | sed 's/\w\+/[&]/g'       ##正则表达式 \w\+ 匹配每一个单词,使用 [&] 替换它,& 对应于之前所匹配到的单词
[this] [is] [a] [test] [line] 
sed 's/^192.168.0.1/&localhost/' file       ##所有以192.168.0.1开头的行都会被替换成它自已加localhost
192.168.0.1localhost    
sed -e '1,5d' -e 's/test/check/' file       ##-e选项允许在同一行里执行多条命令:第一条命令删除1至5行,第二条命令用check替换test。命令的执行顺序对结果有影响。如果两个命令都是替换命令,那么第一个替换命令将影响第二个替换命令的结果。
##和 -e 等价的命令是 --expression: 
sed --expression='s/test/check/' --expression='/love/d' file

来自: http://man.linuxde.net/sed

sed '/lp/,/shutdown/s/sbin/westos/g' passwd     ##lp和shutdown之间的行,sbin用westos替换
sed -e 's/sbin/westos' -e 's/nologin/redhat' passwd     ##替换sbin为westos,替换nologin为redhat
sed -5d passwd          ##删除第5行
sed -5p passwd          ##复制第5行
sed -n 5p passwd        ##显示第5行

vim file
s/sbin/westos/g
s/nologin/lee/g

sed -f file passwd      ##直接将 sed 的动作写在一个文件内,sed -f filename 则可以运行 filename 内的 sed 动作,

3.变量

1)作用:

变量,占据着内存中的某一存储区域;
该区域有自己的名称和数据类型;
该区域的数据可以在同一类型范围内不断的变化~
用来不断的,存放同一类型的常量,并且可以重复使用;

2)变量的命名规则:

首字母不能是数字
变量中只能包含 字母 数字和"_"

TEST
TEST_REDHAT
Test_Redhat
tesTRedhat

3)变量设定方式

环境级
在当前环境生效,当前环境关闭,变量失效
export A=1

用户级
只针对配置过的用户生效,其他用户无法使用
vim /root/.bash_profile
export A=1
source /root/.bash_profile

系统级
设置系统变量时,该系统的所有帐号的用户都可以使用

4)命令别名设定

alias xie='vim'
vim ~/.bashrc
alias xie='vim'

vim /etc/bashrc
alias xie='vim'

unalias xie

5)变量定义方式

方法一:
USER=root
方法二:
$0 $1 $2 $3 $n $* $# $?
方法三:
read -p "" IP

6)shell脚本中函数的定义

TEST()
{
    echo hello world
}

TEST

7)变量对比

字符串变量表达式
If  [ $string1 =  $string2 ]                 ##如果string1等于string2
if  [ $string1 !=  $string2 ]   ##如果string1不等于string2       
if  [ -n $string  ]             ##如果string 非空(非0),返回0(true)  
if  [ -z $string  ]             ##如果string 为空
if  [ $sting ]                  ##如果string 非空,返回0 (和-n类似)

两个参数对比
-eq     ##等于
-ne     ##不等于
-lt     ##小于
-gt     ##大于
-le     ##小于等于
-ge     ##大于等于

8)特殊符号转译和注释

\   转译但个字符
''  强引用
""  弱引用 其转译功能不能转译"!" "$" "\" "`"

9)变量的声明

a=1
$ab = 空
${a}b = 1b

6.四则运算

1.运算法则

++    i++       i=i+1       ##自增
--    i--       i=i-1       ##自减
+=    j+=i      j=j+i
-=    j-=i      j=j-1
+     
-
*
/       ##取整
**      ##幂运算
%       ##取余

2.运算命令

$[ 3 + 2 ]
let A=3+2
expr 3+2

7.脚本中的常用语句

1.
for
do
done

2.
while
do
done

3.
if
then
elif
then
else
fi

4.
case


5
.expect
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值