Linux Shell 基本语法


本文全是自己积累的基础知识,如果有不正确的地方请指正




Linux 通过网络传输文件:scp 本机文件路径  另一台Linux账户@ip:端口号:文件存放位置


一,初步了解
1,echo 输出信息 加入参数-e后可以实现字符转义

2,第一个脚本:
vi hello.sh
#!/bin/Bash ----------->此处不是注释,是一个标识,标识以下所写为shell程序,这个不可以省略
#The first program ----------->此处的为注释,包括以后的#标识的都是注释
#The first program
#Author:Renpengying(QQ:954507155)


echo -e "wo ren peng ying  is the most clearver man in the Team\!"
3,关于脚本执行:
1,赋予执行权限直接运行
chmod 755 hello.sh
./hello.sh [.] +shell脚本的绝对路径 
2,通过Bash调用执行脚本 bash hello.shell

4,dos2unix  shell脚本名称,可以实现:将window上编写的shell脚本进行格式转换使其可以在Linux上执行

5,每一个用户所敲过的命令:history 后跟参数[-c]可以进行清除,默认保存1000条,这个限制可以修改vim /etc/profile 修改HISTSIZE

6,不论是命令,还是文件名再输入时可以按Tab键进行补全,如果有多个是无法显示的,连续按两次Tab键,可以把他们全部列出来

7,命令的别名和常用快捷键
给命令起别名:alias  新的命令名称='系统的命令'例子:alias rm = 'rm -i'     删除别名:unalias
alias 定义的别名命令的执行优先级高于bash中命令的命令优先级和环境变量中定义的优先级

8,输出重定向:可以用>,>>执行:命令 > 文件 可以将命令的输出结果保存到文件中【>】是覆盖【>>】是追加,错误输出是在【>或>>】前加2
把正确输出和错误输出同时保存的命令:命令 &>> 文件   覆盖或追加通过控制【>】个数即可
9,wc 统计键盘输入用法:wc 回车 输入内容 ctrl+d  统计单词个数,字符个数以及行数

9-1,输入重定向:命令 < 文件

10,多命令顺序执行
多命令执行符:【;】 格式:命令1;命令2 多个命令顺序执行,不论是否出错(不止可以是两个)
多命令执行符:【&&】 格式:命令1&&命令2 多个命令之间有逻辑关系  只有1执行正确2才会执行
多命令执行符:【||】 格式:命令1||命令2 多个命令之间有逻辑关系 只有1执行出错2才执行
判断一个命令正确执行:命令&&echo yes || echo no 分析:命令正确执行与逻辑执行输出yes,命令错误与逻辑不执行,走到或逻辑,由于前命令(输出yes的命令)出错所以执行输出no
11,管道符:|   用法:用于连接命令,前命令的正确执行结果作为后命令的操作对象

精妙用例:对于文件非常多的文件夹在查看时很麻烦,但是more只能操作文件,所以可以通过管道符,将ls -a 的命令执行结果通过more以查看文件的形式展示
ls -la /etc/ | more      回车即可
但是管道符后命令执行的前提,必须前命令正确执行

12,grep 参数 "搜索内容" 文件名 可选参数:-i忽略大小写 -n输出行号 -v反向查找

13,通配符:【?】匹配任意一个字符 【*】匹配任意个任意字符 【[]】匹配中括号中的任意一个字符 【[^0-9]】匹配一个非数字的字符

