About

  • homepage;
  • lecture video;
  • 2020年初始刚放出的公开课,十分实用,千呼万唤始出来。主要是介绍一些CS领域常用的工具和技巧,这些对于平时科研,工作都有很大的帮助。正如在课程介绍和评论中说的,"It’s not computer science. It is computer literacy."
  • 相关资源:阮一峰老师的bash脚本教程

Lecture 1. Course overview + the shell

官方讲义比较系统和简练,其中包含一些练习题。

date #显示时间
# echo 后面跟上要输出的文本
echo Hello
echo "Hello World"
echo Hello\ World
echo $PATH
which echo
#讲解绝对路径和相对路径
pwd # print working diretory
cd # change working path
cd .. #进入当前目录上一目录
# 讲解输入代码要注意相对路径和绝对路径

ls #当前路径下的文件
ls .. # 当前路径前一层的文件夹下的文件
cd ~ # 返回/home/username/
cd - #往返当前和上一个文件夹路径
# 讲解 - 加在某个命令后增加argument

ls -l # 显示更加详细的文件信息,比如read, write, excute(对该文件或文件夹执行命令)

# mv 文件名 文件名 将源文件名改为目标文件名
# mv 文件名 目录名 将文件移动到目标目录
# mv 目录名 目录名 目标目录已存在,将源目录移动到目标目录;目标目录不存在则改名
# mv 目录名 文件名 出错
mv filename1 filename2
cp source dest #复制文或目录
rm filename #删除文件或目录,不可恢复的操作
rmdir # 删除空目录,但无法删除非空目录
mkdir # 新建目录
man ls #manual, 功能类似-help,但是更便于阅读,按q退出
# CTRL + l清除面板记录

在终端有个输入流input stream和输出流output stream,一般输出流就是执行输入的命令,打印在终端上,但是而可以通过< 和 >符号对input stream和output stream进行指定

echo hello > hello.txt # 把文本hello存储在hello.txt中
cat hello.txt or cat < hello.txt # 显示file 内容
cat < hello.txt > hello2.txt # 复制内容到hello2.txt中,而且是从头覆写
cat < hello.txt >> hello2.txt # append, 接着后面写

ls -l | tail -n1 >ls.txt # 显示最后一行并写入ls.txt
# | 管道命令,是指 | 的左边运行结果 是|右边的 输入条件或者范围
sudo su # 加入root权限,后续命令都以super user执行,exit命令推出
cd sys # 进入系统设备,可以查看一些参数
# 进入之后如果想改变某些系统参数,但是又没有使用sudo su,可以使用tee命令
# tee命令用于读取标准输入的数据,并将其内容输出成文件
# 下面的命令不仅改变了brightness亮度值,还打印出结果在终端
echo 1060 | sudo tee brightness

xdg-open filename #以默认程序打开文件

Shell Tools and Scripting

官方笔记

foo=bar
echo foo
# 失效
foo = bar
# echo单引号和双引号的区别
echo "value is $ foo" # value is bar
echo 'value is $foo' # value is $foo
echo "we are in $(pwd)"

.sh中的$

# creates a directory and cds into it.
mcd () {
mkdir -p "$1"
cd "$1"
}
  • $0 - Name of the script
  • $1 to $9 - Arguments to the script. $1 is the first argument and so on.
  • $@ - All the arguments
  • $# - Number of arguments
  • $? - Return code of the previous command(上一次的错误代码,echo $?,返回值为0代表正确)
  • 2$ -Process Identification number for the current script (两个美元一起,把’2’换成’$’,我这里显示有问题)
  • !! - Entire last command, including arguments. A common pattern is to execute a command only for it to fail due to missing permissions, then you can quickly execute it with sudo by doing sudo !!
  • $_ - Last argument from the last command. If you are in an interactive shell, you can also quickly get this value by typing Esc followed by .

grep命令用于查找文件里符合条件的字符串,grep foobar mcd.sh

true
echo $? # 0
false
echo $? #1

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"
#

false ; echo "This will always run"
# This will always run,分号代表两个不关联的语句

example.sh,查找指定的arguments代表的文件中是否有“foobar”这个字符串,没有就加上

#!/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
ls *.py #打印所有含有.py的文件名
ls project? #打印所有"project"后加一个字符的文件名
convert image.png image.jpg
conert image.{png,jpg} #大括号有笛卡儿积的作用
touch foo/x bar/y #touch更改文件时间属性,没有则创建
diff <(ls foo) <(ls bar) #比较两个文件夹的不同

#!/usr/bin/env python加在第一句可以将python按照./file.py执行,提供了解释器的环境路径

利用shellcheck检查bash脚本错误

几个shell tools:

  • 利用tldr简化命令的使用教程,可代替man命令

  • find命令

# 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'

# 还可以找到特定的文件然后执行命令
# 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 \;

另有根据数据库查找的locate命令,更新数据库updatedb

  • 利用rg等代替grep查找代码中的特定语句
# Find all python files where I used the requests library
rg -t py 'import requests'
# Find all files (including hidden files) without a shebang line
rg -u --files-without-match "^#!"
# Find all matches of foo and print the following 5 lines
rg foo -A 5
# Print statistics of matches (# of matched lines and files )
rg --stats PATTERN
  • history,history | grep find, CTRL+R交互搜索命令,推荐fzf

  • 文件导航,推荐broot