linux 命令行

(windows10) ubuntu config --default-user root 指定子系統的登錄賬號
(windows10) wsl 進入子系統

命令&權限

  • 快捷鍵
按鍵 行動
Ctrl-a 移動光標到行首。
Ctrl-e 移動光標到行尾。
Ctrl-k 剪切從光標位置到行尾的文本。
Ctrl-u 剪切從光標位置到行首的文本。
Ctrl-y 把剪切環中的文本粘貼到光標位置。
Ctrl-l 清空屏幕,移動光標到左上角。clear 命令完成同樣的工作。
Alt-f 光標前移一個字。
Alt-b 光標后移一個字。
Alt-l 把從光標位置到字尾的字符轉換成小寫字母。
Alt-u 把從光標位置到字尾的字符轉換成大寫字母。
  • 通配符

接受文件名作為參數的命令,支持下列通配符

字符類 意義
* 匹配任意多個字符(包括零個或一個)
? 匹配任意一個字符(不包括零個)
[characters] 匹配任意一個屬于字符集中的字符
[!characters] 匹配任意一個不是字符集中的字符
[:lower:] 匹配任意一個小寫字母
[:upper] 匹配任意一個大寫字母
---- ----
* 所有文件
g* 文件名以“g”開頭的文件
b*.txt 以”b” 開頭,中間有零個或任意多個字符,并以”.txt” 結尾的文件
Data??? 以“Data”開頭,其后緊接著 3 個字符的文件
[abc]* 文件名以”a”,”b”, 或”c” 開頭的文件
B.[0-9][0-9][0-9] 以”B.” 開頭,并緊接著 3 個數字的文件
[[:upper:]]* 以大寫字母開頭的文件
[![:digit:]]* 不以數字開頭的文件
*[[:lower:]123] 文件名以小寫字母結尾,或以“1”,“2”,或“3”結尾的文件
  • 創建軟連接
    ln -s src link
    當源文件被刪除時,軟鏈接失效,而硬鏈接還可以繼續用來訪問源文件。去掉[-s] 參數可創建硬鏈接。

  • 查看命令類型
    type ls

命令有四種類型:
1. 是一個可執行程序,就像我們所看到的位于目錄/usr/bin 中的文件一樣。屬于這一類的程序,可以編譯成二進制文件,諸如用 C 和 C++ 語言寫成的程序, 也可以是由腳本語言寫成的程序,比如說 shell,perl,python,ruby,等等。
2. 是一個內建于 shell 自身的命令。bash 支持若干命令,內部叫做 shell 內部命令(builtins)。例如,cd 命令,就是一個 shell 內部命令。
3. 是一個 shell 函數。這些是小規模的 shell 腳本,它們混合到環境變量中。在后續的章節里,我們將討論配置環境變量以及書寫 shell 函數。但是現在,僅僅意識到它們的存在就可以了。
4. 是一個命令別名。我們可以定義自己的命令,建立在其它命令之上。
  • 別名命令
    alias m='mkdir m' 創建
    unalias m 刪除

  • 重定向
    ls -al aa 1>>ls-output.txt 2>&1
    ls -al aa &>>ls-output.txt(等價)
    將標準輸入重定向至文件,標準錯誤重定向至標準輸出(即文件)
    2> /dev/null 隱藏標準錯誤

  • 顯示文件
    tail -f /var/log/messages 實時顯示最后10行,這個文件是記錄系統的一舉一動

  • 歷史記錄
    history | grep mv
    !88 歷史記錄展開,再次鍵入該條歷史記錄

  • 文件類型

屬性 文件類型
- 一個普通文件
d 一個目錄
l 一個符號鏈接。注意對于符號鏈接文件,剩余的文件屬性總是”rwxrwxrwx”,而且都是虛擬值。真正的文件屬性是指符號鏈接所指向的文件的屬性。
c 一個字符設備文件。這種文件類型是指按照字節流,來處理數據的設備。比如說終端機,或者調制解調器
b 一個塊設備文件。這種文件類型是指按照數據塊,來處理數據的設備,例如一個硬盤,或者 CD-ROM 盤。
  • 文件權限
    chmod u+x,go=rw 1.txt 給文件擁有者執行權限并給組和其他人讀和執行的
    權限。多種設定可以用逗號分開。
    chown [owner][:[group]] 1.txt 更改文件或目錄的所有者和用戶組

  • 添加用戶
    adduser unual 創建用戶
    passwd unual 修改用戶的密碼

