shell 变量及输入输出



shell 脚本中变量的定义和引用


1.变量的定义

 

1)shell 中的变量名可以由字母、数字、下划线组成,但数字不能作为变量名的第一个字符;


2)通过赋值符等号"=" 来定义一个变量的值。


如:


myname='galley'  # 字符串类型,不解析任何字符。
courses="abcdedf"   #双引号内部会解析$和反斜杠特殊字符。
sum=100;price=1.2544   
now_date=`date`  # 反引号执行系统命令


shell 的变量类型只有字符串类型,所以当你不用引号引起来的时候,要保证变量的值不包含特殊的符号,如空格符、美元符、&符。mystr='123 5'


2.变量的引用

 

1)变量的引用,使用美元符号$ 加变量名,来引用一个变量的值。


如: 定义变量


programe_name="httpd"


引用变量


echo $programe_name 
echo ${programe_name}


2)变量名外面的花括号是可选的,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:


#/bin/sh  
for skill in php  java linux db2
do
echo "I am good at ${skill}Script"# 帮助shell   解释器识别边界
done


此处如果不加{},运行结果会怎样?


3.变量值的特殊符号引用


1)关于单引号和双引号以及反引号的引用方法演示:

 

[root@localhost sh]# testvar=100
 # 单引号的引用
[root@localhost sh]# echo 'The testvalue is $testvar'
The testvalue is $testvar
 # 双引号的引用
[root@localhost sh]# echo "The testvalue is $testvar"
The testvalue is 100 
 # 反引号的引用
[liutaostdio@WLJY01 ~]$ now_date=`date`
[liutaostdio@WLJY01 ~]$ echo $now_date
Sat Jul 18 23:58:59 CST 2015



实际环境中的操作:


input1.png



shell 环境变量、局部变量以及预定义变量


1.环境变量


1)环境变量的定义:环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数,如PATH、PWD、USER、当前使用的SHELL名称等。


2)常见的环境变量


PATH:系统路径;


HOME:当前用户家目录;


HISTSIZE:保存历史命令记录的条数;


LOGNAME:当前用户登录名;


HOATNAME:主机名称,若应用程序要用到主机名的话,一般是从这个环境变量中的取得的;


SHELL:当前用户用的是哪种shell;


LANG/LANGUGE:和语言相关的环境变量,使用多种语言的用户可以修改此环境变量;


MAIL:当前用户的邮件存放目录。


3)查看环境变量


env:显示所有环境变量。


input2.png


echo $PATH : 显示某一个环境变量的值


input3.png


2.局部变量


1)局部变量量包括:


在Shell脚本中由用户自定义的变量;


Shell脚本中定义的变量作用域是从被定义的地方开始,到shell结束为止,起作用域为本脚本,离开本脚本,变量无效。


2)动手操作:


编写一个脚本,定义一个变量并输出其结果;


退出脚本再输出这个变量看有没有结果。

 

在用户登陆的shell中定义的变量,重新登陆后该变量消失。


3)动手操作:

 

登录到shell中,给一个变量赋值,显示该变量的结果;


退出当前shell ,重新登录,再输出这个变量,看看有无结果。


3.预定义变量


预定义变量和环境变量相类似,也是在Shell一开始时就定义了的变量。所不同的是,用户只能根据Shell的定义来使用这些变量,而不能重定义它。所有预定义变量都是由$符和另一个符号组成的,常用的Shell预定义变量有:


$# 位置参数的数量。(/bin/sh test.sh 1 3 5)


$* 所有位置参数的内容


$? 命令执行后返回的状态。 # 0表示成功,非0表示失败


$$ 当前进程的进程号


$! 后台运行的最后一个进程号。# 很少用,了解即可


$0 当前执行的进程名


如:



[liu@WLJY01 myscript]$ cat predefine_var.sh 
#!/bin/sh
echo "这个程序的名字:$0";
echo "参数的数量:$#"
echo "所有的参数:$*"
echo "当前进程号:$$"
echo "命令执行的返回状态:$?"
echo "后台运行的最后一个进程号:$!"
[liu@WLJY01 myscript]$ sh predefine_var.sh 1 2 3 4



