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
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
相关文章推荐
- 【Linux 系统编程】shell 脚本基础学习之函数(五)
- shell脚本编程基础
- shell脚本编程基础
- Shell脚本编程基础1
- 【Shell 编程基础第一部分】第一个Shell脚本HelloShell及一些简单的Shell基础书写与概念
- Shell 脚本编程入门基础
- 关于shell脚本编程基础第三篇
- 【Shell 编程基础第二部分】Shell里的流程控制\函数及\脚本调试
- 【Shell 编程基础第二部分】Shell里的流程控制、Shell里的函数及脚本调试方法
- shell脚本编程基础(1)及RAID阵列
- Shell脚本编程基础
- Shell脚本的编程基础
- 关于shell脚本基础编程第四篇
- shell脚本编程基础
- Linux学习-shell脚本编程基础(节选)
- shell脚本编程之基础篇(二)
- shell脚本编程基础(二)----使用结构化命令
- shell脚本编程基础总结
- shell脚本编程基础
- 【Shell 编程基础第一部分】第一个Shell脚本HelloShell及一些简单的Shell基础书写与概念;