進程

  • 查看進程快照信息
    ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 8324 152 ? Ss 21:38 0:00 /init
root 3 0.0 0.0 8328 156 tty1 Ss 21:38 0:00 /init
unual 4 0.0 0.0 16892 3428 tty1 S 21:38 0:00 -bash
unual 21 0.0 0.0 17380 1920 tty1 R 21:43 0:00 ps aux
字段 含義
USER 用戶 ID. 進程的所有者。
%CPU 以百分比表示的 CPU 使用率
%MEM 以百分比表示的內存使用率
VSZ 虛擬內存大小
RSS 進程占用的物理內存的大小,以千字節為單位。
START 進程運行的起始時間。若超過 24 小時,則用天表示。
STAT字段 含義
R 運行。這意味著,進程正在運行或準備運行。
S 正在睡眠。進程沒有運行,而是,正在等待一個事件,比如說,一個按鍵或者網絡數據包。
D 不可中斷睡眠。進程正在等待 I/O,比方說,一個磁盤驅動器的 I/O。
T 已停止. 已經指示進程停止運行。稍后介紹更多。
Z 一個死進程或“僵尸”進程。這是一個已經終止的子進程,但是它的父進程還沒有清空它。(父進程沒有把子進程從進程表中刪除)
< 一個高優先級進程。這可能會授予一個進程更多重要的資源,給它更多的 CPU 時間。進程的這種屬性叫做 niceness。具有高優先級的進程據說是不好的(less nice),因為它占用了比較多的 CPU 時間,這樣就給其它進程留下很少時間。
N 低優先級進程。一個低優先級進程(一個“好”進程)只有當其它高優先級進程執行之后,才會得到處理器時間。
  • 查看計算機運行狀態和進程
    top
top - 21:56:19 up 17 min,  0 users,  load average: 0.52, 0.58, 0.59
Tasks:   4 total,   1 running,   3 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.2 us,  1.1 sy,  0.0 ni, 98.5 id,  0.0 wa,  0.2 hi,  0.0 si,  0.0 st
KiB Mem :  8295652 total,  5215984 free,  2850316 used,   229352 buff/cache
KiB Swap: 25165824 total, 25150436 free,    15388 used.  5311604 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
   22 unual     20   0   17620   2036   1504 R   0.3  0.0   0:00.07 top
    1 root      20   0    8324    152    128 S   0.0  0.0   0:00.06 init
    3 root      20   0    8328    156    120 S   0.0  0.0   0:00.00 init
    4 unual     20   0   16892   3428   3324 S   0.0  0.0   0:00.06 bash
行號 字段 含義
1 top 程序名。
21:56:19 當前時間。
up 17min 這是正常運行時間。它是計算機從上次啟動到現在所運行的時間。在這個例子里,系統已經運行了17分鐘。
load average:0.52, 0.58, 0.59 加載平均值是指,等待運行的進程數目,也就是說,處于運行狀態的進程個數,這些進程共享 CPU。展示了三個數值,每個數值對應不同的時間周期。第一個是前 60 秒的平均值,下一個是前 5 分鐘的平均值,最后一個是前 15 分鐘的平均值。若平均值低于 1.0,則指示計算機工作不忙碌。
2 Tasks: 總結了進程數目和各種進程狀態。
3 Cpu(s): 這一行描述了 CPU 正在執行的進程的特性。
0.2us 0.2% of the CPU is being used for user processes. 這意味著進程在內核之外。
1.1sy 1.1% 的 CPU 時間被用于系統(內核)進程。
0.0ni 0.0% 的 CPU 時間被用于”nice”(低優先級)進程。
98.5id 98.5% 的 CPU 時間是空閑的。
0.0wa 0.0% 的 CPU 時間來等待 I/O。
4 Mem: 展示物理內存的使用情況。
5 Swap: 展示交換分區(虛擬內存)的使用情況。
  • 后臺任務
    xlogo &

  • 以列出從終端中啟動的任務
    jobs
    [1]+ Running xlogo &

  • 將后臺任務返回前臺
    fg %1

  • 暫停任務
    ctrl + z

  • 將任務移到后臺
    bg %1

  • 通過 kill 命令給進程發送信號
    kill [-signal] PID

