1. 简单 Shell 编程 FAQ - yanbin's Blog

1. 简单 Shell 编程 FAQ

yanbin posted @ 2019年8月24日 18:25 in Programming , 829 阅读

5. mkdir -p 与 install -d 的区别?

install -d, mkdir -p 都可以用来创建目录,并且创建整个路径上缺少的目录。

install -d /path/to/directory
#install 尝试改变 directory 的读写权限为: $(umask) ^ file create mode,
#如果 directory 已经存在,并且属主不是执行 install -d 的用户,install 会有权限错误:
install: cannot change permissions of ‘/path/to/directory’: Operation not permitted

一般来说执行之前会判断目录是否存在,没有判断又依赖 install 执行成功就有问题了。
install -d 一般只有一个 root 用户的嵌入式系统上常见,毕竟不存在权限问题。(不是所有的嵌入式系统都只有一个 root 用户)
install -d 也用在一些 SDK 里,打包程序时一般用 install -d 创建一些目录。

$ mkdir -p /path/to/directory
#完成相同的创建目录工作,并不会尝试改变什么,directory 存在时甚至不会执行任何操作,直接返回成功。
 

6.Shell 脚本'\\NL'续行小结。NL 表示 newline;
(a) '“'括起来的字符串中出现'\\NL';
这种形式的字符串中的 '\\NL', 会被转义,最终作为参数传递给程序/命令的字符串是没有续行符的一行。
echo \"hello \\\r\nworld\"
# 输出 hello world
(b) '‘'括起来的字符串中的 '\\NL';
这种形式的字符串中的所有字符都会以其文本形式对待,'\\NL'不会被转义,传递给程序/命令是会视为两个字符,
一个是'\\',一个是'NL'.
一般不会在'''括起来的字符串中出现'\\NL, sed 和 awk 的代码中例外。

echo 'hello \\\r\nworld'
# 输出 hello \\\r\nworld

(c) 代码续行;\r\n当一行代码过长超过80个字符时,一般会用 '\\NL'的形式换一行,目的是为了阅读方便,一般出现在管道字符 '|'之后,\r\n或者某个参数之前。Shell 在解析代码时,这种形式的'\\NL'也会被转义。

(d) sed, awk 执行的代码中的续行;
如果是用 '''包括的代码,一般来说传递给 sed, awk 时其实是两个字符,这个与(b)是相同。
对于 sed 和 awk 而言,在处理/解析这样的代码时会转义续行符。
这样做的目的也是为了更方便的阅读代码。其实也可以不用续行符。

7.读/写 FIFO 为什么会阻塞?
FIFO 的默认特性:读没有写端的 FIFO 会阻塞;而写没有读端的 FIFIO 也会阻塞。
先启动读端程序,还是先启动写端程序呢?\r\n无论如何要确保:
(a) 写端程序不会因为读端程序不存在或启动不及时而丢失数据。
(b) 确保读端程序启动后写端程序不会因此而没有机会运行。

8.awk 如何在表达式中使用 Shell 变量的值?
使用 awk 的 -v val=val 参数传递 Shell 变量给 awk 并且用于 awk 程序之内。
foobar=7
cat foobar.txt | awk -v foobar=$foobar -F','  '{ printf(\"%d\\n\", $1*foobar)}'
# -v val=val 参数可以有多个:
foo=3
bar=5
cat foobar.txt | awk -v foo=$foo -v bar=$bar -F',' '{printf(\"%d\\n\", 1*foo*bar)}'

9.shell 脚本可以等待一个程序执行完吗?有哪些限制?
使用 wait 命令。
wait 是 bash 的一个内部命令,使用 -n 指定一个或多个 child pid, 等待进程退出并返回其 termination status;
如果指定了多个 pid ,那么就返回最后一个进程的 termination status;
没有指定 pid, wait 等待 Shell 脚本的所有子进程退出执行。
限制是:只能等待 Shell 脚本的子进程退出。

Host by is-Programmer.com | Power by Chito 1.3.3 beta | © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee