最近又想学shell了,以前学的好多都忘记了,这回学的时候,记点笔记,可以经常翻着看,

1.

在shell 中 常看到特殊变量 $1  ,$2 ...  

$1表示引用 传入shell脚本的的第一个参数,$2  引用传入shell脚本的第二个参数, 以此类推

2.

[root@localhost ~]# awk -F : '{ print "User" $1 "is really" $5 }' /etc/passwd

Userrootis reallyroot

Userbinis reallybin

Userdaemonis reallydaemon

Useradmis reallyadm

Userlpis reallylp

  
因为忘记加逗号(,) 所以出现上边的情况了。 正确的是如下
[root@localhost ~]# awk -F : '{ print "User" ,$1 ,"is really" ,$5 }' /etc/passwd 

User root is really root

User bin is really bin

User daemon is really daemon

User adm is really adm

User lp is really lp

User sync is really sync

 
$# 传递到脚本的参数个数
$*   以一个单字符串显示所有向脚本传递的参数(默认没加双引号,以一空格做分隔符,其他符号一律屏蔽,当没有处理。如果加了双引号,则现实参数原来的格式,但是保留空格,其他符号都不显示)
$$   脚本运行的当前进程ID号
$!    后台运行的最后一个进程的进程ID号
$@   与$#相同,但是使用时加引号,并在引号中返回每个参数(和$*一样,在加双引号和不加双引号情况下)
$-    显示shell使用的当前选项,与set 命令功能相同
$?    显示最后命令的退出状态。0表示没错误,其他值,表示有错误
 
3.sed 中的sed 的/\<love/    /^love/  有啥区别
 
 /^love/  表示的是行的开头,只有在行首才匹配
/\<love/ 是表示的词的开头,这个一行出现多个词,并且词开头是以这几个字符开头的,都会匹配。例如:
[root@localhost ~]# cat test1.txt 

luyafei lu

lu 

feiyalu lu
[root@localhost ~]# sed 's/\<lu/yy/g' test1.txt 

yyyafei yy

yy 

feiyalu yy
4.awk -F(FS) 字段分隔符 ,默认是空格,FS 这个是多个字段分割符,可以使用正则,例如 -F [:\t]
 这个就是用:或者\t 做分隔符 
 
5.awk 中NR是输出行号,NF代表字段数
 
6. read  在读取键盘或者某行,如果一个变量 则把整行给他,如果是多个变量 ,则用空格做分隔符,把每个字段对应赋值,多余的字段都付给最后的变量。
 
[root@localhost ~]# read name

Hello I am superman

[root@localhost ~]# echo $name

Hello I am superman

[root@localhost ~]# read name surname

Hello I am supername

[root@localhost ~]# echo $name

Hello

[root@localhost ~]# echo $surname

I am supername


 7.awk 中NF 表示字段数,如是是变量$NF,则表示最后字段。
 
 [root@localhost ~]# awk -F: '$1 == "root"{print $NR, $1, $2, $3, NF}' /etc/passwd

root root x 0 7

[root@localhost ~]# awk -F: '$1 == "root"{print $NR, $1, $2, $3, $NF}' /etc/passwd

root root x 0 /bin/bash

[root@localhost ~]# 
 8.BEGIN 模式里主要是做内部变量修改,或者自定义变量,赋值等,如果模式内有多条语句,则用分号隔开。
[root@localhost ~]# awk 'BEGIN{FS=":"; OFS="\t"; ORS="\n\n"} {print $1, $2, $3}' /etc/passwd

root x 0




bin x 1
ORS 实际上表示的是每行的距离,OFS是字段间的距离,FS是字段符
 
9.END 模式不匹配所以输入行,而是执行任何相关联的操作,awk 处理完所有输入行,才执行END
[root@localhost ~]# awk 'END{print "The number of records is", NR}' /etc/passwd

The number of records is 45

[root@localhost ~]# 
上面这个就是在处理完文件,才执行END, NR 值是/etc/passwd 文件的最后记录数,也就是最后一行的行号。
 
10.read和管道问题
[root@bogon ~]# echo 1 2 3 4 | read one two three four
[root@bogon ~]# echo $one

[root@bogon ~]# echo $four

[root@bogon ~]# echo $two
 
看到这个很惊讶,查资料,我暂时理解为,read是管道的子程序,就是echo执行完,然后子程序read执行,最后才管道,所以read 读进的变量 都没赋值,下面是一段E文解释,可惜俺看的不懂,糊里糊涂的