shell_basic,visualbasicshell
1、回顧基礎命令2、指令碼3、變數4、別名5、條件判斷6、test判斷 一、回顧基礎命令shutdown --關機/重啟exit --退出當前shellrmdir --刪除空目錄du --查看目錄佔用的儲存空間df --查看已 經掛載的檔案系統的空間使用方式ln --建立連結cat --顯示檔案的所有內容head --顯示檔案的頭部tail --顯示檔案的尾部less --分屏/分頁 顯示檔案內容dirname --取出目錄basename --取出檔案名稱history --曆史命令1、ln# ln -s [目標] [源 -- 建立軟連結 (symbolic link)# ln [目標] [源] -- 建立永久連結2、catconcatinate,把檔案的內容按順序串連起來,輸出到標準輸出。目前,只需要簡單理解成顯示檔案的內容即可# cat f1 -- 顯示檔案 f1 的內容到螢幕上# cat -n f1 -- 顯示檔案的內容,並且加上行號# cat -A f1 -- 列印出一些不可見的字元和位置標記3、head讀取檔案的頭部# head -n 3 /etc/passwd --讀取檔案前面三行# head -n -3 /etc/passwd --讀取檔案時,丟掉檔案的後三行;# head -c 3 /etc/passwd --讀取檔案的前面三個位元組# head -c 10m /dev/zero > f1 --建立一個10M的檔案4、tail讀取檔案的尾部# tail -n 3 /etc/passwd -- 讀取檔案的後面三行# tail -c 3 /etc/passwd -- 讀取檔案的後面三個位元組# tail -n +28 /etc/passwd -- 讀取檔案中從第28行開始直到結尾的所有行# tail -f /etc/passwd -- 追蹤檔案尾部內容的變化,常用觀察記錄檔的變化5、history# set -o history --啟用命令曆史功能 ,預設記錄在檔案 ~/.bash_history 中# set +o history --關閉命令曆史功能# history --顯示最近n條曆史命令註:以下三個變數用於控制命令曆史的數量,以及是否記錄時間戳記# vim /etc/bashrc --一般配置在該檔案當中,使用者級可配置在 ~/.bashrcHISTSIZE=1000000 --最多儲存多少條記錄HISTFILESIZE=2000000 --命令曆史檔案的最大尺寸HISTTIMEFORMAT='[%Y-%m-%d %H:%M:%S] ' --命令曆史的時間戳記格式export HISTSIZE HISTFILESIZE HISTTIMEFORMAT --把他們定義成環境變數 二、指令碼1、如何執行指令碼 # vim test.sh #!/bin/bash echo 'hello world'# bash test.sh# bash -x test.sh --顯示指令碼執行過程的資訊# sh test.sh# source test.sh# . test.sh--上述兼為非標準執行指令碼,指令檔可以沒有可執行許可權;下列為標準執行:# head -n 1 test.sh#!/bin/bash# chmod a+x test.sh# ./test.sh可直接將指令碼放到 PATH 路徑下,直接當命令運行注意:shell 必須以 #! 開頭,讀作sha-bang,這兩個字元用來標識檔案類型,#! 用來告訴系統,這個檔案裡的內容將要用指定的解譯器來解釋,#! 之後的字串將會被解釋成一個程式,該程式用來解釋當前檔案。如果沒有提供sha-bang這一行,當前 shell 將會自主猜測一個,但結果並不保證和預期一致;所以最好明確指定。./test.sh 的運行流程:1、核心讀取該指令碼,檢查檔案類型標記,擷取解釋氣得路徑;2、核心運行解譯器;3、解譯器運行起來後,就開啟指令檔,解釋其執行linux 內建的諸多解譯器:#!/bin/bash;#!/bin/sh;#!/usr/bin/perl;#!/bin/sed;#!/bin/awk2、四則運算子+ - * /$(()) $[] expr let# echo $((38%5)) --取餘# echo $[38/5] --求商# echo $((10**2)) --10的平方 2.1、expr# expr 14 % 9 --取餘# expr 34 / 9 --求商# expr 30 \* 3 --使用乘號時,必須用反斜線屏蔽其特定含義# expr index "sarasara" a --抓取第一個字元數字串出現的位置# expr substr "this is a test" 3 5 --抓取字串# expr length "this is a test" --計算字串長度 2.2、letlet計算工具用於執行一個或多個運算式,變數計算中不需要加上 $ 來表示變數。如果運算式中包含了空格或其他特殊字元,則必須引起來# no=20# let no++ --自增# let no-- --自減# let no+=10 --自增10# let no=no+10 --同上# let no-=15 --自減15# let a=5+4 --變了a無須加 $ 符號# echo $a3、shell設定檔/etc/profile --全域設定檔,/etc/bashrc --全域設定檔,一般用來定義環境變了~/.bash_profile --使用者設定檔~/.bashrc --使用者設定檔~/.bash_logout --使用者設定檔,login shell 退出時會讀取該檔案4、shell種類根據shell 的啟動方式不同,可以大致地把shell分為以下幾種:login shell --在文本介面登入,如su -;讀取shell設定檔順序如下:/etc/profile——~/.bash_profile——~/.bashrc——/etc/bashrcinteractive shell --gnome-terminal 中預設的shell;讀取shell設定檔順序如下:~/.bashrc —— /etc/bashrcnon-interactive shell --用來運行指令碼的shell 4.1、在~/.bashrc 中設定一個變數 v,要求該變數只出現在互動shell中# vim ~/.bash_profile --標識shell 是否登入shellLOGINSHELL=1# vim ~/.bashrc --不是登入shell 時,才設定變數if [ "$LOGINSHELL" != 1 ];thenv="interactive shell only"fi5、命令優先順序別名 > 函數 > 內部命令 > 外部命令6、shell特殊字元對於shell來說,有些字元除了它本身的意義之外,還有特殊的意義,如果要在字串中包含特殊字元,就必須通過引用(quoting)的方法來去除特殊字元的特殊意義。以下列出的是部分特殊字元:~ --不被引用的話將會被shell 替換成家目錄& --把程式放到後台執行$ --dollar 符,可用於參數展開${} --變數處理,可對變數的內容做替換,刪除,抽取等操作* --星號,萬用字元,匹配所有字元? --問號,萬用字元,匹配任意一個字元() --命令組{} --命令組"" --雙引號,引用符號;可以去除大多數特殊字元的特殊意義,除 $;`;!;\ 外'' --單引號,引用符號;可以去除所有特殊字元的特殊意義,除自己本身. --相當於source命令;可用於設定隱藏檔案;用於目錄名時,代表目前的目錄/ --斜杠,路徑分隔字元,根目錄\ --反斜線,可用來去除單個字元的特殊意義,也就是所謂的“轉義“,也可用於表示特殊字元,如分行符號 (\n) `` --反撇號,命令優先執行,和$()含義是一樣的;如果有嵌套那麼不能用``號$(())和 $[] --運算子: --空命令; --命令分割;不去考慮上一條命令所執行的結果;; --case 選項的結束符# --注釋&& --邏輯與;可對命令進行分割;但是需要考慮上一條命令所執行的結果|| --邏輯或;可對命令進行分割;不需要考慮上一條命令執行結果----------------------------------------------------------------# echo 'hello world;' "hello world;" hello\ world; --用三種引用符合去除空格的特殊意義 三、變數1、本地變數目前使用者自訂的變數;當前進程有效,其他進程或者當前進程的子進程無效# a=123# echo $a# unset a --取消變了定義2、環境變數當前進程有效,並且能被子進程調用;# env --查看當前系統所有環境變數# set --查看當前系統所有環境變數和臨時變數# echo $PATH -- 顯示PATH變數的內容# export hi=hello --定義環境變數;工作當中一般喜歡把即用的環境變了寫在 ~/.bash_profile幾個常見環境變數:PATH --影響命令的搜尋PS1 --命令提示字元TMOUT --逾時時間,單位為S,時間一到,自動結束 interactive shell ;所以最好將其設為唯讀變數 # declare -r TMOUT=60HISTSIZE, HISTFILESIZE, HISTTIMEFORMAT --命令曆史 3、系統變數又叫bash中內建的變數;shell本身已經固定好的一些變數$# --指令碼後面接參數個數$* --指令碼後面所有的參數(被雙引號包含則被當成一個字串輸出)$@ --指令碼後面所有的參數(被雙引號包含還是保留各參數的邊界)$? --上一條命令執行後返回的狀態$$ --當前進程的進程號$! --後台啟動並執行最後一個進程號!$ --最後一條命令或參數!! --最後一條命令的記錄$0 --當前程式的程式名或進程$1~$n --位置參數變數#!/bin/bashecho "\$0 = $0"echo "\$# = $#"echo "\$* = $*"echo "\$1 = $2"echo "\$7 = $7"echo "\$11 = ${11}"# chmod a+x test.sh# ./test.sh a b c4、變數定義a、預設下,變數類型沒啥要求。可以給變數賦任何值,但是等號兩邊不能有任何的空格b、變數名區分大小寫c、變數名不能以數字或者特殊符號開頭d、將命令所執行的結果儲存到變數5、調用變數# a=$(hostname)# A=123456789# echo $A# echo ${A:2:3}6、數組數組的定義:用小括弧擴起來定義數組,括弧裡的元素用空格隔開# array[0]=var1# array[1]=var2# array[2]=var3# array=(var1 var2 var3) --等同於上述三行,定義數組# echo ${array[0]} --取數組第一個值# echo ${array[*]} --取數組所有值# echo ${array[@]} --同上7、declare 定義有類型的變數-i --將變數看成整數-r --定義唯讀變數-x --將變數匯出到環境變數-a --將變數看成數組8、read 互動式定義變數-p --提示資訊-n --字元數-t --逾時-s --不顯示 四、別名命令的別名,顧名思義,就是可以通過別的名字來執行命令。通常用於簡化命令的輸入,或者為命令增加一些參數,或者是單純地為命令添加多個訪問名稱。# alias cp mv rm --查看cp, mv, rm這三個命令是不是別名# unalias rm -- 刪除別名 rm# alias cdyum='cd /data/yum' -- 簡化輸入# alias rm='rm -i' -- 為命令增加參數-- 通常別名是在設定檔~/.bashrc 中設定的1、驗證別名、函數、內部命令、外部命令的優先順序別# alias pwd='echo it is an alias' --建立一個 pwd 別名# function pwd() { echo "this is a function"; } --建立一個 pwd 函數# pwd --運行pwd,發現輸出是別名# unalias pwd --刪除別名,再運行 pwd,發現輸出是函數內容# unset pwd --刪除函數,再運行 pwd,才是輸出當前所在路徑所以:別名 > 函數 > 內部命令 > 外部命令 五、條件判斷# vim test----------------------if [ 條件 ];thencommand...fi----------------------if [ 條件 ];thencommand...elsecommand...fi----------------------if [ 條件1 ];thencommand1...elif [ 條件2 ];thencommand2...elsecommand3...fi----------------------if [ 條件1 ];thencommand1...if [ 條件2 ];thencommand2...fielseif [ 條件3 ];thencommand3...elif [ 條件4 ];thencommand4...elsecommand5...fifi 六、test判斷test == [ judge ]1、檔案存在與否的判斷# vim test.sh#!/bin/bashif test -e $1;then --是否存在;還有 -p;-c;-b;-Lif [ -f $1 ];then --使用 [ judge ] 替換if test -f $1;then --是否存在並且為普通檔案if test -d $1;then --是否存在並且為目錄if test -S $1;then --是否存在並且通訊端檔案echo 'YES'fi# chmod a+x test.sh# ./test.sh [path]2、檔案許可權相關判斷-r;-w;-x --是否有讀,寫,執行許可權-u --是否有suid-g --是否有sgid-k --是否有t位-s --是否為空白檔案,-s表示非空;! -s 空檔案3、字串判斷= --等於則為真,等號兩邊必須有空格;也可以是:==!= --不相等則為真-z 字串 --字串的長度為零則為真-n 字串 --字串的長度不為零則為真if test $num1 = $num2;thenif [ $num1 = $num2 ];thenif [ -n $num1 ];then4、數值判斷-eq --等於則為真-ne --不等於則為真-gt --大於則為真-ge --大於等於則為真-lt --小於則為真-le --小於等於則為真if test $[num1] -eq $[num2];thenif [ $[num1] -eq $[num2] ];then5、邏輯判斷-a 和 && --邏輯與-o 和 || --邏輯或! --非優先順序:與>或>非if test -e $1 -o -e $2;then --判斷是否有一個檔案存在if [ -e $1 -o -e $2 ];then --同上if test ! -e $1 -o ! -e $2;then --判斷兩個檔案沒有同時存在if [ ! -e $1 -o ! -e $2 ];then --同上