Linux Shell腳本攻略 讀書筆記

Linux Shell腳本攻略 讀書筆記
Linux Shell腳本攻略php

這是一本小書,總共253頁,但內容卻很豐富,書中的示例小巧而實用,對我這樣老是在shell門前徘徊的人來講真是如獲至寶;
最有價值的當屬文本處理,對這塊我單獨整理出來一篇blog,詳見《Linux Shell文本處理工具集錦》
下面是文本處理以外的簡單介紹,若是你以爲本身的shell須要充充電,強烈建議讀讀這本《linux Shell腳本攻略》。python

嗨,Echo一下

從 echo開始:
帶引號的 echo和不帶引號的 echo區別:
使用帶引號時,bash 不會對單引號中的變量進行求值,而是原樣輸出;
而使用雙引號,或者不使用引號,則會對變量進行解析:linux

echo '$var' // $varecho $var // 5echo "$var" // 5
  • 對比printf 的格式化輸出
    printf 「%-5s %-10s %-4s」 NO NAME HELLO //左對齊 寬度爲 5 10 4
    具體的值使用右邊引號外的;git

  • 對比 python中的輸出:
    printf 」 %s 」 % 「hello」web

  • 讓echo支持轉義字符:-eredis

    [/home/weber#]echo -e '1\t2'1    2

給終端來點顏色

  • 在終端彩色輸出:shell

    echo -e '\e[1;31m this is red text\e[0m'this is red text
  • 更有用的是爲咱們提示符着色:
    vi .profile添加:
    export PS1='[[\e[34;1m]$PWD#\e[0m]'
    imagebash

  • 注意環境變量的賦值錯誤
    var=value //賦值操做 echo $var
    var = value //判斷相等操做cookie

    [/home/weber#]var=5[/home/weber#]echo 'this is $var'this is $var[/home/weber#]echo "this is $var"this is 5
  • 獲取變量值的長度:網絡

      length=${#var} //語法真詭異
  • 打印程序的退出狀態:

      echo $?
  • 對.bashrc 修改的簡便方法:

      echo 'a=/abc/' >> ~/.bashrc
  • 爲rm打造回收站功能:

      alias rm='cp $@ ~/backup; rm $@'

shell的控制結構

  • 條件判斷

    if condition;thencommands;elif condition;thencommandselsecommandsfi
  • 循環結構

    for var in list;docommands;done

    list能夠是字符串或是序列;
    echo {1..50} 生成列表
    echo {a..z}

  • 更親切的for循環(類C)

    for((int i = 0 ; i < 10 ;i++)){commands;}
  • while循環

    while conditiondocommands;done

算術比較

  • 語法
    if[ $var -eq 0 ] && action;
    -gt :大於
    -lt: 小於
    -ge: 大於等於
    -le: 小於等於
    -a: 邏輯與
    -o: 邏輯或

  • 字符串的比較,最好使用雙中括號
    [[ $str1 == $str2 ]]
    [[ $str != $str ]]
    支持 > 、 <
    判空:-z 非空: -n

  • if更友好:
    if [[ -n $str ]] && [[ -z $str2 ]];
    then
    commands;
    fi

  • 避免if語句過長
    [ condition ] && action ;//condition爲真,則執行action
    [ condition ] && action; // condition 爲假,則執行aciton
    注意:condition 和[ ] 之間必須有空格,不然報錯;

目錄操做

  • 建立長路徑目錄:

      mkdir -p colin/soft/redis/
  • 粘滯位和setuid:

      chmod a+t file_dir/

    設置了粘滯位,只有目錄的全部者纔有權限刪除該目錄

  • 讓全部用戶都有權限執行文件:

      chown root.root file 
      chmod +s file

    設置setuid文件權限後,它運行其它用戶以文件全部者身份來執行文件;
    tips:只有linux 的elf二進制文件纔可設置這個文件權限;

  • 文件寫保護

      chattr +i file //文件不可修改、不可刪除
  • touch的妙用
    touch可用來生成空白文件;若是文件存在,則更新時間戳;
    eg:批量生成100個空白文件

    for name in test{0..100}.txtdotouch $namedone
  • 只列出目錄的方法

    1. ls -d */

    2. ls -F| grep '/$' //-F會在文件尾部列出文件類型;

    3. ls -l| grep '^d' //-l第一行第一個字符是文件類型;

    4. find . -type d -maxdepth 1 -print

  • 切換目錄快速定位
    壓入並切換:

     pushd /var/www
     dirs: 顯示當前路徑棧

    選擇路徑回切(經過索引編號):

     pushd +3

    移除最近壓入棧的路徑並切換到下一個目錄:

     popd

網站下載

wget url:直接下載文件或者網頁;
--limit-rate :下載限速,別太快
-o:指定日誌文件;輸出都寫入日誌;
-c:斷點續傳

    wget -c ftpUrl

下載整個站點全部頁面

wget --mirror me115.com

或者:

wget -r -N -l DEPTH me115.com

-l:指定頁面層級的深度;
-N:容許對文件使用時間戳;

格式化文本形式下載網頁

lynx -dump URL > web.txt

-dump選項將網頁已ASCII字符形式下載到文本文件中;

更多

若是須要更豐富的下載功能,考慮使用curl;其支持多種協議,
還支持POSF、cookie、認證、用戶代理字符串等特性;
若是你想將網頁處理流程自動化,cURL是很好的選擇;

tar 歸檔工具

  • 歸檔:

      tar -cvf output.tar dir/

    -c:建立規定
    -f:指定文件名
    -v:在歸檔或解開時顯示更多的詳細信息

  • -r:追加文件到歸檔中:

      tar -rvf output.tar dir2/
  • -t:顯示歸檔內容;

      tar -tf output.tar
  • 提取歸檔文件:

      tar -xvf output.tar
  • 歸檔時排序版本控制目錄(svn、cvs、git等目錄信息):

      tar --exclude-vcs -czvf source_code.tar.gz source/

rsync 備份系統快照

rsync -av source_path destination_path

-a:表示歸檔;-v:歸檔時顯示詳細信息
-z:指定在網絡傳輸時使用數據壓縮;
路徑能夠是遠程路徑:
eg:rsync -avz source_dir usrname@host :path;
(若是不但願使用交互式的密碼輸入,可以使用SSH密鑰來實現)

注:source_dir末尾若是使用路徑/,那麼rsync會將source_dir目錄中的全部
內容複製到目的端;若是沒有帶/,則會將source_dir自己複製到目的端;

備份時排除部分文件:

rsync -avz /home/code /mnt/disk/bakup --exclude "*.txt"

可以使用一個列表文件指定須要排除的的文件:
--exclude-from FILEPATH

ftp自動傳輸

使用ftp選項-i關閉交互會話;
eg ftp.sh:

!/bin/bash
HOST='me115.com'USER='colin'PASSWD='passwd'ftp -i -n $HOST <<EOF
user ${USER} ${PASSWD}binary
cd /home/linux
put test.php
quit
EOF

磁盤管理

  • 顯示文件大小

      du -h filename
  • 統計文件夾的詳細大小及總計

      du -ch svn_archives/

    -s 只輸出合計信息;

  • 找出指定目錄中最大的文件

      du -ak source_dir | sort -nrk 1| head

    -a:掃描指定目錄下全部文件(遞歸到最深一級目錄)
    結果單位指定:-k KB -m MB -h 人性化顯示(打算排序的時候,不要用這個,由於單位不統一了)
    上述結果中包含了目錄,若是隻看文件,不須要目錄:

      find . -type f -exec du -k {} \; | sort -nrk 1| head

故障排查

  • 當前登陸用戶:who

  • 當前登陸主機的用戶列表:users

  • 排除重複用戶:users | tr ' ' '\n' | sort |uniq

  • 系統運行時長: uptime

  • 獲取登陸會話信息:last (單個用戶 last colin)

  • 列出系統開放端口及運行的服務:

    lsof -i或者:netstat -tnp

使用syslog記錄日誌

向syslog文件/var/log/messages中記錄日誌信息:

logger hello,this is colin

發送帶標記的日誌信息

logger -t ME115  hello,colin coming

/etc/rsyslog.d/下配置了標記和日誌的對應關係;

殺死進程

  • 經過進程名獲取進程id

      ps -C command_name
  • 經過命令名終止進程:

      killall process_name
  • 經過名稱強殺進程:

      kill -9 process_name
  • 找出命令所在位置: 

      which php
      whereis php
  • 列出命令簡短描述信息:

      whatis ls

用/proc收集信息

  • 獲取cpu信息:

      cat /proc/cpuinfo
  • 獲取內存信息:

      cat /proc/meminfo
  • 獲取分區信息:

      cat /proc/partitions

    每個運行的進程在/proc下都有一個以該進程id命名的目錄,/proc/PID/下的重要文件:environ:包含與進程相關的環境變量;exe:到進程工做目錄的符號連接;fd:進程所使用的文件描述符

相關文章
相關標籤/搜索