shell_note

+EditPackages=AwesomeGame
root的前缀 #
user的Bshell前缀 $
 Cshell前缀 %


Utility 工具 Kernel内核 Man Page帮助文件, interactive prompt提示
Unix = 工具 + 内核,站在shell的角度
1.非交互脚本写法:【重点记忆】
#!/bin/sh #位于第一行,其他行的#开头到行尾的都视为注释
who;ls;date;wc(wordcount);grep;type;xargs
$source script.sh/$. script.sh 执行脚本【重点记忆】
type告诉ige指定命令的全路径
Foo() Bar() foobar变量名,都是垃圾通用词汇
#表示注释,在win的批处理中::表示注释
--------------------------------------------------------
文件操作
ordinary 普通的
1. ls -alF #F表示区分文件夹和文件
2. cat -n filename   #查看文件,行号显示
3. wc [options] files1 files2 #统计文件包含的行数.单词数.字符数
eg wc [-l -w -m] files
4. cp sources destination #拷贝,支持同时多个文件,中间用空格
出错原因 1.源文件是一个目录,2.源文件不存在
eg:cp -i test.cpp # -i 表示在覆盖文件前弹出交互提示来确认
5. mv source destination # 同级目录下可以实现改名,不同级目录下移动文件,支持-i
6. rm files # 支持-i, -r表示递归删除(如果文件夹里面有内容)
--------------------------------------------------------
目录操作
1. pwd #找到当前的目录
2. cd #改变目录
3. ls directory #展开指定目录的文件列表
4. mkdir directorys # -p 创建父目录
5. cp -r docs/book docs/school work/src /mnt/zip  
# -r表示递归 将多个目录下的内容拷贝到最后一个目录参数位置
6. mv # 不能跨文件系统移动文件,即一个文件分区到另一个文件分区!!移动和重新命名
7. rm -r /tmp/ch01 #可以删除目录也可以删除文件
8. rmdir directories #删除目录
--------------------------------------------------------
文件属性操作
1. ls -l filename,     file filename  #查看文件类型信息
属性:d/-/l/s/p/b/c
2. ln -s source destination #常见错误 目标文件已存在,目标文件是一个目录
3. chmod expression files #更改文件和目录权限
--------------------------------------------------------
进程
Daemon守护进程
前台进程,后台进程的启动eg:ls &,在命令后面加&
1. set -o monitor # -o 设置检测信息,取消检测信息 +o
2. set -o #检查所有shell选项
3. 前台移到后台  ctrl+z
4. 后台移到前台  fg
5. ps -f
6. kill %[进程ID]


--------------------------------------------------------
Shell 编程
--------------------------------------------------------
变量
1. 命名 字母或者下划线开头,可以含有数字,以数字开头的变量名保留为shell自己使用
2. 变量中不能添加“!” “*” “—”“$”等因为这些字符在shell中有特殊意义,避免含义混淆
   定义:name=value(有空格需要加引号)
   访问:&name
   数组定义:name[index]=value   
   数组访问:&{name[index]} #数组访问的时候用了{} 【重点记忆】
   只读变量:readonly name #标记变量为只读
   删除变量:unset name #unset不能用于只读变量
 局部变量(只有当前shell实例中存在,子进程无法访问),环境变量(shell任何子进程都能使用),
设置环境变量。 PATH="$PATH:/home/lfu/lz/shell" 【重点记忆】
 导出变量的用途是什么:export name
 Shell变量列表:9个,以后熟悉用途【重点记忆】
PWD UID
RANDOM 0~32767之间的随机数字,可用$RANDOM赋值 echo $RANDOM
IFS: 语法分析器将扩展后的行分割成单词的时候使用的内部域分割符。缺省值为"\t\n",可以修改
其值来实现自己的语法分析程序
PATH: 命令的搜索路径的集合,由冒号分隔开
HOME: 之处当前用户的起始目录,也是cd命令的缺省参数

