6.NULL The missing Semester of your CS Education学习笔记

6.NULL The missing Semester of your CS Education

shell

  • ls(英文全拼:list files): 列出目录及文件名
  • cd(英文全拼:change directory):切换目录
  • pwd(英文全拼:print work directory):显示目前的目录
  • mkdir(英文全拼:make directory):创建一个新的目录
  • rmdir(英文全拼:remove directory):删除一个空的目录
  • cp(英文全拼:copy file): 复制文件或目录
  • rm(英文全拼:remove): 删除文件或目录
  • mv(英文全拼:move file): 移动文件与目录,或修改文件与目录的名称

你可以使用 man [命令] 来查看各个命令的使用文档,如 :man cp。

Tee 用于读取标准输入的数据,并将其内容输出成文件

tee [-ai][--help][--version][文件...]
  • -a或–append  附加到既有文件的后面,而非覆盖它.
  • -i或–ignore-interrupts  忽略中断信号。

man命令

用于查看某个命令的参数

查看时需要翻屏:

​ 向后翻一屏:space(空格键)   向前翻一屏:b

​ 向后翻一行:Enter(回车键)    向前翻一行:k

查看时需要查找:

/关键词 向后查找 n:下一个

?关键词 向前查找 N:前一个

chmod命令 用于控制用户对文件的权限命令

img

img

Shell Tools and scripting

1、命令之间使用 && (||)连接,实现逻辑与(或)的功能。

2、对于&&,只有在 && 左边的命令返回真的情况下,&& 右边的命令才会被执行。只要有一个命令为假,后面的命令都不会执行,即:短路的功能 。

3 、对于||有点不同于常规语法的“或“的功能,它是表示:只有在 || 左边的命令返回假,|| 右边的命令才会被执行。但是,只要有一个命令返回真,后面的命令就不会被执行,即:一直会运行到返回为真的命令时才会停止执行。

false || echo "Oops, fail"
# Oops, fail

true || echo "Will not be printed"
#

true && echo "Things went well"
# Things went well

false && echo "Will not be printed"
#

true ; echo "This will always run"
# This will always run

false ; echo "This will always run"
# This will always run

定义新的命令

mcd () {
    mkdir -p "$1"
    cd "$1"
}

使用变量需要加$

二、linux脚本运行时常会用到一些变量,大致如下:

$$:Shell本身的PID(ProcessID)
$!:Shell最后运行的后台Process的PID
$?:最后运行的命令的结束代码(返回值)
$-:使用Set命令设定的Flag一览
$*:所有参数列表。用”$1” “ 2 ” … “ 2” … “ 2n” 来获取参数值。
$@:所有参数列表。用”$1” “ 2 ” … “ 2” … “ 2n” 来获取参数值。
$#:添加到Shell的参数个数
$0:Shell本身的文件名
1 ~ 1~ 1n:添加到Shell的各参数值。$1是第1参数、$2是第2参数…。

#!/bin/bash
echo “File Name: $0”;
echo “First Parameter : $1”;
echo “First Parameter : $2”;
echo “Quoted Values: $@”;
echo “Quoted Values: $*”;
echo “Total Number of Parameters : $#”

执行结果

➜  missing sh b param1 param2
“File Name: b”
“First Parameter : param1”
“First Parameter : param2”
“Quoted Values: param1 param2”
“Quoted Values: param1 param2”
“Total Number of Parameters : 2”

将某个命令行的输出结果当成变量

$(CMD)就可以当作执行CMD语句

例如,可以使用for file in $(ls)来遍历ls查询出来的文件目录

<(CMD)会执行CMD命令并将结果放在临时文件中,并将<()替换成文件名

For example, diff <(ls foo) <(ls bar) will show differences between files in dirs foo and bar.

当grep没有找到pattern时,会返回1,如果返回不等于0,那么就执行if后面的语句,此示例可以测试$?返回值

#!/bin/bash

echo "Starting program at $(date)" # Date will be substituted

echo "Running program $0 with $# arguments with pid $$"

for file in "$@"; do
    grep foobar "$file" > /dev/null 2> /dev/null
    # When pattern is not found, grep has exit status 1
    # We redirect STDOUT and STDERR to a null register since we do not care about them
    if [[ $? -ne 0 ]]; then
        echo "File $file does not have any foobar, adding one"
        echo "# foobar" >> "$file"
    fi
done

shell脚本中 [-eq] [-ne] [-gt] [-lt] [ge] [le]

-eq           //等于
-ne           //不等于
-gt            //大于 (greater )
-lt            //小于  (less)
-ge            //大于等于
-le            //小于等于
在linux 中 命令执行状态:0 为真,其他为假

和>都属于输出重定向,<属于输入重定向。

2、文件内容的区别:

会覆盖bai目标的原有内容。当文件存在时会先删除原文件,再重新创建文件,然后把内容写入该文件;否则直接创建文件。

会在目标原有内容后追加内容。当文件存在时直接在文件末尾进行内容追加,不会删除原文件;否则直接创建文件。

linux上的shebang符号(#!)

用来指明执行这个脚本文件的解释程序

https://blog.youkuaiyun.com/u012294618/article/details/78427864

#!/bin/bash
echo "hello, world."
echo "hello, ${1}."			#1代表的是输入程序的第一个参数
/test.sh   leng  (运行之时,其实是 /bin/bash ./test.sh leng)

rpm指令

1.安装一个包 
# rpm -ivh 

2.升级一个包 
# rpm -Uvh 

3.移走一个包 
# rpm -e 

4.安装参数 
--force 即使覆盖属于其它包的文件也强迫安装
--nodeps 如果该RPM包的安装依赖其它包,即使其它包没装,也强迫安装。 

5.查询一个包是否被安装 
# rpm -q < rpm package name> 
 
6.得到被安装的包的信息 
# rpm -qi < rpm package name> 

7.列出该包中有哪些文件 
# rpm -ql < rpm package name> 

8.列出服务器上的一个文件属于哪一个RPM包
#rpm -qf 

9.可综合好几个参数一起用 
# rpm -qil < rpm package name> 

10.列出所有被安装的rpm package 
# rpm -qa 

11.列出一个未被安装进系统的RPM包文件中包含有哪些文件? 
# rpm -qilp < rpm package name>

find指令

find [OPTION]… [查找路径] [查找条件] [处理动作]

#Find all directories named src
find . -name src -type d
# Find all python files that have a folder named test in their path
find . -path '*/test/*.py' -type f
# Find all files modified in the last day
find . -mtime -1
# Find all zip files with size in range 500k to 10M
find . -size +500k -size -10M -name '*.tar.gz'

find . -name '*遥感*'

还可以通过exec来对查找到的文件进行操作

# Delete all files with .tmp extension
find . -name '*.tmp' -exec rm {} \;
# Find all PNG files and convert them to JPG
find . -name '*.png' -exec convert {} {}.jpg \;

-exec 参数后面跟的是command命令,它的终止是以;为结束标志的,所以这句命令后面的分号是不可缺少的,考虑到各个系统中分号会有不同的意义,所以前面加反斜杠

{} 花括号代表前面find查找出来的文件名

使用find时,只要把想要的操作写在一个文件里,就可以用exec来配合find查找,很方便的。在有些操作系统中只允许-exec选项执行诸如l s或ls -l这样的命令。大多数用户使用这一选项是为了查找旧文件并删除它们。建议在真正执行rm命令删除文件之前,最好先用ls命令看一下,确认它们是所要删除的文件。 exec选项后面跟随着所要执行的命令或脚本,然后是一对儿{ },一个空格和一个\,最后是一个分号。为了使用exec选项,必须要同时使用print选项。如果验证一下find命令,会发现该命令只输出从当前路径起的相对路径及文件名。

查找当前目录下的文件,并对查找结果执行ls -l 命令
find . -type f -exec ls -l {} \;
 直接删除
 find -type f -mtime -1 -exec rm {} \;
 
 查找当前目录下文件名以.log结尾且24小时内更改过的文件,并进行安全删除操作(即删除前会进行询问)
 find -name "*.log" -type f  -mtime -1 -ok rm {} \;
 
 查找当前目录下的以.log结尾的文件或目录,并移动到test目录下
 find -name "*.log" -exec mv {} test \;

还可以使用locate指令,非实时查找(数据库查找),查询系统上预建的文件索引数据库/var/lib/mlocate/mlocate.db

  • 查找速度快
  • 模糊查找
  • 非实时查找
  • 搜索的是文件的全路径,不仅仅是文件名
  • 可能只搜索用户具备读取和执行权限的目录

locate和find的区别

https://www.cnblogs.com/struggle-1216/p/12066969.html

history | grep find来查找command历史中的某种指令

ls指令详细参数

http://linux.51yip.com/search/ls

在shell脚本中调用另一个脚本

  1. fork方法 sh命令/点号.
sh test.sh
. test.sh

fork是最普通的, 就是直接在脚本里面用/directory/test.sh来调用script.sh这个脚本.

运行的时候开一个sub-shell执行调用的脚本,sub-shell执行的时候, parent-shell还在。

sub-shell执行完毕后返回parent-shell. sub-shell从parent-shell继承环境变量.但是sub-shell中的环境变量不会带回parent-shell

  1. source

与fork的区别是不新开一个sub-shell来执行被调用的脚本,而是在同一个shell中执行. 所以被调用的脚本中声明的变量和环境变量, 都可以在主脚本中得到和使用.

source test.sh
  1. exec

exec与fork不同,不需要新开一个sub-shell来执行被调用的脚本. 被调用的脚本与父脚本在同一个shell内执行。但是使用exec调用一个新脚本以后, 父脚本中exec行之后的内容就不会再执行了。这是exec和source的区别

压缩文件

打包成tar.gz格式压缩包

# tar -zcvf renwolesshel.tar.gz /renwolesshel

解压tar.gz格式压缩包

# tar zxvf renwolesshel.tar.gz

xargs

xargs(英文全拼: eXtended ARGuments)是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。

xargs 可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据。

xargs 也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。

管道实现的是将前面的stdout作为后面的stdin,但是有些命令不接受管道的传递方式,最常见的就是ls命令。有些时候命令希望管道传递的是参数,但是直接用管道有时无法传递到命令的参数位,这时候需要xargs,xargs实现的是将管道传输过来的stdin进行处理然后传递到命令的参数位上。也就是说xargs完成了两个行为:处理管道传输过来的stdin;将处理后的传递到正确的位置上。

[root@xuexi tmp]# echo "/etc/inittab" | cat   # 直接将标准输入的内容传递给cat
[root@xuexi tmp]# echo "/etc/inittab" | xargs cat   # 将标准输入的内容经过xargs处理后传递给cat

练习

第一题
#ls -ltrh
-rw-r--r--  1 jiarui  staff   134B  1 19 16:31 marco.sh
第二题
test_path="/Users/jiarui/Study"
marco(){
  test_path=$(pwd)
  echo $(pwd)
  echo $test_path
}

polo(){
  cd $test_path
}
第三题
ttime=0
while true
do
  sh function.sh >> res.txt
  #echo "the res is"
  #echo $?
  if [[ $? -eq 1 ]]
  then
    echo $ttime >> res.txt
    break
  fi
 let "ttime++"
done

需要注意的地方:while、if的用法,变量赋值的时候不能有空格,if的条件语句中,[]和条件之间要空格隔开,自增还可以使用{{ttime++}}

第四题
find . -name "*html" | xargs tar -zcvf b.tar.gz

Editors(Vim)

Movement

Basic movement: hjkl (left, down, up, right)
Words: w (next word), b (beginning of word), e (end of word)
Lines: 0 (beginning of line), ^ (first non-blank character), $ (end of line)
Screen: H (top of screen), M (middle of screen), L (bottom of screen)
Scroll: Ctrl-u (up), Ctrl-d (down)
File: gg (beginning of file), G (end of file)
Line numbers: :{number}<CR> or {number}G (line {number})
Misc: % (corresponding item)
Find: f{character}, t{character}, F{character}, T{character}
find/to forward/backward {character} on the current line
, / ; for navigating matches
Search: /{regex}, n / N for navigating matches

Command-line Environment

SIGINT

程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出,用于通知前台进程组终止进程。

SIGQUIT

和SIGINT类似, 但由QUIT字符(通常是Ctrl-)来控制. 进程在因收到SIGQUIT退出时会产生core文件, 在这个意义上类似于一个程序错误信号。

SIGTERM
程序结束(terminate)信号, 与SIGKILL不同的是该信号可以被阻塞和处理。通常用来要求程序自己正常退出,shell命令kill缺省产生这个信号。如果进程终止不了,我们才会尝试SIGKILL。

SIGSTOP(Ctrl-Z)
停止(stopped)进程的执行. 注意它和terminate以及interrupt的区别:该进程还未结束, 只是暂停执行. 本信号不能被阻塞, 处理或忽略

bg
将一个在后台暂停的命令,变成继续执行

fg
将后台中的命令调至前台继续运行

jobs
查看当前有多少在后台运行的命令

ctrl + z
可以将一个正在前台执行的命令放到后台,并且暂停

nohup 命令

用途:不挂断地运行命令

$ sleep 1000
^Z
[1]  + 18653 suspended  sleep 1000

$ nohup sleep 2000 &
[2] 18745
appending output to nohup.out

$ jobs
[1]  + suspended  sleep 1000
[2]  - running    nohup sleep 2000

$ bg %1
[1]  - 18653 continued  sleep 1000

$ jobs
[1]  - running    sleep 1000
[2]  + running    nohup sleep 2000

$ kill -STOP %1
[1]  + 18653 suspended (signal)  sleep 1000

$ jobs
[1]  + suspended (signal)  sleep 1000
[2]  - running    nohup sleep 2000

$ kill -SIGHUP %1
[1]  + 18653 hangup     sleep 1000

$ jobs
[2]  + running    nohup sleep 2000

$ kill -SIGHUP %2

$ jobs
[2]  + running    nohup sleep 2000

$ kill %2 (等同于-SIGTERM,正常终止)
[2]  + 18745 terminated  nohup sleep 2000

$ jobs

tmux可以管理窗口和会话

别名

点文件,用来配置信息

ssh

#查看job的id
ps aux | grep xxx

MetaPrograming

make

编译和链接

先将源文件编译成中间代码文件,再将大量的object file合成执行文件(链接)

安全与密码学

correcthorsebatterystaple” is more secure than one like “Tr0ub4dor&3”.

熵以比特来度量,当从一组可能的结果中随机选择时,熵等于log2(可能性#)。均匀抛硬币得到1比特的熵。掷一个骰子(六面骰子)有大约2.58位的熵

攻击者可能知道密码的模型,但是不知道选择特定密码的随机性(例如投骰子的结果),一个较为安全的密码应该40bit

哈希函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值