shell 巩固基础

简介:

shell脚本能提高用户操作和管理员进行系统管理的效率

自我巩固


1.编辑器编写脚本程序
2.shell做解释程序非交互地执行脚本两种执行方式

用sh命令执行脚本文件

3.给脚本文件添加执行权限用./命令执行


1
2
3
4
5
6
7
一个shell脚本
vi  clearup.sh
#/bin/bash
# this is clear
cd  /var/log
cat  /dev/null > /var/log/messages   /dev/null  Linux中的无限大的垃圾回收站
echo  "Logs cleaned up."

千万不要忘记 给shell脚本权限 chmod 755 clearup.sh

1
2
3
4
5
6
7
8
9
10
一般以.sh为文件后缀。没有也能执行。
常见的两种执行方式
./文件名   在当前目录下写明路径执行要求文件必须有执行权限如
chmod  755  run.sh
./run.sh
sh 文件名
         sh run.sh
文件开头指定一个或多个解释脚本程序的shell如   #!/bin/bash
如果指定注意/bin不要漏了“/”否则用./方式执行会找不到路径。
不指定的话一般默认以/bin/sh执行shell脚本


shell中特殊字符

1、注释符#

除了#!/bin/bash里的#特殊

2、美元符 $

变量符。与反斜杠转义符相反使其后的普通字符作为变量名如$a表示变量a的值。变量字符长度超过1个时用{}括起来

3、单引号

被引起的字符全部做普通字符即全部原样

   echo ‘my $SHELL’

4、双引号

