您的位置:首页 > 运维架构 > Shell

shell编程基础 脚本

2015-05-16 11:47 399 查看
shell基础学习

1 Shell 常用命令

(1,2)echo "hello world"

(3)export 变量

变量带入子进程

export

显示所有环境变量和内容

(4)readonly

命令格式 1:readonly

variable

功能:将一个用户自定义的 shell 变量标识为不可变。

命令格式 2:readonly

功能:显示出所有只读的 shell 变量。

(5)read

命令格式:Read variable

功能:从标准输入设备读入一行,分解成若干行,赋值给 shell 程序定义的变量。

实验:

[root@localhost test]# vi sh_04.sh

#!/bin/bash

echo -e "Please enter: \c"

read x

echo "you enter: $x"

[root@localhost test]# ./sh_04.sh

Please enter: hello

you enter: hello

(6) env

命令格式:Env

功能:显示环境变量及其内容。

(7) 7、set

命令格式:Set

功能:显示所有变量及其内容。

(8) unset

命令格式:

功能:unset 命令的作用是从环境中删除变量或函数。这个命令不能删除 shell 本

身定义的只读变量(如 IFS)。这个命令并不常用。

(9) trap

命令格式:Trap command signal

功能:在脚本程序发生相应中断时执行相应命令内容

(10) grep

命令格式 grep 参数 string 目标文件

功能:在指定文件一堆文件中查找一个特定的字串,并将字串所在行输出到终端或

平台。

cat 文件名 查看文件内容

2 重定向与管道

Shell 命令在执行时,会自动打开三个标准文件,即标准输入文件(stdin)

,一般对应终端的键盘;标准输出文件(stdout)和标准出错输出文件(stderr)

,这两个文件对应终端的屏幕。但在实际应用中,这三个文件常常需要按照新的格式进行定向,从其

它文件中导入内容或将内容导出到其它文件中,此过程就是重定向;使内容按一定格式

输出,这就是管道。

(1)输出重定向

通过重定向符“>”或“>>”将命令的标准输出重新定向到指定文件中。

一般形式:命令 > 文件名

命令 >> 文件名

“>”与“>>”都能将内容重新写入到文件中,但如果文件中有内容,执行“>”完

后新的内容将会覆盖掉原来的内容,而“>>”则是将新的输出内容附加到原来内容的结

尾。

实验 1:

[root@localhost shell]# ls

[root@localhost shell]# ps > test

[root@localhost shell]# ls

test

[root@localhost shell]# cat test

PID TTY

TIME CMD

6459 pts/2 00:00:00 bash

6479 pts/2 00:00:00 bash

6774 pts/2 00:00:00 ps

实验解析:

将 ps 命令的内容重定向到 test 文件中,

执行完命令后,

终端上确实没有输出内容,

而当前目录下却多了 test 文件,再利用 cat 可以看到内容的确写到里面去了

(2)错误重定向

通过重定向符“2>”或“2>>”将命令的标准错误输出重新定向到指定文件中。

一般形式:命令 2> 文件名

命令 2>> 文件名

实验解析:

由于当前目录中不存在文件 jingzhao, cat 命令输出其中内容时会在终端上打印

用出错信息。改用输出重定向符号时错误信息还是没能重定向到 test 中,

最后利用错误重定向符号将错误提示输出到 test 文件中。

从上面也可以知道,采用“>”或“>>”是不能将错误的信息重定向的。

(3)输入重定向

通过重定向符“<”将命令的标准输入重新定位到指定文件中。

一般形式: 命令 <文件名

实验:

[root@localhost shell]# ls

sh.sh

[root@localhost shell]# cat sh.sh

echo "your working directory is `pwd` "

echo "the time is `date`"

[root@localhost shell]# bash < sh.sh

your working directory is /shell

the time is 四 7 月 29 15:16:23 CST 2010

实验解析:

Shell 命令解析程序将从脚本程序 sh.sh 中读取命令行,并加以执行。

(4)管道

Linux 下可以采用管道操作符“|”来连接多个命令或进程,如下图示:

在连接的管道线两边,每个命令执行时都是一个独立的进程。前一个命令的输出正

是下一个命令的输入。这些进程可以同时运行,并且随着数据流在它们之间的传递可以

自动地进行协调,从而能够完成较为复杂的任务。

ls /etc/

ls /etc | more

命令 ls /etc 显示/etc 目录的内容,命令 more 是分页显示内容。

3 shell 编程

3.1 shell变量

自定义变量

与各种高级程序设计语言相似,shell 环境下也可以一组文字或符号,来替换一些

设置或者是一串保留的数据,这组文字或符号便是 shell 变量。

在 linux 环境中,存在大量不同的 shell 变量,既有环境本身自带的系统变量,也

有用户自定义的普通变量。根据前面常用命令,我们可以用 set 命令查看 linux 系统当

前所有变量及其内容。

创建全局变量:在此之前所创建的变量均为当前 shell 下的局部变量,不能被其它

shell 利用。因此可以使用“export 变量名”将局部变量转化为全局变量,也可以直接

