Skip to content
  • Ctrl+Alt+F1~6 命令行
  • Ctrl+Alt+F7 图形, ABCDEFG(raph), G 是第 7 个字母。

学习 Linux 要有放弃图形的觉悟。

1 shells

/etc/shells 中记录了多种 shell ,登录时系统会丢出一个 shell 供用户工作,默认 bash 。

    /bin/sh
    /bin/bash
    /bin/ksh
    /bin/tcsh
    /bin/csh
    /bin/zsh

当用户获得该 shell 后, shell 成为一个独立的程序,拥有独一无二的 PID ,接下来下达的所有命令都是衍生的子程序。

太长的命令可以用 \[Enter] 进行逻辑换行。**注意 \ 必须紧接 [Enter] ,后面不能有空格。**本质是用反斜杠转义了回车。大小写敏感。

    $ cp /var/spool/mail/root /etc/crontab \
    > /etc/fstab /root

最快捷的计算器 bc 。

必须按两次 tab 才能显示备选项。

man 是 manual 操作说明的缩写。按 q 退出。

^ 代表的是 ctrl , M 代表的是 alt 。

2 变量

变量的配置守则

  1. 变量名称与变量内容用等号连接,等号两边没有空格
  2. 变量名称只能是字母或数字,但开头字符不能是数字。
  3. 当变量内容有空格时,用单引号或双引号将变量内容包起来。单引号只包纯字符串,而双引号可包变量。
  4. 特殊字符需要转义。
  5. 嵌套命令使用 cmd$(cmd)
  6. 若变量需要在其他子程序运行,则需要 export 使变量成为环境变量。
  7. 通过拼接可以扩充变量。
  8. 系统默认变量大写,自定义变量小写。
  9. 取消变量用 unset var

用 env 观察常见的环境变量。

  • HOME
  • SHELL
  • HISTSIZE
  • MAIL
  • PATH
  • LANG locale -a 查看所有语言。
  • RANDOM 生成 0~32767 之间的随机数。

输出 0~9 之间的随机数 declare -i number=$RANDOM*10/32768 ; echo $number

用 set 观察所有变量,数量庞大。

  • PS1
  • $
  • ? 上一条命令的返回结果。
  • OSTYPE, HOSTTYPE, MACHTYPE 机器信息。

变量键盘读取、数组与声明: read array declare 。

变量类型默认为字符串。若不指定变量类型,则 1+2 为一个字符串而不是表达式。

bash 环境中的数值运算,默认最多仅能到达整数形态,所以 1/3 结果是 0;

  • -a 将后面名为 variable 的变量定义成为数组 (array) 类型
  • -i 将后面名为 variable 的变量定义成为整数数字 (integer) 类型
  • -x 用法与 export 一样,就是将后面的 variable 变成环境变量;
  • -r 将变量配置成为 readonly 类型,该变量不可被更改内容,也不能 unset

var[index]=content 有点像 python 里的字典。

ulimit 限制用户所用资源。想要复原 ulimit 的配置最简单的方法就是注销再登陆,否则就是得要重新以 ulimit 配置才行!不过,要注意的是,一般身份使用者如果以 ulimit 配置了 -f 的文件大小, 那么他只能继续减小文件容量,不能添加文件容量了。

变量内容的删除、替换。