引号内的内容除$、转义符\、倒引号`这三个保留特殊功能其他字符均做普通字符。

5、倒引号(数字1键旁边的那个键

引号内的字符串当做shell命令行解释执行得到的结果取代整个倒引号括起来的部分。

6. 反斜线

    反斜线是转义字符它能把特殊字符变成普通字符。在某个字符前面利用反斜杠\能够阻止shell把后面的字符解释为特殊字符。


shell变量

shell 变量 可以保存如路径名、文件名或者一个数字

本地变量  局部变量只在创建它们的Shell中使用可以在shell程序内任意使用和修改它们。


环境变量  可以在创建它们的Shell及其派生出来的任意子程序中使用。有些变量是用户创建的其他的则是专用的比如PATH、HOME)。是系统环境的一部分不必去定义它们可以在shell程序中使用它们 。还能在shell中加以修改。

内部变量  由系统提供的。与环境变量不同但用户不能修改它们。

清楚变量unset 变量

1
2
3
4
5
6
7
8
[root@ceshi ~] # name=chenhao
[root@ceshi ~] # echo $name
chenhao
[root@ceshi ~] # set | grep name
name=chenhao
[root@ceshi ~] # unset name
[root@ceshi ~] # set | grep name
=name


设置变量时不想再改变其值可以将之设为只读变量

    变量名=值

    readonly  变量名

1
2
3
4
5
6
[root@ceshi ~] # name=haozi
[root@ceshi ~] # echo $name
haozi
[root@ceshi ~] # readonly name
[root@ceshi ~] # name=chenhao
- bash : name:  readonly  variable


环境变量用于所有用户进程通常称为子进程。登陆进程称为父进程通过pstree可以查看

环境变量可以用于所有子程序着包括编辑器、脚本和应用

   vi a.sh

               #!/bin/bash

               # 检测环境变量

               echo "家目录是 $HOME"

  环境变量可以在命令行中设置但用户注销时这些值将丢失

  环境变量均为大写

  必须用export命令导出


HOME  代表使用者的家目录。cd ~ 去到使用者的家目录 或者利用 cd 就可以直接回到使用者家目录了。

SHELL  目前这个环境使用的 SHELL 是哪个程序 如果是 bash 的话预设是 /bin/bash

PWD用户当前工作目录的路径。它指出用户目前在Linux文件系统中处在什么位置。它是由Linux自动设置的

HISTSIZE  这个与“历史命令”有关曾经下达过的指令可以被系统记录下来而记录的“数目”则是由这个值来设定的。

ENV  这个使用者所使用的个性化环境设置文件的读取文件。

MAIL  当我们使用 mail 这个指令在收信时系统会去读取的邮件信箱文件 mailbox)。

PATH  就是执行文件搜寻的路径目录与目录中间以冒号(:)分隔 由于文件的搜寻是依序由 PATH 的变量内的目录来查询所以目录的顺序也是重要的喔。

LANG  语系文件很多数据都会用到他当出现编码错误的时候往往需要设置它中文编码是zh_CN.UTF8


105314819.jpg


/etc/profile 存放一些全局共有变量不管哪个用户登录时都会读取该文件。通常设置一些Shell变量PATH,USER,HOSTNAME和HISTSIZE等

~/.bash_profile:每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件.

~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取.

/etc/bashrc:为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取.


1登录Linux先启动系统配置文件/etc/profile并从/etc/profile.d目录的配置文件中搜集shell的设置为系统的每个用户设置环境信息。

2用户配置文件~/.bash_profile每个用户专用于自己使用的shell信息,仅用户登录时执行一次!

默认情况下,此文件通过脚本执行同目录下用户的.bashrc文件。

3~/.bashrc文件包含专用于用户bash shell的bash信息,登录及每次打开新的shell时都会执行。里面又会调用/etc/bashrc


内部变量

内部变量是Linux所提供的一种特殊类型的变量这类变量在程序中用来作出判断。在shell程序内这类变量的值是不能修改的。

部分内部变量是

$# ——传送给shell程序的位置参数的数量

$?——最后命令的完成码或者在shell程序内部执行的shell程序返回值

$0——shell程序的名称

$*——调用shell程序时所传送的全部参数的单字符串 “参数1”“参数2”…形式保存的参数

$@“参数1”“参数2”…形式保存的参数

$n第n个参数

$$本程序的PID

$!上一个命令的PID


下面做个试验

1
2
3
4
5
6
7
8
9
10
11
[root@ceshi ~] # vi hello.s
#!/bin/bash
echo  "当前的程序名字是 $0"
echo  "共输入$#个参数。全部参数是$@,第一个参数是$1"
echo  "当前进程的pid是$$"
echo  "执行完毕返回$?"
[root@ceshi ~] # sh hello.s hello world ok
当前的程序名字是 hello.s
共输入3个参数。全部参数是hello world ok,第一个参数是hello
当前进程的pid是3338
执行完毕返回0

这样比较好理解些


变量表达式

105845118.jpg


1
2
3
4
5
6
7
8
9
10
11
12
[root@ceshi ~] # sh eg1.sh 1
  1 number is postive
[root@ceshi ~] # sh eg1.sh 0
  0 number no postive
[root@ceshi ~] # cat eg1.sh
#!/bin/bash
#判断输入的参数是否是正数
if  test  $1 -gt 0
then
echo  " $1 number is postive"
fi
echo  " $1 number no postive"


文件测试

-f存在且是普通文件

-d存在且是目录

-s存在且字节数大于0

-r存在且可读

-w存在且可写

-x存在且可执行


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
#检测从命令行输入的文件是否存在
if  [ $ # -ne 1 ]
then
echo  "usage -$0 file-name"
exit  1
fi
if  [ -f $1 ]
then
echo  "$1 file exist"
else
echo  "sorry,$1 file does not exist"
fi
[root@ceshi ~] # sh wenjian.sh abc
sorry,abc  file  does not exist
[root@ceshi ~] # sh wenjian.sh wenjian.sh
wenjian.sh  file  exist


字符串测试

test s  字符串s非空

test s1=s2字符串s1等于s2

test s1!=s2字符串s1不等于s2

test  -z  s字符串长=0,即为空串

test  -n字符串长>0

其他参数

-a逻辑与

-o逻辑或

逻辑非


shell运算符和C语言基本类似也有分支、循环流程控制。

简单举例

后面例子涉及的命令

seq命令产生1-9的数字序列

 比如  seq 1 4

expr命令对表达式求值

[]直接求值命令对被括起来的表达式求值


表达式求值

$ expr 1 + 3

$ expr 2 – 1

$ expr 1 \* 3 使用*要加转义符

$ echo `expr 1 + 3`

注意表达式中数字和运算符指教要有空格出现在语句中要加反引号


屏蔽命令 常用

cp /etc/my.conf  >/dev/null  2>&1

/dev/null空设备

此句命令的结果是

cp命令没有目标文件,应该输出错误。

2>&1表示错误重定向指向标准输出。

>/dev/null又使标准输出重定向到空就是不要输出信息

即一个错误的命令执行什么功能都不实现且没有任何信息或错误提示输出。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@ceshi ~] # vi 1.sh
#!/bin/bash
for  in  ` seq  1  9`
do
echo  ` expr  $i \* 10 `
done
或写   echo  $( expr  $i \* 10)
[root@ceshi ~] # sh 1.sh
10
20
30
40
50
60
70
80
90


read 变量1 [变量2 …]

可以从键盘上读取多个变量的值用户输入数据时以空格或者Tab键作为分隔。

如果输入的数据个数不够则从左到右对应赋值没有输入的变量为空

如果输入的数据个数超了则从左到右对应赋值最后一个变量被赋予剩余的所有数据。

1
2
3
4
5
6
7
8
9
10
11
12
[root@ceshi ~] # sh 1.sh
2
10
20
[root@ceshi ~] # vi 1.sh
#!/bin/bash
         read  a b
         for  in  ` seq  $a $b`
         do
                 echo  ` expr  $i \* 10`
         done
#       输出a到b序列数各数的10倍数


while 例子

1
2
3
4
5
6
7
8
9
while 例子——求1到100的和
i=1
sum =0
while  [ $i – le  100 ]
do
     sum =$[$ sum +$i]
   i=$[$i+1]
done
echo  $ sum


1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
   if  test  $ # -ne 1
     then  
        echo  "Usage: chuser username"
     else
        user= "$1"
        until  who  | grep  "$user" > /dev/null  
     do     
        sleep  300
     done
        echo  "$user has logged on!"
     fi
~
说明    1如果没有从命令行输入用户名则测试$ # -ne 1为“真”显示用法提示信息。 2程序中until语句的expression循环条件是who|grep “$user”命令执行的返回码如果没有找到指定的用户名返回码为非0为“假”则用sleep命令暂停执行程序5分钟找到后返回码为0为“真”则终止循环并显示该用户已经登录的信息。    3采用重定向到/dev/null空文件的目的是不显示查找到的用户其他信息。



本文转自 cs312779641 51CTO博客,原文链接:http://blog.51cto.com/chenhao6/1346640


相关文章
|
Shell Linux C语言
Shell脚本语言基础
Shell脚本语言基础
|
Shell 测试技术
把书读薄-Shell入门基础
把书读薄-Shell入门基础
74 0
|
Shell Linux
Linux基础服务二进制一键安装shell脚本
Linux基础服务二进制一键安装shell脚本
122 0
|
Java Shell Linux
shell 基础
shell 基础
96 0
|
监控 算法 Java
Shell 编程基础与脚本规范
1 编程基础 1.1 程序组成 程序:算法+数据结构 数据:是程序的核心 算法:处理数据的方式 数据结构:数据在计算机中的类型和组织方式
248 0
|
运维 Java Shell
shell基础、脚本设计与运行(少年没有乌托邦,心向远方自明朗)
shell基础、脚本设计与运行(少年没有乌托邦,心向远方自明朗)
126 0
shell基础、脚本设计与运行(少年没有乌托邦,心向远方自明朗)
|
运维 Java Shell
Shell 脚本编程基础|学习笔记
快速学习 Shell 脚本编程基础.
114 0
|
运维 Java Shell
Shell脚本编程基础|学习笔记
快速学习Shell脚本编程基础|学习笔记
108 0
|
Shell
【shell】编写脚本基础、理论知识、参数定义、符号运算(下)
文章目录 前言 一、定义 二、规范 2.1 首行规范 2.2 执行方式 2.3 脚本错误 三、参数 3.1 变量分类 3.1.1 内置变量 3.1.2 预定义变量
85 0
【shell】编写脚本基础、理论知识、参数定义、符号运算(下)
|
Shell Perl
【shell】编写脚本基础、理论知识、参数定义、符号运算(上)
文章目录 前言 一、定义 二、规范 2.1 首行规范 2.2 执行方式 2.3 脚本错误 三、参数 3.1 变量分类 3.1.1 内置变量 3.1.2 预定义变量
88 0