本地变量最好以下划线开头并且全部为大写字母,以区分全局变量
--------------------------------------------------------
替换
prefix* *suffix, substitution
1. * ? []
* 匹配0个或多个存在的任何字符
?   匹配一个存在的字符,只能用于字符!
!   否定匹配
[chars] 匹配任何给出字符chars之一,里面可以包含数字字符
eg:ls [a-z A-Z]*
ls ch0[0-9].doc
ls *[a-z A-Z 0-9]
    ls [!a]*


2. 变量替换方式总结见P75、p84, 【重点记忆】
全部以&开始
${para:-word}   : para为空或者未设置,则用word代替para进行替换,para的值不变
${para:=word}   : para为空或者未设置,则para设值为word
${para:+word} : 若para设置了,则用word代替para进行替换,para的值不变

3. 命令替换,【重点记忆】
  'command' : 在命令的位置替换为它们的输出,用的是后引号(backquote "`")而不是单引号("'")
  主要用于将一个命令的输出赋予一个变量
  eg:DATE='date'
 grep 'id -un' /etc/passwd
 
4. 算术替换
 &((expression)) 支持*/+-()
 eg: &((((5+3*2)-4)/2))中间不能有空格!
-------------------------------------------------------
引号 quoting, escaping wildcard(通配符) 【重点记忆】
定义:关掉shell中一个字符的特殊意义称为"引用"
* ? [] ' " \ $ ; & ( )| ^ new-line space tab 
这些特殊字符在想当成普通字符按文字处理的时候
都需要转义\操作,来关掉shell的特殊照顾
1. 反斜线引用 (\)
转义单个字符, 
eg:特殊转义徐行 在行尾 ls -a \
-F
2. 使用'', 这玩意叫做"单撇号“
    转义掉所有引用到的字符串
有时候正则表达式也需要引用起来 
3. 使用 “ ”
    转义掉部分特殊字符,四个无法转义[$ " ' \]当无法确定的时候用单引号''
引用反斜杠开启echo转义序列 : eg: echo line \nLine 2  //不“\n”,则\被shell忽略后传入echo
还有如cpio/find命令也要引用通配符


-------------------------------------------------------
流控制
1. if,可以将其写成一行,条件表达式必须以分号结束!不然报错
if exp1; then
list1
elif exp2; then
list2
else
list3
fi
在测试的时候应该注意的是:结尾符号不要省略


2.【重点记忆】 P99开始 用[  ]时里面必须用空格分割开来
test, test exp 或者 [ exp ],注意前后都必须要空格,帮助shell判断表达式何时开始和结束
注意其参数的解释
A. 文件测试
test option file 或者 [ option file ]
-d存在且是一个目录,man test
B. 字符串比较
test -z/-n string     or test string1 =/!= string2
C. 数字比较
test int1 operator int2
operator list: -eq -ne -lt -le -gt -ge # = != < <=  > >=
D. 复合表达式
expr1 -a expr2 #与and
expr1 -o expr2 #或or
!expr #非!


3. case: 其中pattern是一个包含规则字符和特殊通配符的字符串,这是和if比较的优势
case word in # eg word 为 "$PATH", $1
pattern1) #注意是)不是:
list1
;; #即break
pattern2)
list2
;;
esac
eg:case "&TERM" in
*term)
TERM=xterm;;
network|dialup|unknown|vt[0-9][0-9][0-9])
TERM=vt100;;
esac
-------------------------------------------------------
循环
nested Loops循环嵌套 infinite loops
1. while: conmand通常为一个test表达式
while command; do # 分号绝对不能忘了
list
done
eg:
x=0
while [ &x -lt 10 ];
do
echo &x
x=`echo ”$x + 1" | bc`  # 这里的符号是1旁边上档键的小撇号,表示命令替换,即命令的输出作为x的值
done
while最常用来得到用户的输入


2. until语法:
until command;
do 
list
done