14,bash中的其他特殊符号:单引号中的所有字符都没有特殊意义,双引号中特殊字符是有特殊意义的,反引号【`】反引号括起来的内容是系统命令
$() 和反引号的作用一样,用来调用系统命令
# 在shell脚本中,#开头的行代表注释,第一行除外
$ 用于调用变量的值
\ 转义符,让特殊符号失效,当作普通字符
15,bash变量,定义变量由字母数字下划线组成首字母不能为数字,所有的变量默认都是字符串类型
变量用等号连接之间不能有空格
变量叠加:变量名a="$变量名a"asdasd    这里基本上可以理解为还是利用了$的用于调用变量的值,然后拼接保存
用此方法可以实现环境变量path的路径添加(临时的,永久的需要写入配置文件):PATH="$PATH":新的脚本路径
在linux中环境变量用【:】分隔
16,环境变量配置:
申明变量:export 变量名=变量值
查询变量:env
删除变量:unset 变量名
17,位置参数变量:
$n n为数字,$0代表命令本身 $1 $2....$9 代表这条命令后的第n(1-9)个参数,第10个及以上的参数需要用大括号${10}

$* 这个变量代表命令行中所有的参数,把后面整个的所有参数看成一个整体

$@ 这个变量代表命令行中所有的参数,把后面的每一个参数区分对待

$# 这个变量代表命令行中所有的参数,返回参数的个数

18,预定义变量
$? 最后一次执行的命令的返回状态。如果那个命令正确执行,则这个变量的值为0否则为非0具体是几由错误信息决定
$$ 当前进程的进程号(PID)
$! 后台运行的最后一个进程的进程号(PID)

19,接受键盘输入:read 参数 变量名
参数:-p "提示信息" 在等待read输入时,输出提示信息
  -t 秒数 指定等待用户输入的等待时间
  -n  字符数 read命令只接受指定的字符数,就会执行
  -s 隐藏输入的数据,适用于机密信息的输入
20,数值运算与运算符,在linux中声明的变量,默认是字符串类型

1),declare 声明变量类型:declare [+/-][参数] 变量名
其中  -参数   给变量设置类型   + 取消变量类型
-i 将变量申明为整数类型(integer) -x 将变量申明为环境变量 -p 显示指定的变量的被申明的类型

2)$((运算式)) 或 $[运算式] 也可以进行运算
例如:cc=$(($aa + $bb)) 这样就可以将两个数进行相加

21,测试变量是否存在:
x=${y-新值} 如果x=新值  则变量y不存在,x为空则y为空 否则x等于y的值

22,环境变量配置文件

1,source 命令:source 配置文件    作用:让配置文件立即生效
23,Shell登录信息
本地终端登录信息:etc/issue文件
\d 显示当前系统日期 \s 显示操作系统名称
\l 显示登录的终端号,常用 \m 显示硬件结构
\n 显示主机名 \o 显示域名
\r 显示内核版本 \t 显示当前系统时间
-----------------------------------------重点shell编程知识---------------------------------------
24,正则表达式:(正则是包含匹配,通配符是完全匹配)
注意【*】代表前一个字符出现任意次,不是任意字符【.】匹配出换行外的任意字符 【\{n\}】匹配前一个字符出现n次n为数字
例子:【.*】匹配任意字符
25,字符截取命令:
grep 正则规则  文件      获取文件中符合匹配要求规则的行
cut   参数 文件 根据参数提取文件中的列,cut -f 2,3 文件 提取文件的第2和3列(也可以通过参数-d指定分隔符)
cut在遇到空格分隔时无效,必须要制表符或特定符号分隔
26,sort 文件 可以给文件内容进行排序 -r 参数可以反向排序

27,判断式:-d 文件是否存在且是否为目录 -f文件是否为普通文件 -e 文件是否存在
-z 判断变量是否为空 例子: [ -d /etc/passwd ] 注意,中括号里面表达式前后有空格
== 用于判断字符串是否相等

两个整数之间比较:
整数1 -eq 整数2 判断整数1与整数2是否相等,相等为真
整数1 -ne 整数2 判断整数1与整数2是否不等,不等为真
整数1 -gt 整数2 判断整数1是否大于整数2,大于为真
整数1 -lt 整数2 判断整数1是否小于整数2,小于为真
大于等于:-ge
小于等于:-le

28,多重条件判断
判断1 -a 判断2   两个判断都成立才为真
判断1 -a 判断2 两个判断有一个为真就为真

29,条件判断语句:

if语句:
if [ 条件判断式 ]
then
程序
else
程序(条件判断为false)
fi

30,多分支if条件语句

if [ 条件判断 ]
then
程序
elif [ 条件判断2 ]
then
程序
fi
当对用户输入进行判断,所输入不符合程序要求需要程序终止:exit n
exit 跳出程序  n为数字,返回执行结果 可以通过 $? 查询


31,for循环1
for 变量 in 值1 值2 值3
do
程序
done
每次循环将后面值得集合中的数据依次传给变量,然后再程序中操作变量


for循环2
for((初始值;循环控制条件;变量变化))
do
程序
done


32,Linux系统定时执行shell脚本

实现方法:
crontab -e //这样可以以编辑的方式打开个人的crontab配置文件

以下是 crontab 文件的格式:


{minute} {hour} {day-of-month} {month} {day-of-week} {full-path-to-shell-script}
对应数值区间   0-59   0-23 0-31 1-12 0-7


例如:已经写好一个启动apache服务的shell 
在xshell中执行: crontab -e
然后在文件中写入  0 0 * * * shell所在位置(shell首先得具有执行权限)

   “*”代表取值范围内的数字,
         “/”代表”每”,
         “-”代表从某个数字到某个数字,
         “,”分开几个离散的数字









新增:
1字符串切割:${字符串变量%/*} 删除字符串从右起第一个【/】及后面的字符


测试指定IP的指定端口是否可以连通:

nc -v -w 1  IP -z 端口

修改指定行的文件内容:

sed -i '3a XXXX' 文件




Linux自动交互式脚本: expect 详情参考:http://www.cnblogs.com/autopenguin/p/5918717.html


#!/usr/bin/expect 该行在脚本的第一行,告知操作系统用expect作为shell执行脚本

set timeout 设置超时时间,为-1时永不超时,其他值则代表每一条指令最大等待时长的秒数

spawn 以子进程的方式,开启执行一条命令,该命令是在expect环境下才可执行

expect 此命令也是在expect环境下才可执行,用于判断spawn所执行的命令的输出结果是否为指定的字符串(没有输出时会等待,等待时长为设置的timeout时长)


send 用于与spawn开启的子进程命令进行交互,传递子进程继续的下一步操作

interact 通俗讲就是关掉spawn子进程继续脚本往下执行,该命令可以由 expect eof,这两个命令一般必须有,否则影响send使用,网上常用expect eof

exp_continue 附加在摸个expect判断项之后,可以使该项被匹配后继续该expect判断语句内的其他项

传递参数:[lindex $argv n] n为参数组的下标,用法示例:
set canshu [lindex $argv 0] 获取传递的第一个参数


脚本的执行方式:./脚本    bash 脚本执行是错误的




交互式脚本需要先进性expect命令的安装:(有环境可以直接yum的可以直接yum安装)

需要先安装编译环境gcc

wget http://nchc.dl.sourceforge.net/sourceforge/tcl/tcl8.4.11-src.tar.gz

tar xfvz tcl8.4.11-src.tar.gz

cd tcl8.4.11/unix


./configure --prefix=/usr/tcl --enable-shared


make


make install

将该目录下的tclUnixPort.h 复制到 外一级的同级目录generic中

下载exoect源码包
http://sourceforge.net/projects/expect/files/Expect/5.45/expect5.45.tar.gz/download

tar xzvf expect5.45.tar.gz

cd expect5.45

./configure --prefix=/usr/expect --with-tcl=/usr/tcl/lib --with-tclinclude=../tcl8.4.11/generic


make


make install

ln -s /usr/tcl/bin/expect /usr/expect/bin/expect

cp /usr/expect/bin/expect /usr/bin/









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值