編號 名字 含義
1 HUP 掛起。這是美好往昔的痕跡,那時候終端機通過電話線和調制解調器連接到遠端的計算機。這個信號被用來告訴程序,控制的終端機已經“掛起”。通過關閉一個終端會話,可以說明這個信號的作用。發送這個信號到終端機上的前臺程序,程序會終止。許多守護進程也使用這個信號,來重新初始化。這意味著,當發送這個信號到一個守護進程后,這個進程會重新啟動,并且重新讀取它的配置文件。Apache 網絡服務器守護進程就是一個例子。
2 INT 中斷。實現和 Ctrl-c 一樣的功能,由終端發送。通常,它會終止一個程序。
9 KILL 殺死。這個信號很特別。鑒于進程可能會選擇不同的方式,來處理發送給它的信號,其中也包含忽略信號,這樣呢,從不發送 Kill 信號到目標進程。而是內核立即終止這個進程。當一個進程以這種方式終止的時候,它沒有機會去做些“清理”工作,或者是保存勞動成果。因為這個原因,把 KILL 信號看作殺手锏,當其它終止信號失敗后,再使用它。
15 TERM 終止。這是 kill 命令發送的默認信號。如果程序仍然“活著”,可以接受信號,那么這個程序將終止。
18 CONT 繼續。在停止一段時間后,進程恢復運行。
19 STOP 停止。這個信號導致進程停止運行,而沒有終止。像KILL 信號,它不被發送到目標進程,因此它不能被忽略。

eg: kill -9 108
[1] Killed top

  • 樹型結構的進程列表
    pstree

  • 系統資源使用快照
    vmstat
    輸出一個系統資源使用快照,包括內存,交換分區和磁盤I/O。為了看到連續的顯示結果,則在命令名后加上延時的時間(以秒為單位)。例如,“vmstat 5”。終止輸出,按下Ctrl-c 組合鍵。

SHELL

  • shell環境變量
    登錄 shell 會話會提示用戶輸入用戶名和密碼;例如,我們啟動一個虛擬控制臺會話。當我們在 GUI 模式下運行終端會話時,非登錄 shell 會話會出現。
類別 文件 內容
登錄shell /etc/profile 應用于所有用戶的全局配置腳本。
?/.bash_profile 用戶私人的啟動文件。可以用來擴展或重寫全局配置腳本中的設置。
?/.bash_login 如果文件 ?/.bash profile 沒有找到,bash 會嘗試讀取這個腳本。
?/.profile 如果文件 ?/.bash profile 或文件 ?/.bash login 都沒有找到,bash 會試圖讀取這個文件。這是基于 Debian 發行版的默認設置,比方說 Ubuntu。
非登錄shell /etc/bash.bashrc 應用于所有用戶的全局配置文件。
?/.bashrc 用戶私有的啟動文件。可以用來擴展或重寫全局配置腳本中的設置。
  1. 登錄shell:/etc/profile -> (~/.bash_profile | ~/.bash_login | ~/.profile) ->( ~/.bashrc -> /etc/bashrc) -> ~/.bash_logout

    1. profile(由Bourne Shell和Korn Shell使用)和.bash_login(由C Shell使用)兩個文件是.bash_profile的同義詞,目的是為了兼容其它Shell
    2. bash_profile中一般會執行.bashrc
  2. 交互式非登陸shell: ~/.bashrc -> /etc/bashrc

在普通用戶看來,文件 ~/.bashrc 可能是最重要的啟動文件,因為它幾乎總是被讀取。

VI編輯器

按鍵 移動光標
l or 右箭頭 向右移動一個字符
h or 左箭頭 向左移動一個字符
j or 下箭頭 向下移動一行
k or 上箭頭 向上移動一行
0 (零按鍵) 移動到當前行的行首。
? 移動到當前行的第一個非空字符。
$ 移動到當前行的末尾。
w 移動到下一個單詞或標點符號的開頭。
W 移動到下一個單詞的開頭,忽略標點符號。
b 移動到上一個單詞或標點符號的開頭。
B 移動到上一個單詞的開頭,忽略標點符號。
Ctrl-f or Page Down 向下翻一頁
Ctrl-b or Page Up 向上翻一頁
nG 移動到第 n行。例如,1G 移動到文件的第一行。
G 移動到文件末尾。
按鍵 效果
a 當前光標后插入
A 當前行末尾插入
o 當前行的下方打開一行,進入編輯模式
O 當前行的上方打開一行,進入編輯模式
- -
x 刪除當前字符
3x 刪除當前字符及其后的兩個字符。
dd 刪除當前行。
5dd 刪除當前行及隨后的四行文本。
dW 刪除從光標位置開始到下一個單詞的開頭。
d$ 刪除從光標位置開始到當前行的行尾。
d0 刪除從光標位置開始到當前行的行首。
d? 刪除從光標位置開始到文本行的第一個非空字符。
dG 刪除從當前行到文件的末尾。
d20G 刪除從當前行到文件的第 20 行。
- -
yy 復制當前行。
5yy 復制當前行及隨后的四行文本。
yW 復制從當前光標位置到下一個單詞的開頭。
y$ 復制從當前光標位置到當前行的末尾。
y0 復制從當前光標位置到行首。
y? 復制從當前光標位置到文本行的第一個非空字符。
yG 復制從當前行到文件末尾。
y20G 復制從當前行到文件的第 20 行。
p 在下方新開一行,粘貼復制內容
P 在上方新開一行,粘貼復制內容
J 將下一行拼接到當前行末尾
u 撤銷之前的修改
fx 移動光標到當前行下一個x的字符上
- -
/word 查找word,n查找下一個
- -
:%s/Line/line/gc
: 冒號字符運行一個 ex 命令。
% 指定要操作的行數。% 是一個快捷方式,表示從一行到最后一行。另外,操作范圍也可以用 1,5 來代替(因為我們的文件只有 5 行文本),或者用 1,$ 來代替,意是“從第一行到文件的最后一行。”如果省略了文本行的范圍,那么操作只對當前行生效。
s 指定操作。在這種情況下是,替換(查找與替代)。
/Line/line 查找類型與替代文本。
g 這是“全局”的意思,意味著對文本行中所有匹配的字符串執行查找和替換操作。如果省略 g,則只替換每個文本行中第一個匹配的字符串。
c 需要用戶確認每一個替換
:r file1.txt 復制整個file1.txt到當前文件

vi file1.txt file2.txt
可以同時編輯兩個文件,通過:n/:N切換顯示文件

  • 命令提示符
    PS1 環境變量定義了命令提示符的格式,默認為[\u@\h \W]$
符號 顯示值
\a 以 ASCII 格式編碼的鈴聲. 當遇到這個轉義序列時,計算機會發出嗡嗡的響聲。
\d 以日,月,天格式來表示當前日期。例如,“Mon May 26.”
\h 本地機的主機名,但不帶末尾的域名。
\H 完整的主機名。
\j 運行在當前 shell 會話中的工作數。
\l 當前終端設備名。
\n 一個換行符。
\r 一個回車符。
\s shell 程序名。
\t 以 24 小時制,hours:minutes:seconds 的格式表示當前時間.
\T 以 12 小時制表示當前時間。
@ 以 12 小時制,AM/PM 格式來表示當前時間。
\A 以 24 小時制,hours:minutes 格式表示當前時間。
\u 當前用戶名。
\v shell 程序的版本號。
\V Version and release numbers of the shell.
\w 當前工作目錄名。
\W 當前工作目錄名的最后部分。
! 當前命令的歷史號。
# 當前 shell 會話中的命令數。
$ 這會顯示一個”$” 字符,除非你擁有超級用戶權限。在那種情況下,它會顯示一個”#” 字符。
[ 標志著一系列一個或多個非打印字符的開始。這被用來嵌入非打印的控制字符,這些字符以某種方式來操作終端仿真器,比方說移動光標或者是更改文本顏色。
] 標志著非打印字符序列結束。
  • 包管理工具
