Shell

文件格式化处理

printf  '打印格式' 实际内容

格式:

a 警告声音输出

 退格键(backspace)

f 清除屏幕 (form feed)

输出新的一行

亦即 Enter 按键

水平的 [tab] 按键

v 垂直的 [tab] 按键

xNN   NN 为两位数的数字,可以转换数字成为字符。 45转换由16进制转化为10所对的字符。

%ns 那个 n 是数字, s 代表 string ,亦即多少个字符;

%ni 那个 n 是数字, i 代表 integer ,亦即多少整数字数;

%N.nf 那个 n N 都是数字, f 代表 floating (浮点)N代表总共的字符大小,n代表小数部分的字符长度

eg.: printf '%10s %5i %5i %5i %8.2f ' $(cat filename | grep -v Name)

将文件filenamename行去掉,其他行按规定字符长度打出

awk '条件类型 1{动作 1} 条件类型 2{动作 2} ...' filename

awk 主要是处理每一行的字段内的数据,而默认的字段的分隔符为 "空格键" "[tab]"

通过空格符取出我们想要的字段数据

通过分隔符隔开后,每个字段内的数据可以由$1,$2......表示

awk是以行来处理数据,字段是处理数据的最小单位,通过awk提供的内建变量可以知道文件每行的字段总数,每一行是第几行

NF 每一行 ($0) 拥有的字段总数

NR 目前 awk 所处理的是第几行数据

FS 目前的分隔字符,默认是空格键

awk的逻辑运算符

cat /etc/passwd | awk 'BEGIN {FS=":"} $3 < 10 {print "lines:"NR" " $1 " " $3}'

passwd文件中是以“:”为分隔符的,BEGIN会让默认第一行以空格为分隔符改成以:为分隔符,取出第三字段小于10打印出每行的第一和第三字段

注意事项:

awk 的指令间隔:所有 awk 的动作,亦即在 {} 内的动作,如果有需要多个指令辅助时,可利用分号;间隔, 或者直接以 Enter按键来隔开每个指令·

逻辑运算当中,如果是等于的情况,则务必使用两个等号==

格式化输出时,在 printf 的格式设定当中,务必加上 ,才能进行分行

bash shell 的变量不同,在 awk 当中,变量可以直接使用,不需加上 $

文件比对工具:

diff用于比对两个文件的差异,是以行去做比对,diff 通常是用在同一的文件的新旧版本差异,diff也可以比对目录下的差异

diff [-bBi] from-file to-file 

from-file :作为原始比对文件的档名; to-file :作为目的比对文件的档名;

from-file to-file 可以 - 取代,那个 - 代表『Standard input』之意。

-b :忽略一行当中,仅有多个空白的差异视为相同

-B :忽略空白行的差异。

-i :忽略大小写的不同。

cmp:以字节的差异去对比,也可以对比二进制文件的差异

cmp [-l] file1 file2 

-l :将所有的不同点的字节处都列出来。因为 cmp 预设仅会输出第一个发现的不同点。

patch :将旧文件更新成为新文件,先比较先旧版本的差异,并将差异档制作成为补丁档,再由补丁档更新旧文件

diff -Naur passwd.old passwd.new > passwd.patch 制作出补丁文件

更新文件:patch -pN patch_file

还原文件:patch -R -pN patch_file

Shell script程序化脚本

#!/bin/bash 在宣告这个 script 使用的 shell

script 的执行方式差异 (source, sh script, ./script)

sh:使用直接执行的方法来处理时,系统会给予一支新的 bash 让我们来执行脚本里面的指令,因此变量其实是子程序 bash 内执行的。当脚本执行完毕后,子程序 bash 内的所有数据便被移除。

source:会在父程序中执行的,因此各项动作都会在原本的 bash 内生效。

利用test指令的测试功能:

test -e filename

-e 该『档名』是否存在?(常用)

-f 该『档名』是否存在且为文件(file)(常用)

-d 该『文件名』是否存在且为目录(directory)(常用)

-r 侦测该档名是否存在且具有『可读』的权限?

-w 侦测该档名是否存在且具有『可写』的权限?

-x 侦测该档名是否存在且具有『可执行』的权限?

test file1 -nt file2

-nt (newer than)判断 file1 是否比 file2

-ot (older than)判断 file1 是否比 file2

test n1 -eq n2

-eq 两数值相等 (equal)

-ne 两数值不等 (not equal)-gt n1 大于 n2 (greater than)

-lt n1 小于 n2 (less than)

-ge n1 大于等于 n2 (greater than or equal)

-le n1 小于等于 n2 (less than or equal)

test -z string 判定字符串是否为 0 ?若 string 为空字符串,则为 true

test -n string

判定字符串是否非为 0 ?若 string 为空字符串,则为 false

注: -n 亦可省略

test str1 == str2 判定 str1 是否等于 str2 ,若相等,则回传 true

test str1 != str2 判定 str1 是否不等于 str2 ,若相等,则回传 false

test -r filename -a -x filename

-a

(and)两状况同时成立!例如 test -r file -a -x file,则 file 同时具有 r x 权限

时,才回传 true

-o