${变量#关键词} ${变量##关键词} 若变量内容从头开始的数据符合『关键词』,则将符合的最短数据删除 若变量内容从头开始的数据符合『关键词』,则将符合的最长数据删除 ${变量%关键词} ${变量%%关键词} 若变量内容从尾向前的数据符合『关键词』,则将符合的最短数据删除 若变量内容从尾向前的数据符合『关键词』,则将符合的最长数据删除 ${变量/旧字符串/新字符串} ${变量//旧字符串/新字符串} 若变量内容符合『旧字符串』则『第一个旧字符串会被新字符串取代』 若变量内容符合『旧字符串』则『全部的旧字符串会被新字符串取代』

上面这一段其实不是很理解。

变量配置方式 str 没有配置 str 为空字符串 str 已配置非为空字符串 var=${str-expr} var=expr var= var=$str var=${str:-expr} var=expr var=expr var=$str var=${str+expr} var= var=expr var=expr var=${str:+expr} var= var= var=expr var=${str=expr} str=expr var=expr str 不变 var= str 不变 var=$str var=${str:=expr} str=expr var=expr str=expr var=expr str 不变 var=$str var=${str?expr} expr 输出至 stderr var= var=$str var=${str:?expr} expr 输出至 stderr expr 输出至 stderr var=$str

3 命令别名与历史命令

alias, unalias

history 1000

4 bash shell 的操作环境

  • 以相对/绝对路径运行命令,例如『 /bin/ls 』或『 ./ls 』;
  • 由 alias 找到该命令来运行;
  • 由 bash 内建的 (builtin) 命令来运行;
  • 透过 $PATH 这个变量的顺序搜寻到的第一个命令来运行。

login shell:取得 bash 时需要完整的登陆流程的,就称为 login shell。举例来说,你要由 tty1 ~ tty6 登陆,需要输入用户的账号与密码,此时取得的 bash 就称为『 login shell 』啰;

non-login shell:取得 bash 接口的方法不需要重复登陆的举动,举例来说,(1)你以 X window 登陆 Linux 后, 再以 X 的图形化接口启动终端机,此时那个终端接口并没有需要再次的输入账号与密码,那个 bash 的环境就称为 non-login shell了。(2)你在原本的 bash 环境下再次下达 bash 这个命令,同样的也没有输入账号密码, 那第二个 bash (子程序) 也是 non-login shell 。

bash 默认组合键

Ctrl + C 终止目前的命令 Ctrl + D 输入结束 (EOF),例如邮件结束的时候; Ctrl + M 就是 Enter 啦! Ctrl + S 暂停屏幕的输出 Ctrl + Q 恢复屏幕的输出 Ctrl + U 在提示字符下,将整列命令删除 Ctrl + Z 『暂停』目前的命令

通配符与特殊符号

  • 代表『 0 个到无穷多个』任意字符 ? 代表『一定有一个』任意字符 [ ] 同样代表『一定有一个在括号内』的字符(非任意字符)。例如 [abcd] 代表『一定有一个字符, 可能是 a, b, c, d 这四个任何一个』 [ - ] 若有减号在中括号内时,代表『在编码顺序内的所有字符』。例如 [0-9] 代表 0 到 9 之间的所有数字,因为数字的语系编码是连续的! [^ ] 若中括号内的第一个字符为指数符号 (^) ,那表示『反向选择』,例如 [^abc] 代表 一定有一个字符,只要是非 a, b, c 的其他字符就接受的意思。

符号 内容

批注符号:这个最常被使用在 script 当中,视为说明!在后的数据均不运行

\ 跳脱符号:将『特殊字符或通配符』还原成一般字符 | 管线 (pipe):分隔两个管线命令的界定(后两节介绍); ; 连续命令下达分隔符:连续性命令的界定 (注意!与管线命令并不相同) ~ 用户的家目录 $ 取用变量前导符:亦即是变量之前需要加的变量取代值 & 工作控制 (job control):将命令变成背景下工作 ! 逻辑运算意义上的『非』 not 的意思! / 目录符号:路径分隔的符号 >, >> 数据流重导向:输出导向,分别是『取代』与『累加』 <, << 数据流重导向:输入导向 (这两个留待下节介绍) ' ' 单引号,不具有变量置换的功能 " " 具有变量置换的功能! 中间为可以先运行的命令,亦可使用 $( ) ( ) 在中间为子 shell 的起始与结束 { } 在中间为命令区块的组合!

5 数据流重定向

数据流重导向就是将某个命令运行后应该要出现在屏幕上的数据, 给他传输到其他的地方。

标准输入  (stdin) :代码为 0 ,使用 < 或 << ; 标准输出  (stdout):代码为 1 ,使用 > 或 >> ; 标准错误输出(stderr):代码为 2 ,使用 2> 或 2>> ;

1> :以覆盖的方法将『正确的数据』输出到指定的文件或装置上; 1>>:以累加的方法将『正确的数据』输出到指定的文件或装置上; 2> :以覆盖的方法将『错误的数据』输出到指定的文件或装置上; 2>>:以累加的方法将『错误的数据』输出到指定的文件或装置上;

『 1>> 』以及『 2>> 』中间是没有空格的!

/dev/null 垃圾桶黑洞装置与特殊写法

find /home -name .bashrc 2> /dev/null

find /home -name .bashrc > list 2>&1 <==正确

将原本需要由键盘输入的数据,改由文件内容来取代

他代表的是『结束的输入字符』的意思!举例来讲:『我要用 cat 直接将输入的信息输出到 catfile 中, 且当由键盘输入 eof 时,该次输入就结束』

屏幕输出的信息很重要,而且我们需要将他存下来的时候; 背景运行中的程序,不希望他干扰屏幕正常的输出结果时; 一些系统的例行命令 (例如写在 /etc/crontab 中的文件) 的运行结果,希望他可以存下来时; 一些运行命令的可能已知错误信息时,想以『 2> /dev/null 』将他丢掉时; 错误信息与正确信息需要分别输出时。

  • cmd ; cmd (不考虑命令相关性的连续命令下达)
  • $? (命令回传值) 与 && 或 ||

6 管线命令

管线命令 | 接收前一个命令的 standard output ( standard error output 会被忽略),作为后一个命令的 standard input 来处理。

  • cut 命令用于从行

撷取命令: cut, grep 撷取信息通常是针对『一行一行』来分析的

uniq 重复的行删除掉只显示一个

wc word count

双向重导向: tee

    ls -l / | tee -a ~/homefile | more

字符转换命令: tr, col, join, paste, expand

col 简单的处理将 [tab] 按键取代成为空格键

join 类似数据表关联

paste 将两行贴在一起,且中间以 [tab] 键隔开。 一行对一行。

expand [-t] file 选项与参数: -t :后面可以接数字。一般来说,一个 tab 按键可以用 8 个空格键取代。 我们也可以自行定义一个 [tab] 按键代表多少个字符呢!

expand -t 6 -

tar -cvf - /home | tar -xvf -

上面这个例子是说:『我将 /home 里面的文件给他打包,但打包的数据不是纪录到文件,而是传送到 stdout; 经过管线后,将 tar -cvf - /home 传送给后面的 tar -xvf - 』。后面的这个 - 则是取用前一个命令的 stdout, 因此,我们就不需要使用 file 了!这是很常见的例子喔!注意注意!

如果你有文件太大,导致一些携带式装置无法复制的问题,嘿嘿!找 split 就对了! 他可以帮你将一个大文件,依据文件大小或行数来分割,就可以将大文件分割成为小文件了! 快速又有效啊!真不错~

参数代换: xargs 这个玩意儿就是在产生某个命令的参数的意思

Proudly powered by VitePress