發行版 底層工具 上層工具
Debian-Style dpkg apt-get, aptitude
Fedora, Red Hat Enterprise Linux, CentOS rpm yum
風格 命令 含義
Debian apt-get update; apt-get install package_name 安裝
Debian dpkg --install package_file 安裝.deb
Debian apt-get remove package_name 卸載
Debian apt-get update; apt-get upgrade 更新全部軟件
Debian dpkg --install package_file .deb更新
Debian dpkg --list 列出所安裝的軟件包
Debian dpkg --status package_name 是否安裝
Debian apt-cache show package_name 顯示安裝包的信息
Debian dpkg --search file_name 查看某個文件是誰安裝
Red Hat yum install package_name 安裝
Red Hat rpm -i package_file 安裝.rpm
Red Hat yum erase package_name 卸載
Red Hat yum update 更新全部軟件
Red Hat rpm -U package_file .rpm更新
Red Hat rpm -qa 列出所安裝的軟件包
Red Hat rpm -q package_name 是否安裝
Red Hat yum info package_name 顯示安裝包的信息
Red Hat rpm -qf file_name 查看某個文件是誰安裝
  • 網絡命令
    ping linuxcommand.org
    traceroute(tracepath) slashdot.org
    netstat -ie 查看系統中的網絡接口
    netstat -r 顯示內核的網絡路由表

  • ssh軟件包
    ssh user@ssh_server 登錄
    ssh remote-sys 'ls *' > dirlist.txt 執行單個命令
    scp remote-sys:document.txt . 復制文件

  • 查找文件

find ~ -type f -name "*.JPG" -size +1M | wc -l

文件類型 描述
b 塊設備文件
c 字符設備文件
d 目錄
f 普通文件
l 符號鏈接

壓縮和歸檔
gzip foo.txt
gunzip foo.txt.gz

tar cf playground.tar playground
tar xf playground.tar

zip -r playground.zip playground 打包
unzip playground.zip 解壓

  • 同步
    rsync options source destination
    這里 source 和 destination 是下列選項之一,兩者之一必須是本地文件:
    ? 一個本地文件或目錄
    ? 一個遠端文件或目錄,以 [user@]host:path 的形式存在
    ? 一個遠端 rsync 服務器,由 rsync://[user@]host[:port]/path 指定
    ? rsync unual@192.168.2.140:~/Desktop/1.txt /mnt/c/unual/code/1.txt 遠程文件復制到本地
    ? rsync /mnt/c/unual/code/linux.pdf unual@192.168.2.140:~ 本地文件復制到遠程

備份別名
alias backup='sudo rsync -av --delete /etc /home /usr/local /media/BigDisk/backup'

sudo rsync -av --delete --rsh=ssh /etc /home /usr/local remote-sys:/backup 本地備份到遠程主機
rsync -av -delete rsync://rsync.gtlib.gatech.edu/fedora-linux-core/development/i386/os fedora-devel 從遠程服務獲取更新

  • grep (global regular expression print)
    grep [options] regex [file...]
選項 描述
-i 忽略大小寫。不會區分大小寫字符。也可用 --ignore-case 來指定。
-v 不匹配。通常,grep 程序會打印包含匹配項的文本行。這個選項導致 grep 程序只會不包含匹配項的文本行。也可用--invert-match 來指定。
-c 打印匹配的數量(或者是不匹配的數目,若指定了 -v 選項),而不是文本行本身。也可用 --count 選項來指定。
-l 打印包含匹配項的文件名,而不是文本行本身,也可用--files-with-matches 選項來指定。
-L 相似于 -l 選項,但是只是打印不包含匹配項的文件名。也可用 --files-without-match 來指定。
-n 在每個匹配行之前打印出其位于文件中的相應行號。也可用--line-number 選項來指定。
-h 應用于多文件搜索,不輸出文件名。也可用 --no-filename選項來指定。

grep bzip dirlist*.txt
多文件搜索,從一批文件的內容之中,查找匹配字符串

  • 正則表達式
    ^ $ . [ ] { } - ? * + ( ) | \
符號 用法
^ 行首匹配 (額外,和[]配合表示否定,[^bg]表示不包含b或者g)
$ 行尾匹配
. 用來匹配任意字符
[] 從一個指定的字符集合中匹配一個單個的字符
- 連接符,或表示一個范圍,A-Z表示大寫字母
| 表示或,grep需要使用-E選項,或者在表達式中使用轉義
( ) 隔離作用
? 可有可無,表示匹配0次或者1次
* 匹配零個或多個元素
+ 類似*,但要求至少匹配一次
{n} 匹配n次
  1. grep -h '[^bg]zip' dirlist*.txt
    匹配zip三個字符前一個并非b/g字符
  2. grep -h '^[A-Za-z0-9]' dirlist*.txt
    匹配字符或數字開頭
  3. grep -Eh '^(bz|gz|zip)' dirlist*.txt
    匹配以“bz”,或“gz”,或“zip”開頭的文件名
  4. grep -E '^([[:alpha:]]+ ?)+$'
    匹配一個或多個字母開頭,可以跟隨一個空格,可重復多次。
  5. ^(?[0-9]{3})? [0-9]{3}-[0-9]{4}$
    匹配電話號碼
  6. find . -regex '.[^-_./0-9a-zA-Z].'
    find是精確匹配,要求路徑名全匹配
  • sort
