
今天把之前收藏的一些 Linux Shell 的入门笔记分享下,希望能够帮助到大家。
Shell 知识体系
(结构和功能)
存储:
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$RANDOMecho,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,shutdownShell 环境:
printenv,set,export,source文本编辑:
vi,nanoMisc:
trap,wait,sleepfile,less,catcp,mv,mkdir,rm,lnlocate,find,touch,stat/,/bin,/usr/bin,/dev,/tmp,/etc,/optLinux 文件系统层次标准(基础目录结构)
一些内建命令 Builtin Commands
command -options arguments一些内建变量 Shell Varibles
(更多内建命令)
键盘操作
less、man 等控制:
h,?,q,/pattern,n,N命令行光标:
Ctrl-u,Ctrl-y(命令行书写)
reset:
\033[0m4-bit black:
\033[0;30mforeground rgb:
\x1b[38;2;⟨r⟩;⟨g⟩;⟨b⟩mbackground 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.txtxagrs:把标准输入转化成参数列表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:
!!,!numberecho $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/envcd -,cd ~username通配符 Wildcards:
*.txt,Data???,[abc],[!abc],[![:upper:]]路径
展开 Expansion
标准输入输出,重定向 Redirection
控制编码 ANSI escape code
(执行)
-rwxr-xr-xchmod +x ./file,chmod 755 ./file权限 Permissions
进程操控 Processes (略)
包管理
Debian:
apt,dpkg红帽:
dnf,yum,rpmShell 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,untilcase,;;,;;&for,donetest 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 bashsource,.:在当前 shell 环境执行脚本#:注释: "":利用 true 写多行注释misc
函数
控制流 Control Flow
read,IFSInternal Field Separator变量
Misc
read foo < <(echo "bar")echo "bar" > >(read; echo "foo, $REPLY")子 Shell Subshells
子进程替换 Process Substitution
代码片段
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 bootginit
自用,给当前目录快速初始化 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







网友评论文明上网理性发言 已有0人参与
发表评论: