Shell
文件格式化处理
printf '打印格式' 实际内容
格式:
\a 警告声音输出
\b 退格键(backspace)
\f 清除屏幕 (form feed)
\n 输出新的一行
\r 亦即 Enter 按键
\t 水平的 [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 \n' $(cat filename | grep -v Name)
将文件filename的name行去掉,其他行按规定字符长度打出
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" \t" $1 "\t" $3}'
passwd文件中是以“:”为分隔符的,BEGIN会让默认第一行以空格为分隔符改成以:为分隔符,取出第三字段小于10打印出每行的第一和第三字段
注意事项:
awk 的指令间隔:所有 awk 的动作,亦即在 {} 内的动作,如果有需要多个指令辅助时,可利用分号;间隔, 或者直接以 Enter按键来隔开每个指令·
逻辑运算当中,如果是等于的情况,则务必使用两个等号==
格式化输出时,在 printf 的格式设定当中,务必加上 \n ,才能进行分行
与 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 的验证功能。