3. for语法:in 后面支持替换里的所有动作,注意in后面是没有分号的!!
for name in word1 word2...wordN
do
list
done
eg 循环拷贝指定目录下文件
for f in $HOME/lz/shell/*.*
do
cp $f $HOme/lz/shell1 #使用变量的时候都要用求值符号$
done
4. select
5. 循环控制 continue break
-------------------------------------------------------
参数12
case: 手工处理
tar的实例已经说明
getopts: 自动处理 
getopts option-string variable
【12.3 选项分析的例子,周来来看!】
P124到章尾
【P118 特殊变量的
$0 
$n 参数N,从1开始
$# 提供给脚本的参数号
$* 
$@所有参数 eg “$1$2$3...”
$? $$ $!】
-------------------------------------------------------
I/O13 重点哦!


输出: 终端(STDOUT), 文件, 终端和文件
1.向终端(STDOOUT)输出,即打印信息
echo:用于简单格式化的字符串打印
echo string
支持空格,标点符号,变量替换, 格式化转义序列
\n,\t,\c(拼接下一个echo的输出到上一个输出尾部,即不换行),shell内置echo不支持这3个!

printf:格式化输出Shell版的C函数
printf format arguments
 eg: printf "is that a mango, %s?\n" "Yes"
printf "i like number %d\n" $var
printf "%d\n" 8

2. 输出重定向到文件
重定向到文件,
  A.文件覆盖方式,如果不存在就创建
command > file ,也可以是一个命令清单的输出重定向
list > file
eg: { data; uptime; who; } > mylog # {} > 必须要有空格!!!
  B.文件附加方式
command >> files, 
list >> file
3. 向终端和文件同时输出
command | tee file
eg: date | tee now.log #屏幕打印,并存储到文件now.log中


输入: 从文件输入, 从用户读取输入, 一个命令的输出重定向到另一个命令的输入
1. 输入重定向:额外用途建立本地文档,比使用临时文件简单一些
command < file
command << delimiter


2. 读取用户输入
read name
实例代码有问题,以后再来细看
3. 管道
  command1 | command2 | ...  #命令的输出重新定向到下一个命令的输入
  eg: fun.sh | grep "/bin"
  事实:当写脚本时必须做错误处理


  关联文件和文件描述符
  exec n > file
  exec n >> file
eg: command 1 > file1 2 > file2
 /dev/null是用于删除输出的一个特殊文件,称为bit bucket, 如果输出重定向到它即删除输出
eg: rm file > /dev/null


【p141重新看,文件描述符】


-------------------------------------------------------
函数 14
函数定义:
name() {list;}
source命令在sh中他等价与“.”
函数激活:
$name 如果敲入$name()函数却不工作,因为sh将name()解释成一个函数的重定义
1. 列出路径
  IFS: 被系统设置成空格或者跳格(tab字符),一般被shell用于确定向一个命令脚本或者
  shell函数提供了多少选项以及向for循环提供了多少项. 我们可以临时该写它的值为“:”
  来识别PATH中一共有多少项目并打印
eg
// 文件名为 fun.sh
#! /bin/sh
lspath() {
  OLDIFS="$IFS" #老值是空格
  IFS=:
  for DIR in $PATH #for后面是绝对不能有;号的哦
  do
echo $DIR;
  done
  IFS="$OLDIFS"
}
$lspath #调用函数,调用前需要载入 source fun.sh

2. 向PATH中添加自己的路径,以便于shell执行时候自己搜索到该路径
PATH="$PATH:/home/lfu/lz/shell"
 eg:实现带参数的函数
#! /bin/sh
setpath()
{
PATH=${PATH:="/home/lfu/lz/shell"};
for _DIR in "$@"
do
if [ -d "$_DIR" ]; then 
PATH="$PATH":"$DIR" ;
fi
done
export PATH
unset _DIR
}
3. 函数间共享数据 P148现在未用到
 popd
 pushd
 dirs 
-------------------------------------------------------
文本过滤
1. head tail
head/tail [ -n lines ] files #默认显示标准输出的前/后10行,设置后指定前/后n行, files是输入
我的第一个管道命令
ls -lut | head -5 #列出当前工作目录下以时间排序的前5个
ls -lut | tail -5


2. grep ,在文件中(可以多个文件)找到包含某个特殊单词或词组的行。
语法: grep word files
A. 从文件中读入
grep guest /home/lfu/lz/userlist
B. 从STDIN中读入
 eg: ls -lut | grep ".sh" # 输出包含word的行
 ls -lut | grep -v ".sh" # -v 选项指定输出不包含word的行
 注意: a. 输出的结果是以行为单位, b.word是区分大小写的!
C. -n 表示显示行号
3. 统计单词的总数
wc、tr、sort、uniq 【以后具体用到在查阅】
-------------------------------------------------------
使用正则表达式过滤文本,或者替换文本,【基本技能添加需求】
escape 转义
awk & sed 两个工具!
正则表达式的语法:
1. 普通字符 大小写字母、数字、字符如空格或者下划线
2. 元字符 见P165表 [ .  *  [chars] ^ $ \ ]
[ a-z A-Z 0-9 ]
-------------------------------------------------------
awk是UNIX中的一个强大的测试过滤工具
域编辑, 变量, 流控语句
语法 awk 'script' files

-------------------------------------------------------
各种工具
1. eval
2. :   :表示一个空操作no-op返回的结果为成功或真,当占位符可以
while :比while true的效率高,因为:内置
3. type告诉ige指定命令的全路径
  eg: type true vi case ulimit history
  keyword / a shell builtin / is bashed(/urs/bin/man) / is /bin/ps 区别??
4. sleep 
sleep n #暂停给定的秒数
  若想代码一直可运行,必须周期性的清除logfile,这样磁盘才不会满
  
5. find 检索出匹配给定规则的文件,输出是文件!【重点记忆】
find start-dir options actions
6. xargs:从标准输入接收单词并将其提供给定命令作为参数,  cat filelist | xargs rm;
7. expr : 执行简单的整数算术运算  $ expr 8 / 3 必须要空格, expr 8 \* 3  # *要用转义字符
8. bc : 不局限于整数的算术工具;
-------------------------------------------------------
信号处理 19 高级主题
ctrl + l = clear
ctrl + c kill进程,ex: kill infinite loop
kill -signal pid
调试相关
在脚本头上写入:#! /bin/sh option #!表示告诉系统要调用后面给出的程序来解释
option:
-n: 读所有的命令但不执行它们
-v: 在读时显示所有的行
-x: 执行时显示所有命令和它们的参数


set 命令取消或者开启调试
创建函数库,和创建脚本没有本质区别,库里面只有函数的定义
创建了一个函数之后需要在shell中来激活该函数或者说包含它
语法格式: .file


解决问题:
1 移动目录


 创建一个tar文件
tar -cpf - source
tar -xpf -


uname -srmn
-------------------------------------------------------
问题要点
1. shell和命令
2. 变量和参数
3. 文件和目录


重定向命令的输出到文件/dev/null(比特垃圾桶)来避免输出到屏幕(STDOUT)
-------------------------------------------------------
正则表达式 Regular expression, 主要用于搜索字符串之用,和用于过滤特殊讯息
按照整行的形式在进行处理

grep -incv 'target_str' filename
*** | grep -incv 'target_str'
特殊字符:\转义符, ?单一匹配, *任意匹配, ^行首,$行尾,[]


eg:在 /etc 底下,只要含有 XYZ 三个字符的任何一个字符的那一行就列出来,要怎样进行?
grep [XYZ] /etc
我想要找出在 /etc 底下,档案内容含有 * 的文件名称? 
grep '\*' /etc
awk, tr, sed只能以后再工作中学习

























  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值