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
/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
|
这样比较好理解些
变量表达式
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
i
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
i
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