unix shell 编程(读书笔记3):提高篇

来源:互联网 发布:安卓时间校准软件 编辑:程序博客网 时间:2024/05/19 01:14

数据的读入和显示
read命令的一般格式是:
read variables

shell从标准输入读入一行数据并把所读入的第一个词赋给variables中所列的第一个变量...
Ctrl + d 结束 read命令,等read是从文件中读数据是,文件结束就相当于Ctrl + d

echo 中的特殊转义字符
字符 显示
\b 退格
\c 行尾不带行结束符
\f 换页
\n 换行
\r 回车
\t 制表符
\\ 反斜杠字符
\0nnn ASCII值为nnn的字符,其中nnn是1到3位八进制数

写shell程序是对文件名要判断是否是目录还是文件,对该文件名代表的媒介进行操作时要判断是否已经存在,和是否有操作权限。

$$变量和临时文件
如果一个程序中多个人可能对这个程序进行操作,如果这个程序里面有代码是对某个临时文件进行操作可能会引发混乱。不同的进程生成同样名称的临时文件很可能会发生冲突

$$等于登录shell的进程id 号码
grep -v "$name" phonebook >/tmp/phonebook$$ #加上进程id避免冲突
mv /tmp/phonebook$$ phone

printf 格式化输出命令:
printf "format" arg1 arg2 ...
-----------------------------------------------

子shell就是登录shell为了运行期望的程序而执行的全行的shell,每个shell在运行时都有自己的运行环境

局部变量和导出变量:
1. 没有到处的变量是局部变量,子shell不知道它的存在;
2. 导出变量被复制到子shell的环境中,在其中我们可以存取和修改它们,但是这种修改对父shell中的变量没有影响;
3. 导出变量的这种特性不仅对直接产生的子shell如此,而且对由子shell产生的shell也是如此;
4. 可以在给变量赋值之前或之后的任何时候导出该变量。

?问题是:父shell里面导出的变量,子shell修改后,能在子shell里再导出吗?没必要再导出,3中提到了在子shell的子shell中仍然有效,

export -p: 可以得到shell所到处的所有变量的清单,

PS1 和 PS2
shell用例做为命令提示符显示的字符存在变量PS1中,可以把这个字符改成任何字符,
PATH :指定的是执行命令是shell 要搜索的目录,这些目录用:隔开
当前工作目录,
HOME 宿主目录
CDpath

shell 不能改变父shell的变量值,所以要想改变当前环境的变量值不能启用子shell去完成。
shell 有个内部命令成为. 它的一般格式为:
. file
该命令不产生子shell, 所以它可以做一些对当前环境的操作任务
exec 命令
exec program
该命令结另起一个shell代替当前shell来执行program,
exec > report
exec < file
exec < /dev/tty #将标准输入该好终端

(...) 和 {...;}结构
() 里面的内容在子shell里面执行
{...;} 在当前shell里执行
.profile
$./etc/profile
$ . .profile
对环境的改变会保留下来

term 选择不同终端的类型
tz 确定时区信息 time zoom
----------------------------------------------------

深入参数
同时对许多关键字参数赋值
$ x=100 y=200 z=50
要把参数替换为它的值,最简单的形式是在参数前面加一个美元符号如:
$x $y $z
因为参数名后面的字符会引起冲突,可以把参数名放在{} 里
mv $file ${file}x
${parameter:-value}
该结果的意思是,如果parameter不为空,就替换它的值,否则就替换为value
echo using editor ${EDITOR:-/bin/vi}
EDITOR为空时,用/bin/vi 替换

${parameter:=value}
该结果的意思是,如果parameter不为空,就替换它的值,否则就替换为value
echo using editor ${EDITOR:=/bin/vi}
EDITOR为空时,用/bin/vi 替换,并且将/bin/vi赋给 EDITOR。后面再有${EDITOR}时就有它的值:/vin/vi替换
注意:和${parameter:-value} 的不同之处

${parameter:?value}
如果parameter不为空,shell就替换它的值,否则shell就把value写入标准错误,然后退出(不必担心,如果这种情况发生在登录shell中,不会从系统注销)。

$PHONEBOOK=
$:${PHONEBOOK:?"NO PHONEBOOK file!"}
NO PHONEBOOK file!
$:${PHONEBOOK:?}
sh: PHONEBOOK: parameter null or not set
$
${Parameter:+value}
如果parameter不为空,则这种结构替换为value, 否则什么也不替换
$traceopt=T
$echo option:${traceopt:+"trace mode"}
options:trace mode
$traceopt=
$echo options:${traceopt:+"trace mode"}
options:
$
WORKDIR=${DBDIR:$(PWD)}

如果DBDIR不为空则将值赋给WORKDIR,否则执行PWD命令,并将结果赋给WORKDIR,此时DBDIR仍然为空.