Unix & Linux shell学习笔记

第一章 文件安全与权限

文件
目录

setuid
chown
chgrp
umask

suid
guid
粘滞位

suid —> -rwSrwxr–
guid —> -rwxrwSr–
t —> -rwxrwxr-T

suid: 执行此文件时具有此文件owner的权限
guid: 执行此文件时具有此文件group的权限
t: 若出现在目录上,只有目录的owner才能删除;若出现在文件上,执行时会被放在交换区。

chmod u+s xxx.txt
chmod g+s xxx.txt
chmod +t xxx.txt

4个8进制数中的第一个:1代表T, 2代表guid,3代表suid

第二章 find和xargs

xargs可防止参数列表溢出。
xargs是一个命令。
Buid and excute command lines from standard inputs.

find:
忽略某目录:-prune -o -print

cpio命令:向磁带中备份文件或从中恢复文件。

第三章 后台执行命令的方法

cron
crontab
at
&
nohup

ctrl-z
bg
fg
jobs

第四章 模式匹配

通配符:
*
?
[…]
[!…]

第五章 shell输入输出

echo
read
cat
管道: |
tee: xx.sh | tee xx.log

0:标准输入
1:标准输出
2:标准错误输出

六 命令执行顺序

&&
||
(cmd1; cmd2; cmd3; …) 在当前shell中执行这些command
{cmd1; cmd2; cmd3; …} 在子shell中执行这些命令

七 正则表达式

BRE: 标准正则表达式
ERE: 扩展正则表达式

^ 行首
$ 行尾
. 单字符
* 重复单字符
[] 范围
\ 转义
pattern{n} 重复n次
pattern{n,} 重复n次以上
pattern{n,m} 重复n~m次

八 grep

grep、egrep、fgrep

九 awk

十 sed

十一

sort
uniq
join
cut
past
split

十二

tr的用法

十三 登陆

步骤:
1. /etc/passwd
2. /etc/profile
3. ~/.profile

/etc/passwd
冒号分隔的七个域,分别为登录名、密码、。。。
第5域为用户全名,第6域为用户根目录,第7域为用户登录的shell

登陆时先后执行 /etc/profile 和 ~/.profile, 登出时执行 ~/.logout

十四 环境和变量

引用变量时最好用花括号括起来,${variabl}

设置变量的方法:
=
+
:?
?
:=
:-

unset 清除变量
set 显示本地变量

${val:-value} 测试val是否已设置,若val已试着则使用val,否则使用value

readonly 设置某变量为只读。

环境变量

  1. 通常全大写
  2. unset可清除指定的环境变量
  3. shell中的环境变量:CDPATH, EXINIT, HOME, IFS, LOGNAME, MAIL, MAILCHECK, MAILPATH, PATH, PS1, PS2, SHELL, TERMINFO, TERM, TZ, CDITOR, PWD, PAGER, MANPATH, LPDEST/PRINTER
  4. set -a 导出所有变量
  5. export 导出指定变量
  6. 位置变量: $0,$1,$2, ...,$9
  7. 特性变量: $#, $*, $$, $!, $@, $-, $?
  8. 引号:双引号,单引号, 反引号
  9. 双引号中不能直接放$ ` \其他字符都可以。
  10. 单引号,shell会忽略其中的任何引用值。
  11. 反引号,用于设置系统命令的输出到变量。shell将反引号中的内容作为系统命令。
  12. 反斜线(反斜杠)屏蔽特殊意义的字符。特殊意义的字符:& * + ^ \$ ` " | ?
  13. 表达式,expr
  14. echo -e,可以使用\n, \r, \c等。

十六 脚本

\#!/bin/bash

十七 条件测试

test两种格式:
test condition
[ condition ]

测试文件状态:
-d
-f
-L
-r
-s
-w
-u
-x

-a 与
-o 或
! 非

= 字符串相等
!=不等
-z 空
-n 非空

数值测试:
-eq
-ne
-gt
-lt
-le
-ge
例:[ “$Number” -eq “130” ]

expr:

    expr 10+10
    expr 10 \* 10
    Loop=`expr $Loop + 1`

    expr xx + 1
    echo $?

十八 控制流程

退出状态

#?
exit n
$$
||

控制流程

分支:
if then else fi
case

循环:
for
until
while

1.变量值测试
if [ "$NAME" = "" ]
2.grep输出检查
if [ grep 'Dave' data.file > /dev/null 2>&1 ]
3.用grep测试变量
if [ echo $list | grep "peter" > /dev/null 2>&1 ]
4.测试文件拷贝
if [ cp file file.bak ]
5.当前目录测试
if [ `pwd` != "/" ]
6.文件权限测试
if [ ! -w "$LogFile" ]
7.测试传递到脚本的参数
if [ $# -lt 3 ]
8.测试脚本是交互模式还是非交互模式(cron或at)
if [ -t ]
9.变量是否已经设置
if [ -z $EDITOR ]
10.检查运行脚本的用户
if [ $LOGNAME != "root" ]
LOGNAME是环境变量
11.空命令 “ : ”(冒号)
12.elif

case的用法

case $xxx
xx) xxxx
;;
yy) yyyy
;;
*) ****
;;
esac

for的用法
for 变量名 in 列表

1. for loop in 1 2 3 4 5
2. for loop in "orange red blue grey"
3. for loop in `ls`
4. for params in "$@"
5. for params in "$*"
省去in列表项是时,它将接受命令行位置参数作为参数
for params
do
    echo $params
done

until的用法

until [ condition ]
do
    xxx
done

while的用法

while [ xxx ]
do
    xxx
done

例:
while [ "$count" -lt "50" ]
do
    count=`expr $count + 1`
done

while read FILM
do
    echo $FILM
done

while read LINE
do
    echo $LINE
done < xxx.txt     <---- 从文件读取

分隔符IFS:
默认的分隔符是空格。
可以临时改变分隔符。

SAVEDIFS=$IFS
IFS=:
xxx
IFS=$SAVEDIFS

十九 函数

定义三种方法:

函数名()
{
    xxx
}
函数名(){
    xxx
}
function 函数名(){
    xxx
}

向函数传递参数:
1.调用函数时,将参数写在函数名后面
2.在函数中用$0 $1 $2...引用参数
从函数中返回:
return
return 1
return 0

使用函数:
收集一些常用函数,将它们放在文件中,文件开头要有#!/bin/sh,文件名任意。使用source或 . 将函数载入当前shell。
其实载入的不仅仅是函数,也包含变量。

检查载入的函数: set
清除函数:unset
修改函数:unset —> 修改 —> 重新载入

在脚本中使用函数:直接通过函数名调用。

二十 向脚本传递参数

shift

每次将参数位置向左偏移一个位置,同时也改变$#

shift n:向左偏移n个位置
shift `expr $#-2`:移到最后一个参数

getopts

while getopts ahfgv OPTION
do
    case $OPTION in
    a)
    ;;
    h)
    ;;
    ......
done

你可能感兴趣的:(个人原创)