利用“export变量名=变量值”来创建一个全局变量。

位置参数变量

在 linux/UNIX 系统中,shell 脚本执行时是可以带实参的。这些实参在脚本执行期

间将会被赋予系统中自动定义好的一类变量中,这类变量就是位置参数变量。

$ 0 : 获取(包含)脚本名称

$1 - $9 : 获取(包含)第 1 至第 9 个参数

${ }: 获取第 9 个以上参数

$# :表示传给脚本或者函数的位置参数的个数(不包括”$0”)

$ *:所有位置参数的列表,形式是一个单个字符串,串中第 1 个参数由第 1 个字

符串分隔。

$@:所有位置参数被分别表示为双引号中的 N(参数个数 --- 不含$0)个字符串。

例如:[root@localhost ~]# echo one two three

分析: 4 个位置参数 --- 1 个命令名( echo ) + 3 个参量( one、



two 和 three )

$0 = echo $1 = one $2 = two $3 = three

环境变量

保存退出后,重新打开一个新的终端,键入“echo $PATH”,屏幕上显示的还是修

改前的“$PATH”,这是怎么回事呢?原来/etc/profile 与.bash_profile 只在会话时被

读取一次,所以必须重启机器让会话进行一次。

[root@localhost ~]# reboot

随后在重启后的机器中再次键入“echo $PATH”

,这次可以看到修改后的变量了。

如果不想每次修改完 PATH 后都要重启,而且打开新的终端也能应用修改后的变量,

就只能在.bashrc 与/etc/bashrc 环境文件中修改了。

3.2 shell 控制结构

A if例子

#!/bin/bash

echo -e "Are you sure?(y/n):\c"

read yn

if [ $yn == "y" ] ;then

echo "OK,continue"

exit 0

fi

if [ $yn == "n" ] ;then

echo "OK,int"

exit 0

else

echo -e "Please enter y or n"

fi

B case 例子

case 语句

case 语句允许进行多重条件选择

语法结构:

case $变量名称 in

第一个变量内容)

程序段(满足第一个变量内容)

;;

第二个变量内容)

程序段(满足第二个变量内容)

;;



*)

程序段(均不满足前面的条件下)

;;

Esac

#!/bin/bash

echo "a) choice a"

echo "b) choice b"

echo "c) choice c"

echo -e "Please enter your choice:\c"

read menu_choice

case "$menu_choice" in

a) echo "you choice a" ;;

b) echo "you choice b" ;;

c) echo "you choice c" ;;

*) echo "sorry,choice not exist" ;;

esac

C 循环语句

while do done 语句

语法结构:

While [ 条件判断表达式 ]

do

程序段

done

#!/bin/bash

echo "a) choice a"

echo "b) choice b"

echo "c) choice c"

echo -e "Please enter your choice:\c"

read menu_choice

while [ "$menu_choice" != "a" ] && [ "$menu_choice" != "b" ] &&[ "$menu_choice" != "c" ]

do

echo -e "Please enter your choice(a/b/c) to stop thisprogram:\c"

read menu_choice

done

until do done 语句。

语法结构:

Until [ 条件判断表达式 ]

do

程序段

done

语法分析:

与前面的 while do done 刚好相反,它说的是“当条件判断表达式成立时,就终止

循环,否则就持续执行循环的程序段”

for do done 语句

语法结构:

for [ 条件判断表达式 ]

do

程序段

done

语法分析:

for 语句是最常用的建立循环结构的语句,其条件判断表达式更是形式多样。同

while 一样,是当满足条件判断时,就进行循环,直到条件不成立才停止

#!/bin/bash

s=0

for ((i=1;i<=100;i=i+1))

do

s=$(($s+$i))

done

echo "the result of '1+2+3+...+100' is ==> $s"

判断语句

利用test来判断

Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。

测试文件是否存在

#!/bin/bash

cd /home/litingting/桌面

if test -e ./tt

then

echo 'The file already exists!'

else

echo 'The file does not exists!'

fi

测试两个数是否相等
#!/bin/bash

num1=100

num2=100

if test $[num1] -eq $[num2]

then

echo 'The two numbers are equal!'

else

echo 'The two numbers are not equal!'

fi

利用判断符号 [ ] 来判断表达式

判断条件 1 && 判断条件 2

判断条件 3 || 判断条件 4

语法分析:

判断条件 1 为真时才会执行判断条件 2,否则忽略判断条件 2

判断条件 3 为假时才会执行判断条件 4,否则忽略判断条件 4

#!/bin/bash

echo -e "Are you sure?(y/n):\c"

read yn

[ $yn == "y" ] && echo "OK,continue" && exit 0

[ $yn == "n" ] && echo "Oh,interrupt" && exit 0

echo -e "Please enter y or n"

函数调用

#!/bin/bash

#!/bin/bash

first()

{

echo "***********************************"

}

second()

{

echo "======================="

}

first

second

second

first

例子分析

测试文件是否存在
#!/bin/bash

cd /home/litingting/桌面

if test -e ./tt

then

echo 'The file already exists!'

else

echo 'The file does not exists!'

fi
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: