1 linux shell基礎

[TOC]linux

一,DAY1

1.什麼是shell

  • shell是一個命令解釋器,提供用戶和機器之間的交互(shell腳本是shell的一種表現)正則表達式

  • 支持特定語法,好比邏輯判斷、循環 (if,for,while)
  • 每一個用戶均可以有本身特定的shell
    • root:x:0:0:root:/root:/bin/bash
  • CentOS7默認shell爲bash(Bourne Agin Shell)
  • 還有zsh、ksh等

2.命令歷史

  • history命令
  • .bash_history 存放命令記錄的文件,若是終端非exit,logout正常退出,命令會記錄不全。
  • 最大1000條,默認1000條,可修改
  • 變量HISTSIZE, 查看 echo $HISTSIZE若是顯示超過1000,是由於命令暫時存在內存中,還沒寫進文件,history-c可清空內存裏記錄,可是不會清除.bash_history裏的記錄
  • /etc/profile中修改,要修改後當即生效從新進終端或執行 source /etc/profile
  • HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S " 增長此變量,可記錄對應命令的執行時間, 例: 1005 2019/11/12 10:29:47 w
  • 永久保存 chattr +a ~/.bash_history 即便超過1000條也沒有權限刪除
  • !! 上一條命令
  • !n n是數字,執行history記錄裏對應編號的命令
  • !word

3.命令補全和別名

  • tab鍵,敲一下,敲兩下
  • centos7支持參數補全,安裝yum install -y bash-completion 須要重啓系統生效 systemctl restart network
  • alias別名給命令從新起個名字 alias restartnet="systemctl restart network" 取消alias:unalias restartnet
  • 各用戶都有本身配置別名的文件 ~/.bashrc
  • ls /etc/profile.d/
  • 自定義的alias放到~/.bashrcshell

    # .bashrc
    
    # User specific aliases and functions
    
    alias rm='rm -i'
    alias cp='cp -i'
    alias mv='mv -i'
    alias restartnet="systemctl restart network"
    # Source global definitions
    if [ -f /etc/bashrc ]; then
            . /etc/bashrc
    fi

4.通配符、輸入輸出重定向

  • ls *.txt
  • ls ?.txt
  • ls [0-9].txt
  • ls {1,2}.txt
  • cat 1.txt >2.txt
  • cat 1.txt >> 2.txt
  • ls aaa.txt 2>err //2>表示錯誤重定向
  • ls aaa.txt 2>>err //2>>表示錯誤追加劇定向
  • &> 結合正確和錯誤的重定向
  • wc -l < 1.txt
  • command >1.txt 2>&1

二,DAY2

5.管道符和做業控制

  • cat 1.txt |wc -l ; cat 1.txt |grep 'aaa'
  • 把前的結果交給後面的命令
  • ctrl z 暫停一個任務
  • jobs查看後臺的任務
  • bg[id]把任務調到後臺
  • fg[id]把任務調到前臺
  • 命令後面加&直接丟到後臺 sleep 100 &

6.shell變量

  • PATH,HOME,PWD,LOGNAME 常風的一些系統變量
  • env命令,能夠查看系統經常使用變量,系統變量名一般是大寫,變量值能夠是數值,也能夠是字符串
  • set命令多了不少變量,而且包括用戶自定義的變量
  • 自定義變量a=1
  • 變量名規則:字母、數字下劃線,首位不能爲數字,能夠a1=4 a_1=4 可是不能夠1a=4
  • 變量值有特殊符號時須要用單引號括起來
    • a='a b c' 裏面帶空格要用單引號括起來
      [root@mydb1 ~]# a="a$bc"
      [root@mydb1 ~]# echo $a
      a
      [root@mydb1 ~]# a='a$bc'
      [root@mydb1 ~]# echo $a
      a$bc
      在取值時,單引號和雙引號結果不同,因此在取值時要用單引號
  • 變量的累加,變量累加時要用雙引號
    [root@mydb1 ~]# a=1
    [root@mydb1 ~]# b=2
    [root@mydb1 ~]# echo $a$b
    12
    [root@mydb1 ~]# a='a$bc'
    [root@mydb1 ~]# echo $a$b
    a$bc2
    [root@mydb1 ~]# c="a$bc"
    [root@mydb1 ~]# echo $c
    a
    [root@mydb1 ~]# c="a$b"c
    [root@mydb1 ~]# echo $c
    a2c
  • 全局變量export b=2vim

    [root@mydb1 ~]# w
     14:44:15 up 24 days, 23:49,  2 users,  load average: 0.07, 0.04, 0.00
    USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
    root     pts/0    192.168.1.182    10:18    7:11   0.37s  0.37s -bash
    root     pts/1    192.168.1.182    14:44    0.00s  0.03s  0.01s w
    [root@mydb1 ~]# echo $SSH_TTY  查看當前終端的tty
    /dev/pts/1
    [root@localhost ~]# yum -y install psmisc
    [root@localhost ~]# pstree
    systemd─┬─NetworkManager───2*[{NetworkManager}]
            ├─VGAuthService
            ├─agetty
            ├─auditd───{auditd}
            ├─crond
            ├─dbus-daemon───{dbus-daemon}
            ├─firewalld───{firewalld}
            ├─master─┬─pickup
            │        └─qmgr
            ├─polkitd───6*[{polkitd}]
            ├─rsyslogd───2*[{rsyslogd}]
            ├─sshd───sshd───bash───pstree
            ├─systemd-journal
            ├─systemd-logind
            ├─systemd-udevd
            ├─tuned───4*[{tuned}]
            └─vmtoolsd
    [root@localhost ~]# 
    [root@localhost ~]# 
    [root@localhost ~]# bash  //bash命令進入到子shell
    [root@localhost ~]# pstree
    systemd─┬─NetworkManager───2*[{NetworkManager}]
            ├─VGAuthService
            ├─agetty
            ├─auditd───{auditd}
            ├─crond
            ├─dbus-daemon───{dbus-daemon}
            ├─firewalld───{firewalld}
            ├─master─┬─pickup
            │        └─qmgr
            ├─polkitd───6*[{polkitd}]
            ├─rsyslogd───2*[{rsyslogd}]
            ├─sshd───sshd───bash───bash───pstree  //這裏能夠看出在子shell上執行了pstree命令
            ├─systemd-journal
            ├─systemd-logind
            ├─systemd-udevd
            ├─tuned───4*[{tuned}]
            └─vmtoolsd
    [root@localhost ~]# a=linux  
    [root@localhost ~]# echo $a
    linux
    [root@localhost ~]# bash
    [root@localhost ~]# echo $a    非全局變量下,進入子shell,沒法獲取父shell中a=linux的值,這是由於在非全局變量下,當前定義的變量只在當前shell中生效,而不能在子shell生效
    
    [root@localhost ~]# export b=123  父shell下定義全局變量 b=123,這樣定義全局變量只在當前終端有效,從新打開新的終端無效。
    [root@localhost ~]# echo $b      
    123
    [root@localhost ~]# bash         進入子shell,仍然能夠得到父shell定義的b=123的值
    [root@localhost ~]# echo $b
    123
    [root@localhost ~]# export c=456  在子shell中定義c=456
    [root@localhost ~]# echo $c
    456
    [root@localhost ~]# exit    退出子shell進入父shell
    exit
    [root@localhost ~]# echo $c  在父shell中沒法得到在子shell中定義c=456的值,父shell與子shell的關係是從上到下的,而不能從下到上
  • unset變量,取消賦值, unset b unset 變量名

7.環境變量配置文件

  • 系統層面的環境變量,etc下的配置文件,全局生效
    • /etc/profile 用戶環境變量,交互,登陸才執行,輸入用戶名,ip,port,密碼就會自動加載,而後profile又會自動的調用bashrc。
    • /etc/bashrc 用戶不用登陸,執行shell就生效,只要執行shell腳本,就會調用bashrc裏面的配置
  • 用戶層面的環境變量,在各個用戶的家目錄下
    • ~/.bashrc
    • ~/.bash_profile . .bash_profile或者source .bash_profile
    • ~/.bash_history
    • ~/.bash_logout 定義用戶退出時須要作出的一些動做,好比:退出時刪除命令歷史,就可把刪除歷史命令的命令,放在.bash_logout裏面
    • PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;36m\]\w\[\033[00m\]\$ '
      • vim /etc/bashrc 裏定義

        三,DAY3

8.特殊符號

  • * 任意個任意字符
  • ? 任意一個字符
  • # 註釋字符
  • \ 脫義字符 要使c='$a$b'的結果爲$a$b除了加單引號,還可使用脫意符c=\$a\$b。
  • | 管道符

9.幾個和管道有關的命令

  • cut 分割,-d 分隔符 -f 指定段號 -c 指定第幾個字符
    • 演示:
      [root@localhost ~]# cat /etc/passwd |head -2
      root:x:0:0:root:/root:/bin/bash
      bin:x:1:1:bin:/bin:/sbin/nologin
      [root@localhost ~]# cat /etc/passwd |head -2 |cut -d ":" -f 1
      root
      bin
      [root@localhost ~]# cat /etc/passwd |head -2 |cut -d ":" -f 1,2
      root:x
      bin:x
      [root@localhost ~]# cat /etc/passwd |head -2 |cut -d ":" -f 1,5
      root:root
      bin:bin
      [root@localhost ~]# cat /etc/passwd |head -2 |cut -d ":" -f 1-5
      root:x:0:0:root
      bin:x:1:1:bin
      [root@localhost ~]# cat /etc/passwd |head -2 |cut -c 4
      t
      :
  • sort 排序, -n 以數字排序 -r 反序 -t 分隔符 -kn1/-kn1,n2
    • 演示:
      [root@localhost ~]# cat /etc/passwd |head -4 |sort
      adm:x:3:4:adm:/var/adm:/sbin/nologin
      bin:x:1:1:bin:/bin:/sbin/nologin
      daemon:x:2:2:daemon:/sbin:/sbin/nologin
      root:x:0:0:root:/root:/bin/bash
      [root@localhost ~]# cat /etc/passwd |head -4 |sort -n
      adm:x:3:4:adm:/var/adm:/sbin/nologin
      bin:x:1:1:bin:/bin:/sbin/nologin
      daemon:x:2:2:daemon:/sbin:/sbin/nologin
      root:x:0:0:root:/root:/bin/bash
      [root@localhost ~]# cat /etc/passwd |head -4 |sort -nr
      root:x:0:0:root:/root:/bin/bash
      daemon:x:2:2:daemon:/sbin:/sbin/nologin
      bin:x:1:1:bin:/bin:/sbin/nologin
      adm:x:3:4:adm:/var/adm:/sbin/nologin
  • wc -l 統計行數 -m 統計字符數 -w 統計詞centos

    • 演示
      [root@localhost ~]# cat 1.txt 內容有6個字符
      123
      abc
      [root@localhost ~]# cat -A 1.txt 
      123$
      abc$
      [root@localhost ~]# wc -m 1.txt  
      8 1.txt   統計有8個字符,不要忘記隱藏的換行符

    [root@localhost ~]# cat 1.txt
    123
    abc ,f23
    [root@localhost ~]# wc -w 1.txt 統計多少個詞,以空格區分
    3 1.txtbash

     
  • uniq 去重, -c統計行數ssh

    • 演示
      [root@localhost ~]# uniq 1.txt  直接uniq沒有去重
      123
      abc  ,f23
      123
      abc
      1
      2
      1

    [root@localhost ~]# sort 1.txt |uniq 去重首先要排序,uniq一般要與sort一塊兒使用
    1
    123
    2
    abc
    abc ,f23ide

    [root@localhost ~]# sort 1.txt |uniq -c 先排序再去重再統計行數
    2 1
    2 123
    1 2
    1 abc
    1 abc ,f23centos7

     
  • tee 和 &gt; 相似,重定向的同時還在屏幕顯示rest

    • 演示
      [root@localhost ~]# cat 1.txt 
      123
      abc  ,f23
      123
      abc
      1
      2
      1

    [root@localhost ~]# sort 1.txt |uniq -c |tee a.txt |tee的做用至關於>,可是它會把重定向的內容顯示在屏屏幕上
    2 1
    2 123
    1 2
    1 abc
    1 abc ,f23

    [root@localhost ~]# sort 1.txt |uniq -c |tee -a a.txt |tee -a 至關於>>
    2 1
    2 123
    1 2
    1 abc
    1 abc ,f23

    [root@localhost ~]# cat a.txt
    2 1
    2 123
    1 2
    1 abc
    1 abc ,f23
    2 1
    2 123
    1 2
    1 abc
    1 abc ,f23

     
  • tr 替換字符,tr 'a' 'b',大小寫替換tr '[a-z]' '[A-Z]'

    • 演示
      [root@localhost ~]# echo "aminglinux" |tr 'a' 'A'   替換單個
      Aminglinux
      [root@localhost ~]# echo "aminglinux" |tr '[al]' '[AL]'  替換多個
      AmingLinux
      [root@localhost ~]# echo "aminglinux" |tr '[a-z]' '[A-Z]'  替換指定範圍
      AMINGLINUX
      [root@localhost ~]# echo "aminglinux" |tr '[a-z]' '1'  也能夠替換成數字
      1111111111
  • split 切割,-b大小(默認單位字節),-l行數, -d添加數字後綴

    • 演示
      [root@localhost test]# split -b 2M 2.txt 指定切割後每一個文件的大小
      [root@localhost test]# ls
      2.txt  xaa  xab  xac  xad  xae
      [root@localhost test]# ll -h
      總用量 20M
      -rw-r--r--. 1 root root  10M 2月  24 08:57 2.txt
      -rw-r--r--. 1 root root 2.0M 2月  24 09:04 xaa
      -rw-r--r--. 1 root root 2.0M 2月  24 09:04 xab
      -rw-r--r--. 1 root root 2.0M 2月  24 09:04 xac
      -rw-r--r--. 1 root root 2.0M 2月  24 09:04 xad
      -rw-r--r--. 1 root root 2.0M 2月  24 09:04 xae
      [root@localhost test]# split -b 2M 2.txt 2019.  指定切割後每一個文件的大小以及文件的前綴
      [root@localhost test]# ls
      2019.aa  2019.ab  2019.ac  2019.ad  2019.ae  2.txt  xaa  xab  xac  xad  xae
      [root@localhost test]# split -l 10000 2.txt 201911.   指定切割文件的行數以及文件的前綴
      [root@localhost test]# ls
      201911.aa  201911.ab  201911.ac  201911.ad  201911.ae  201911.af  201911.ag  201911.ah  2.txt

      10.shell特殊符號

  • $ 變量前綴,!$組合,正則裏面表示行尾
  • ;多條命令寫到一行,用分號分割
    • 演示
      [root@localhost test]# for i in `seq 1 10`
      > do
      > echo $i
      > done
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      [root@localhost test]# for i in `seq 1 10`; do echo $i; done
      [root@localhost test]# ls 2.txt ; wc -l 2.txt 
      2.txt
      77517 2.txt
  • ~ 用戶家目錄,後面正則表達式表示匹配符
  • & 放到命令後面,會把命令丟到後臺
  • &gt; &gt;&gt; 2&gt; 2&gt;&gt; &&gt;
  • [ ] 指定字符中的一個,[0-9],[a-zA-Z],[abc]
  • || 和 && ,用於命令之間

    • 演示
      [root@localhost test]# ls 2.txt || wc -l 2.txt 
      2.txt
      [root@localhost test]# ls 2a.txt || wc -l 2.txt 
      ls: 沒法訪問2a.txt: 沒有那個文件或目錄
      77517 2.txt
      || 若是前面執行成功,就不執行後面。若是前面執行不成功,纔會執行後面

    [root@localhost test]# ls 2a.txt && wc -l 2.txt
    ls: 沒法訪問2a.txt: 沒有那個文件或目錄
    [root@localhost test]# ls 2.txt && wc -l 2.txt
    2.txt
    77517 2.txt
    前面執行不成功,後面就不會去執行,前面執行成功,後面纔會去執行

    [root@localhost test]# [ -d aminglinux ] || mkdir aminglinux[root@localhost test]# ls201911.aa 201911.ac 201911.ae 201911.ag 2.txt201911.ab 201911.ad 201911.af 201911.ah aminglinux[root@localhost test]# [ -d aminglinux ] && mkdir aminglinuxmkdir: 沒法建立目錄"aminglinux": 文件已存在

相關文章
相關標籤/搜索