read variable --读入标准输入的一行数据给variable 如果后个多个变量
--变量1存1串 变量2存2串 以存此类推 如果变量少,则最后一个变量存多个串值
--字符间以空白分隔
[yp@localhost ~]$ read test
1 2 3
[yp@localhost ~]$ echo $test
1 2 3
[yp@localhost ~]$ read test test1 test2
1 2 3
[yp@localhost ~]$ echo $test
1
[yp@localhost ~]$ echo $test2
3
[yp@localhost ~]$ echo "$test","$test2","$test1" ;
111,333,222
[yp@localhost ~]$ echo "$test,$test2,$test1" ;
111,333,222
[yp@localhost ~]$ read test test1
123 34 56 321 444 55
[yp@localhost ~]$ echo "$test1 ,test"
34 56 321 444 55 ,123
--用read 试着模仿cp 的 -i功能 如果目标文件存在则提示是否覆盖它
[xep@localhost ~]$ cat -n read_cpfile_script
1 #! /bin/bash
2 # use read command to finished copy file
3
4 if [ $# -ne 2 ]
5 then
6 echo "please input sou_file_name and dest_file_name"
7 exit 1
8 fi
9
10 if [ -e $2 ]
11 then
12 echo -e "the dest_file $2 exists do you cover it? (y/n) \c"
13 read sure
14 fi
15
16 if [ "$sure" = 'y' ]
17 then
18 cp $1 $2
19 fi
20 exit 0
--上面脚本中用到转义符 可以把转义符\c去掉 试试效果
--记录转义符的含义 \b 退格 \c 行尾不带结束符 \f换页
-- \n 换行 -r 回车 \t 制表位
[xep@localhost ~]$ echo -e "\042" --\042是双引号
"
[xep@localhost ~]$ echo $'\n'
[xep@localhost ~]$ echo $'\a'
echo $$ --输出登录shell的进程ID 在多人调用shell产生临时文件名时可以用$$指定
--避免多人引用同一临时文件引起混乱
--当使用export来导出一个变量时,当前shell就会将此变量放到"导出变量列表"中,一旦在某个时刻需要建立子shell时,
--就会将这个导出变量列表拷贝一份给子shell,这样子shell也就有所应当的看到了这些被导出的变量了.
[xep@localhost ~]$ cat -n export_script
1 #! /bin/bash
2 # test export
3
4 x=$x
5 y=$y
6 if [ $x -gt 0 ]
7 then
8 x=200
9 fi
10 echo $x,$y
11 ./export1_script
[xep@localhost ~]$ cat -n export1_script
1 #! /bin/bash
2
3 x=$x
4 y=$y
5
6 echo $x:$y
[xep@localhost ~]$ x=100
[xep@localhost ~]$ export x
[xep@localhost ~]$ ./export_script
200,
200:
[xep@localhost ~]$ echo $x
100
--export特点
--1.没有导出的变量是局部变量,子shell看不到
--2.导出的变量,子shell可以修改它,但是父shell看不到子shell做的修改。说白了,子shell修改的是导出变量的副本。
--3.导出变量不只对子shell可见,对子shell的子shell也是可见的
--4.export -p 显示导出export 变量列表
--给子shell传值的另一做法
[xep@localhost ~]$ cat -n export2_script
1 #! /bin/bash
2
3 echo $dbhome:$dbid
[xep@localhost ~]$ dbhome=/homexep/xep/work ./export2_script
/homexep/xep/work:
[xep@localhost ~]$ echo dbhome
dbhome
[xep@localhost ~]$ echo $dbhome
[xep@localhost ~]$ ./export2_script
:
--这种做法是一次性的 等第二次再调用时候 dbhome还是空 当前shell也不认识它
--大小括号
[xep@localhost work]$ { cd ../..; ls ; }
--命令放在大括号里 注意空格 命令和命令中间用分号(;)隔开,最后一条命令也要有分号 在当前shell中执行
[xep@localhost work]$ (cd ../..; ls)
--命令和命令间用分号隔开 在子shell中执行 命令结果不会影响当前shell