(or)两状况任何一个成立!例如 test -r file -o -x file,则 file 具有 r x 权限时,

就可回传 true

! 反相状态,如 test ! -x file ,当 file 不具有 x 时,回传 true

判断符号:[ ]

在中括号 [] 内的每个组件都需要有空格键来分隔;

在中括号内的变数,最好都以双引号括号起来;

在中括号内的常数,最好都以单或双引号括号起来。

Shell script的默认参数:

$0 为执行脚本的文件名,后面所带的参数以空格为分隔符以$1持续增加

$@代表所有的参数,且每个参数都是独立,"$1" "$2" "$3" "$4"

条件判断式

if [条件判断式];

then

指令工作内容

fi

 

多重、复杂条件判断式

if [ 条件判断式一 ];

then

当条件判断式一成立时,可以进行的指令工作内容;

elif [ 条件判断式二 ];

then

当条件判断式二成立时,可以进行的指令工作内容;

else

当条件判断式一与二均不成立时,可以进行的指令工作内容;

fi

case ..... esac 判断

case $变量名称 in <==关键词为 case ,变数前有钱字号

"第一个变量内容") <==每个变量内容建议用双引号括起来,关键词则为小括号 )

程序段

;; <==每个类别结尾使用两个连续的分号来处理!

"第二个变量内容")

程序段

;;

*) <==最后一个变量内容都会用 * 来代表所有其他值

不包含第一个变量内容与第二个变量内容的其他程序执行段

exit 1

;;

esac

 

function功能

function fname() {

程序段

} 

shell script 的执行方式是由上而下,由左而右, 因此在 shell script 当中的 function 的设定一

定要在程序的最前面

function 也是拥有内建变量的他的内建变量与 shell script 很类似, 函数名称代表示 $0

而后续接的变量也是以 $1, $2... 来取代的

循环:while do done, until do done (不定循环) for...do...done (固定循环)

while [ 判断式 ]

do

程序段落

done

当判断式条件成立时,就进行循环,直到判断式的条件不成立才停止

until [ condition ]

do

程序段落

done

while 相反,当 condition 条件成立时,就终止循环, 否则就持续进行循环的程序段

for var in con1 con2 con3 ...

do

程序段

done

数值处理:

for (( 初始值; 限制值; 执行步阶 )) 数字执行 C语言for循环差不多

do

程序段

done

shell script的追踪与debug

sh [-nvx] scripts.sh

-n :不要执行 script,仅查询语法的问题

-v :再执行 sccript 前,先将 scripts 的内容输出到屏幕上

-x :将使用到的 script 内容显示到屏幕上

ACL

使用者 (user):可以针对使用者来设定权限;

群组 (group):针对群组为对象来设定其权限;

默认属性 (mask):还可以针对在该目录下在建立新文件/目录时,规范新数据的默认权限;

设定与观察ACL

getfacl:取得某个文件/目录的 ACL 设定项目

setfacl:设定某个目录/文件的 ACL 规范

setfacl [-bkRd] [{-m|-x} acl 参数] 目标文件名

选项与参数:

-m :设定后续的 acl 参数给文件使用,不可与 -x 合用;

-x :删除后续的 acl 参数,不可与 -m 合用;

-b :移除『所有的』 ACL 设定参数;

-k :移除『预设的』 ACL 参数,关于所谓的『预设』参数于后续范例中介绍;

-R :递归设定 acl ,亦即包括次目录都会被设定起来;

-d :设定『预设 acl 参数』的意思!只对目录有效,在该目录新建的数据会引用此默认值

setfacl -m u:fpw:rx filename fpw用户给予file文件rx权限

setfacl -m u::rwx filename 给当前user用户rwx权限

getfacl filename

针对有效权限设定:setfacl -m m:r filename

权限使用者或群组所设定的权限必须要存在于 mask 的权限设定范围内才会生效,此即有效权限 可以透过使用 mask 来规范最大允许的权限,就能够可以避免不小心 开放某些权限给其他使用者或群组了

使用默认权限设定目录未来文件的 ACL 权限继承『 d:[u|g]:[user|group]:权限 』

setfacl -m d:u:fpw:rx /srv/projecta 让属性继承到次目录底下

特殊的 shell, /sbin/nologin

让某个具有 /sbin/nologin 的使用者知道,他们不能登入主机时,可以建立 /etc/nologin.txt 这个文件, 并且在这个文件内说明不能登入的原因,那么下次当这个用户想要登入系统时,屏幕上出现的就会是 /etc/nologin.txt 这个文件的内容,而不是预设的内容了!

PAM是一套应用程序编程接口 (Application Programming Interface, API),他提供了一连串的验证机制,只要使用者将验证阶段的需求告知 PAM后,PAM就能够回报使用者验证的结果(成功或失败)PAM 是一个独立的 API 存在,只要任何程序有需求时,可以向 PAM 发出验证要求的通知, PAM 经过一连串的验证后,将验证的结果回报给该程序,然后该程序就能够利用验证 的结果来进行可登入或显示其他无法使用的讯息。可以在写程序的时候将 PAM 模块的功能加入,就能够利用 PAM 的验证功能。

原文地址:https://www.cnblogs.com/pw-fan/p/11244356.html