選項 長選項 描述
-b --ignore-leading-blanks 默認情況下,對整行進行排序,從每行的第一個字符開始。這個選項導致 sort 程序忽略每行開頭的空格,從第一個非空白字符開始排序。
-f --ignore-case 讓排序不區分大小寫。
-n --numeric-sort 基于字符串的長度來排序。使用此選項允許根據數字值執行排序,而不是字母值。
-r --reverse 按相反順序排序。結果按照降序排列,而不是升序。
-k --key=field1[,field2] 對從 field1 到 field2 之間的字符排序,而不是整個文本行。看下面的討論。
-m --merge 把每個參數看作是一個預先排好序的文件。把多個文件合并成一個排好序的文件,而沒有執行額外的排序。
-o --output=file 把排好序的輸出結果發送到文件,而不是標準輸出。
-t --field-separator=char 定義域分隔字符。默認情況下,域由空格或制表符分隔。
  1. ls -al /usr/bin | sort -nr -k 5 | head
  2. sort --key=1,1 --key=2n distros.txt
    指定了 1,1,意味著“始于并且結束于第一個字段。”在第二個實例中,我們指定了 2n,意味著第二個字段是排序的鍵值,并且按照數值排序。
  • cut
選項 說明
-c char list從文本行中抽取由 char list 定義的文本。這個列表可能由一個或多個逗號分隔開的數值區間組成。
-f field list從文本行中抽取一個或多個由 field list 定義的字段。這個列表可能包括一個或多個字段,或由逗號分隔開的字段區間。
-d delim char當指定 -f 選項之后,使用 delim char 做為字段分隔符。默認情況下,字段之間必須由單個 tab 字符分隔開。
--complement 抽取整個文本行,除了那些由 -c 和/或 -f 選項指定的文本。
  1. cut -d ':' -f 1 /etc/passwd
    查看所有賬號

shell 腳本

  • $?
    查看shell命令退出狀態

  • 流程控制:
    1.if 分支結構

if commands; then commands
[elif commands; then commands...]
[else commands]
fi

2.while

 while commands; do commands; done

3.until

和while區別為,until滿足條件,退出循環
until commands; do commands; done

4.case

case word in
    [pattern [| pattern]...) commands ;;]...
esac

5.for

for variable [in words]; do
    commands
done
省略掉 for 命令的可選項 words 部分,for 命令會默認處理位置參數
  • 計算文件狀態:
表達式 如果為真
file1 -ef file2 file1 和 file2 擁有相同的索引號(通過硬鏈接兩個文件名指向相同的文件)。
file1 -nt file2 file1 新于 file2。
file1 -ot file2 file1 早于 file2。
-b file file存在并且是一個塊(設備)文件。
-c file file存在并且是一個字符(設備)文件。
-d file file存在并且是一個目錄。
-e file file存在。
-f file file存在并且是一個普通文件。
-g file file存在并且設置了組 ID。
-G file file存在并且由有效組 ID 擁有。
-k file file存在并且設置了它的“sticky bit”。
-L file file存在并且是一個符號鏈接。
-O file file存在并且由有效用戶 ID 擁有。
-p file file存在并且是一個命名管道。
-r file file存在并且可讀(有效用戶有可讀權限)。
-s file file存在且其長度大于零。
-S file file存在且是一個網絡 socket。
-t fd fd是一個定向到終端/從終端定向的文件描述符。這可以被用來決定是否重定向了標準輸入/輸出錯誤。
-u file file存在并且設置了 setuid 位。
-w file file存在并且可寫(有效用戶擁有可寫權限)。
-x file file存在并且可執行(有效用戶有執行/搜索權限)。
- -
string string 不為 null。
-n string 字符串 string 的長度大于零。
-z string 字符串 string 的長度為零。
string1 = string2 string1 == string2 string1 和 string2 相同. 單或雙等號都可以,不過雙等號更受歡迎。
string1 != string2 string1 和 string2 不相同。
string1 ">" string2 sting1 排列在 string2 之后。
string1 "<" string2 string1 排列在 string2 之前。
- -
integer1 -eq integer2 integer1 等于 integer2.
integer1 -ne integer2 integer1 不等于 integer2.
integer1 -le integer2 integer1 小于或等于 integer2.
integer1 -lt integer2 integer1 小于 integer2.
integer1 -ge integer2 integer1 大于或等于 integer2.
integer1 -gt integer2 integer1 大于 integer2.
test_file () {
    # test-file: Evaluate the status of a file
    FILE=~/.bashrc
    if [ -e "$FILE" ]; then
        if [ -f "$FILE" ]; then
            echo "$FILE is a regular file."
        fi
        if [ -d "$FILE" ]; then
            echo "$FILE is a directory."
        fi
        if [ -r "$FILE" ]; then
            echo "$FILE is readable."
        fi
        if [ -w "$FILE" ]; then
            echo "$FILE is writable."
        fi
        if [ -x "$FILE" ]; then
            echo "$FILE is executable/searchable."
        fi
    else
        echo "$FILE does not exist"
    return 1
    fi
}

