今天把之前收藏的一些 Linux Shell 的入门笔记分享下,希望能够帮助到大家。
Shell 知识体系 {#shell-zhi-shi-ti-xi}
-
(结构和功能)
-
存储:
mount
,unmount
(略) -
网络:
ping
,traceroute
,wget
,ssh
-
归档压缩:
gzip
,tar
,rsync
-
正则表达式:
grep
-
文本处理:
cat
,sort
,uniq
,diff
,sed
-
格式化输出:
fmt
,printf
-
打印机:(略)
-
编译:
make
-
$$
,$?
,$_
-
$PWD
,$SHELL
,$USER
,$HOME
,$HOSTNAME
-
$PATH
:环境变量 -
$PS1
:提示符 Prompt -
$PS4
:追踪调试set -x
,set +x
-
$RANDOM
-
echo
,exit
-
路径:
ls
,cd
,pwd
-
文件:
-
使用命令:
type
,which
,man
,info
,whatis
,help
,--help
,alias
-
权限:
id
,chmod
,chown
,chgrp
,umask
,su
,sudo
,passwd
-
进程:
ps
,top
,jobs
,bg
,fg
,kill
,killall
,shutdown
-
Shell 环境:
printenv
,set
,export
,source
-
文本编辑:
vi
,nano
-
Misc:
trap
,wait
,sleep
-
file
,less
,cat
-
cp
,mv
,mkdir
,rm
,ln
-
locate
,find
,touch
,stat
-
/
,/bin
,/usr/bin
,/dev
,/tmp
,/etc
,/opt
-
Linux 文件系统层次标准(基础目录结构)
-
一些内建命令 Builtin Commands
command -options arguments
-
一些内建变量 Shell Varibles
-
(更多内建命令)
-
-
键盘操作
-
less、man 等控制:
h
,?
,q
,/pattern
,n
,N
-
命令行光标:
Ctrl-u
,Ctrl-y
-
-
(命令行书写)
-
reset:
\033[0m
-
4-bit black:
\033[0;30m
-
foreground rgb:
\x1b[38;2;⟨r⟩;⟨g⟩;⟨b⟩m
-
background rgb:
\x1b[48;2;⟨r⟩;⟨g⟩;⟨b⟩m
-
移动光标并清除上一行:
echo "\033[1F\033[2K\c"
-
输出重定向:
echo 123 > a.log
,>>
,2>
,2>&1
,&>
-
管道 Pipelines:
ls /usr/bin | wxc -l
-
输入重定向:
python hello.py < foo.txt
-
xagrs
:把标准输入转化成参数列表 -
Here Documents:
<<
,<<-
,_EOF_
-
Here Strings:
<<<
,read -r -a Words <<< "This is a string of words."
-
路径展开:
echo *.txt
,ls ~username
-
算数表达式展开 Arithmetic Expansion:
echo $(( (2+3)*4 ))
-
花括号展开 Brace Expansion:
echo file_{A{1,2},B{1,2}}
,echo {0..z}
-
参数展开 Parameter Expansion:
-
命令替换 Command Substitution:
ls -l $(which env)
-
引号,转义 Escape:
echo "Hello $USER"
,echo '$USER'
,echo "\$5.00"
-
history:
!!
,!number
-
echo $USER
,echo $PWD
,echo ${USER}
-
值检查和替换:
echo ${var:-fallbackVal}
,echo ${var:=defaultVal}
,echo ${var:+successVal}
-
值检查和报错:
echo ${var:?errMsg}
-
子串:
echo ${parameter:offset:length}
-
替换:
echo ${parameter/pattern/replacer}
-
长度:
${#foo}
-
(更多展开和处理
${}
略) -
相对路径:
./
,../
-
绝对路径:
/usr/bin/env
-
cd -
,cd ~username
-
通配符 Wildcards:
*.txt
,Data???
,[abc]
,[!abc]
,[![:upper:]]
-
路径
-
展开 Expansion
-
标准输入输出,重定向 Redirection
-
控制编码 ANSI escape code
-
-
(执行)
-
-rwxr-xr-x
-
chmod +x ./file
,chmod 755 ./file
-
权限 Permissions
-
进程操控 Processes (略)
-
-
包管理
-
Debian:
apt
,dpkg
-
红帽:
dnf
,yum
,rpm
-
-
Shell Script
-
字符串
-
数字
-
数组
-
declare
,unset
-
(在展开中做各种处理)
-
+
,-
,*
,/
,**
,%
-
=
,+=
,++
,--
-
˜
,<<
,>>
,&
,|
,^
-
<
,>
,==
,!=
,&&
,||
-
expr1?expr2:expr3
-
数基/进制:
$((033))
,$((0x1b))
,$((2#11011))
-
(各种运算符)
-
计算器:
bc <<< "2+3"
-
arr[1]=val
,arr=(foo bar)
-
${arr[@]}
-
(数组展开类似字符串展开)
-
条件表达式 Conditional Expressions
-
if
,while
,continue
,break
,until
-
case
,;;
,;;&
-
for
,done
-
test expression
,[ expression ]
-
文件表达式、字符串表达式、整型表达式
-
字符串的扩展:
[[ str =~ regex ]]
,[[ $FILE == foo.* ]]
-
整数的扩展:
(( INT < 0 ))
-
逻辑操作符:
&&
,||
,!
-
function name {}
,name () {}
-
local
-
参数
-
退出状态 Exit Status:0-255
-
$0
,$1
,$2
,${99}
-
参数组:
$#
,shift
,$@
,$*
-
dotfiles, rc files
-
shebang:
#!/usr/bin/env bash
-
source
,.
:在当前 shell 环境执行脚本 -
#
:注释 -
: ""
:利用 true 写多行注释 -
misc
-
函数
-
控制流 Control Flow
-
read
,IFS
Internal Field Separator -
变量
-
-
Misc
-
read foo < <(echo "bar")
-
echo "bar" > >(read; echo "foo, $REPLY")
-
子 Shell Subshells
-
子进程替换 Process Substitution
-
代码片段 {#dai-ma-pian-duan}
proxy {#proxy}
自用,有时需要切换网络连通情况,来回修改 export ALL_PROXY
,所以写了一个脚本来简化流程。
因为一些 subshell 的问题,似乎不太能像其他高级语言一样只 export 一部分变量,
于是目前额外暴露出了_proxy_{set,unset}
两个函数,搜了一圈似乎没什么解决方法,就这样吧...
# https://everything.curl.dev/usingcurl/proxies/env# * ----------------------------------------------------------------_proxy_set() {
export ALL_PROXY=$1
export http_proxy=$1
export https_proxy=$1
export HTTP_PROXY=$1
export HTTPS_PROXY=$1}# * ----------------------------------------------------------------_proxy_unset() {
unset ALL_PROXY unset http_proxy unset https_proxy unset HTTP_PROXY unset HTTPS_PROXY}# * ----------------------------------------------------------------proxy() {
local localproxy='http://127.0.0.1:1080'
local deadproxy="http://a.deadlink/"
case "$1" in
boot | on)
_proxy_set $localproxy
;;
dead)
_proxy_set $deadproxy
;;
off)
_proxy_unset ;;
esac
if [[ $1 == 'boot' ]]; then
echo 'Proxy on'
elif [[ -n $ALL_PROXY ]]; then
echo "Proxy: $ALL_PROXY"
else
echo "Proxy off"
fi}# * ----------------------------------------------------------------proxy boot
ginit {#ginit}
自用,给当前目录快速初始化 git。
#!/bin/bash# * ----------------------------------------------------------------if [[ $(git rev-parse --is-inside-work-tree) ]]; then
echo "Already in a git repository"
exit 1fi# * ----------------------------------------------------------------git_commit_init() {
touch .gitignore git add .gitignore git commit -m "feat(init): initial commit"
git tag init}# * ----------------------------------------------------------------git initif [ -f .gitignore ]; then
TMP_FILE=$(mktemp)
mv .gitignore $TMP_FILE
git_commit_init mv $TMP_FILE .gitignoreelse
git_commit_initfi