这个程序的名字:predefine_var.sh


参数的数量:4


所有的参数:1 2 3 4


当前进程号:10171


命令执行的返回状态:0


后台运行的最后一个进程号。



脚本的输入和输出


1.echo 输出


echo 命令发送数据到标准的输出设备,数据采用的是字符串的方式,echo 命令可以输出一个变量。


[liu@WLJY01 ~]$  myprograme="myprograme is : mysql monitor script"
[liu@WLJY01 ~]$ echo $myprograme
myprograme is : mysql monitor script



2. echo  两个重要的参数


1) -e:识别输出内容里的转义序列



[liu@WLJY01 myscript]$ echo -e "hello\tworld"
hello   world



示例:


input4.png


2) -n:忽略结尾的换行



[liu@WLJY01 myscript]$ echo -e -n "hello\tworld"
hello   world[liu@WLJY01 myscript]$



示例:


input5.png


3.printf 输出


和echo 的功能类似,printf 也可以输出变量,printf 还可以按照格式输出变量。


需要注意的是:


1)printf的默认输出没有换行,换行需要自己加“\n”


[liu@WLJY01 myscript]$ mystr="hello,world"
[liu@WLJY01 myscript]$ printf $mystr
hello,world[liu@WLJY01 myscript]$



换行输出:



[liu@WLJY01 myscript]$ mystr="hello,world"
[liu@WLJY01 myscript]$ printf "%s\n" $mystr
hello,world



示例:


input6.png


2)printf支持格式化输出



[liu@WLJY01 myscript]$ cat test_printf.sh 
#!/bin/sh
name=zhangsan
age=43
address="beijing"
printf "name:%s,age:%d,address:%s\n" $name $age $address



编辑器内容:


input7.png


[liu@WLJY01 myscript]$ sh test_printf.sh 
name:zhangsan,age:43,address:beijing



输出示例:


input8.png


4.read输入


read 命令读取标准输入设备的下一行,标准输入中的新一行到换行符前的所有字符会被读取,并赋值给对应的变量。


可以结合echo 一起实现读取并输出的功能。


脚本内容:



#!/bin/sh
# 接受输入并输出IP地址
echo "please input your ipaddress"
read  ipaddr
echo "my ip address is $ipaddr"



编辑器内容:


input9.png


运行:



[liustdio@WLJY01 myscript]$ sh read-echo.sh 
please input your ipaddress
192.168.1.1
my ip address is 192.168.1.1



输出结果:


input90.png


5.<<按行输入


“<<” 可以被认为是一种重定向符,重定向脚本文件中的一行作为到一个命令的输入。操作符<< 被放在输入重定向的命令之后,紧跟在<< 的各行作为命令的输入,输入的结尾通过文件结束符(ctrl+D)表示,也可以自己定义定界符,定界符后的单词作为输入各行结束的定界符。


注意结束时的定界符一定要顶格写。


例如:用“<<” 符作为每行的命令输入来操作数据库。


[liu@WLJY01 myscript]$ cat operate_mysqldb.sh 
#!/bin/sh
# 演练用"<<" 按行输入来操作数据库
/usr/local/mysql5.6.17/bin/mysql  <<!   #自定义定界符
status 
select count(*) from test.student
!


自动连接ftp服务器来下载数据。



#!/bin/sh
# 演练用"<<" 按行输入来上传下载文件
ftpserver=192.168.1.100
rq=`date +%Y%m%d`  
cd /home/liu/mydocs
ftp -i -n <<!  
open $ftpserver 
user oracle post   
cd ems   
bin  
get $rq.dat   
bye  
!



课后作业


1. 掌握变量的定义与引用的方法,加{}符号引用变量与不加{}引用变量的区别;


2.理解单引号 ,双引号,反引号的功能;


3. 掌握常用的输入与输出的用法(read 、<<、echo 、 printf)。



【本文由麦子学院独家原创,转载请注明出处并保留原文链接】

logo
© 2012-2016 www.maiziedu.com
蜀ICP备13014270号-4 Version 5.0.0 release20160127

麦子大聚惠,豪华礼包你领了吗?

客服热线 400-862-8862

回到顶部