[[ ]]支持以上所有表達式,并且
1.支持正則表達式

if [[ "\$INT" =~ ^-?[0-9]+$ ]]; then
    echo "INT is an integer."
else
    echo "INT is not an integer." >&2
    exit 1
fi

2.支持類型匹配

FILE=foo.bar
if [[  $FILE == foo.* ]]; then
    echo "$FILE matches pattern 'foo.*'"
fi
  • read
    read [-options] [variable...]
    如果 read 命令接受到變量值數目少于期望的數字,那么額外的變量值為空,而多余的輸入數據則會被包含到最后一個變量中。如果 read 命令之后沒有列出變量名,則一個 shell 變量,REPLY,將會包含所有的輸入。
選項 說明
-a array 把輸入賦值到數組 array 中,從索引號零開始。我們將第36 章中討論數組問題。
-d delimiter 用字符串 delimiter 中的第一個字符指示輸入結束,而不是一個換行符。
-e 使用 Readline 來處理輸入。這使得與命令行相同的方式編輯輸入。
-n num 讀取 num 個輸入字符,而不是整行。
-p prompt 為輸入顯示提示信息,使用字符串 prompt。
-r Raw mode. 不把反斜杠字符解釋為轉義字符。
-s Silent mode. 不會在屏幕上顯示輸入的字符。當輸入密碼和其它確認信息的時候,這會很有幫助。
-t seconds 超時. 幾秒鐘后終止輸入。read 會返回一個非零退出狀態,若輸入超時。
-u fd 使用文件描述符 fd 中的輸入,而不是標準輸入。
#!/bin/bash
# read-ifs: read fields from a file
FILE=/etc/passwd
read -p "Enter a user name > " user_name
file_info=$(grep "^$user_name:" $FILE)
if [ -n "$file_info" ]; then
    IFS=":" read user pw uid gid name home shell <<< "$file_info"
    echo "User = '$user'"
    echo "UID = '$uid'"
    echo "GID = '$gid'"
    echo "Full Name = '$name'"
    echo "Home Dir. = '$home'"
    echo "Shell = '$shell'"
else
    echo "No such user '$user_name'" >&2
    exit 1
fi

有用的命令

  • sudo apt update
    是從/etc/apt/source.list文件中定義的源中去同步包的索引文件

  • du命令

選項 說明
h 以人類可讀的方式顯示
a 顯示目錄占用的磁盤空間大小,還要顯示其下目錄和文件占用磁盤空間的大小
s 顯示目錄占用的磁盤空間大小,不要顯示其下子目錄和文件占用的磁盤空間大小
c 顯示幾個目錄或文件占用的磁盤空間大小,還要統計它們的總和
apparent-size 顯示目錄或文件自身的大小
l 統計硬鏈接占用磁盤空間的大小
L 統計符號鏈接所指向的文件占用的磁盤空間大小

1.du -sh : 查看當前目錄總共占的容量。而不單獨列出各子項占用的容量
2.du -sh --max-depth=1 : 查看當前目錄下一級子文件和子目錄占用的磁盤容量。
3.du -sh * | sort -n 統計當前文件夾(目錄)大小,并按文件大小排序
4.du -sk filename 查看指定文件大小

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容