ls /usr/bin/ info #路徑操做 dirname basename #「」和‘’與 ` ` 在shell變量中的區別 「 」 容許經過$符引用其餘變量 ‘’禁止引用其餘變量符,視爲普通字符 `` 將命令執行的結果輸出給變量 #執行一個命令,但不保存在命令歷史記錄中 <space>command man ascii #並行執行的命令之間添加&,多條命令就能夠並行執行。 ls & echo 'aaaaaaaa' & echo 'fesfsfse' #串行執行命令「&&」。若是要查看一個程序所執行的時間,可使用命令date&&./須要執行的程序&&date來查看 #shell1 && shell2 ,若是是用&&符鏈接的,那只有在shell1返回0(即正常)時,shell2纔會執行,不然shell2根本就不執行,因此前面說得最後一種cd&&rm的這種作法是可行的,並且是安全的。那||呢,對於shell1||shell2,只有在shell1執行失敗時,shell2纔會執行,不然shell2是不執行得 經常使用的 for 循環{ #for循環 a="a b c d e f" for x in $a; do echo $x+'q'; done for x in {1..9}; do echo $x; done for x in `seq 30`; do echo $x; done select a in 1 2 3 4 5 6 7; do echo $a; done #建立選擇菜單,無限循環 sh -v install.sh #查看執行的代碼 sh -n install.sh #語法檢查,沒有錯誤不顯示內容 f=/home/config.ini while read -r b; do echo $b+'dada'; done < "$f" #一行一行讀取文件 while read b; do echo $b+'dada'; done < $f while read b; do echo "your input is $b"; done #讀入鍵入的內容 cat 1.txt |while read line; do echo $line; done #讀取文件 for x in `cat 1.txt`; do echo $x; done #按空格和回車讀取文件 } done & #後臺執行循環 echo $SHELL #查看當前環境所使用的shell解釋器 #腳本通常第一行爲:#!/bin/bash chsh -l #查看系統支持哪些shell解釋器 whereis ls # 查找命令的目錄 which # 查看當前要執行的命令所在的路徑 echo -n 123456 | md5sum # md5加密 vi /etc/hosts # 查詢靜態主機名 alias # 別名 vmstat 1 9 # 每隔一秒報告系統性能信息9次 ps aux |grep -v USER | sort -nk +4 | tail # 顯示消耗內存最多的10個運行中的進程,之內存使用量排序.cpu +3 uname -a # 查看Linux內核版本信息 stty 用來改變並打印終端行設置的經常使用命令 >密碼 read -t 10 varname # 更簡單的方法就是利用read命令的-t選項 iptables -F # 將防火牆中的規則條目清除掉 /etc/init.d/sendmail start # 啓動服務 /etc/init.d/sendmail stop # 關閉服務 /etc/init.d/sendmail status # 查看服務當前狀態 /date/mysql/bin/mysqld_safe --user=mysql & # 啓動mysql後臺運行 vi /etc/rc.d/腳本.sh # 開機啓動執行 可用於開機啓動腳本 /etc/rc.d/rc3.d/S55sshd # 開機啓動和關機關閉服務鏈接 # S開機start K關機stop 55級別 後跟服務名 rsync -avzP -e "ssh -p 22" /dir user@$IP:/dir # 同步目錄 # --delete 無差同步 刪除目錄下其它文件 ifconfig eth0:0 192.168.1.221 netmask 255.255.255.0 # 增長邏輯IP地址 mtr -r www.baidu.com # 測試網絡鏈路節點響應時間 # trace ping 結合 echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all # 禁ping ipcalc -m "$ip" -p "$num" # 根據IP和主機最大數計算掩碼 ssh -p 22 root@192.168.1.209 CMD # 利用ssh操做遠程主機 scp -P 22 文件 root@ip:/目錄 # 把本地文件拷貝到遠程主機 scp -r root@192.168.1.209:遠程目錄 本地目錄 # 把遠程指定文件拷貝到本地 sshpass -p '密碼' ssh -n root@$IP "echo hello" # 指定密碼遠程操做 ssh -o StrictHostKeyChecking=no $IP # ssh鏈接不提示yes du -h 目錄 # 檢測目錄下全部文件大小 du -sh * # 顯示當前目錄中子目錄的大小 #鳥整理 ls -l --full-time #顯示具體時間 ls --full-time resource/ LANG=en_US #修改詫系 ls -R resource/ #遞歸顯示 users # 顯示全部的登陸用戶 groups # 列出當前用戶和他所屬的組 who -q # 顯示全部的登陸用戶 groupadd # 添加組 useradd user # 創建用戶 passwd 用戶 # 修改密碼 chown -R user:group # 修改目錄擁有者(R遞歸) chown y\.li:mysql # 修改全部者用戶中包含點"." umask # 設置用戶文件和目錄的文件建立缺省屏蔽值 chgrp # 修改用戶組 finger # 查找用戶顯示信息 echo "xuesong" | passwd user --stdin # 非交互修改密碼 useradd -g www -M -s /sbin/nologin www # 指定組並不容許登陸的用戶,nologin容許使用服務 useradd -g www -M -s /bin/false www # 指定組並不容許登陸的用戶,false最爲嚴格 usermod -l 新用戶名 老用戶名 # 修改用戶名 usermod -g user group # 修改用戶所屬組 usermod -d 目錄 -m 用戶 # 修改用戶家目錄 usermod -G group user # 將用戶添加到附加組 gpasswd -d user group # 從組中刪除用戶 su - user -c " #命令1; " # 切換用戶執行 腳本{ #!/bin/sh # 在腳本第一行腳本頭 # sh爲當前系統默認shell,可指定爲bash等shell sh -x # 執行過程 sh -n # 檢查語法 (a=bbk) # 括號建立子shell運行 basename /a/b/c # 從全路徑中保留最後一層文件名或目錄 dirname # 取路徑 $RANDOM # 隨機數 $$ # 進程號 source FileName # 在當前bash環境下讀取並執行FileName中的命令 # 等同 . FileName sleep 5 # 間隔睡眠5秒 trap # 在接收到信號後將要採起的行動 trap "" 2 3 # 禁止ctrl+c $PWD # 當前目錄 $HOME # 家目錄 $OLDPWD # 以前一個目錄的路徑 cd - # 返回上一個目錄路徑 local ret # 局部變量 yes # 重複打印 yes |rm -i * # 自動回答y或者其餘 ls -p /home # 查看目錄全部文件夾 ls -d /home/ # 查看匹配完整路徑 echo `ls` #執行 ls echo -n aa;echo bb # 不換行執行下一句話 將字符串原樣輸出 echo -e "s\tss\n\n\n" # 使轉義生效 echo $a | cut -c2-6 # 取字符串中字元 echo {a,b,c}{a,b,c}{a,b,c} # 排列組合(括號內一個元素分別和其餘括號內元素組合) echo $((2#11010)) # 二進制轉10進制 echo aaa | tee file # 打印同時寫入文件 默認覆蓋 -a追加 echo {1..10} # 打印10個字符 printf '%10s\n'|tr " " a # 打印10個字符 pwd | awk -F/ '{ print $2 }' # 返回目錄名 tac file |sed 1,3d|tac # 倒置讀取文件 # 刪除最後3行 tail -3 file # 取最後3行 outtmp=/tmp/$$`date +%s%N`.outtmp # 臨時文件定義 :(){ :|:& };: # 著名的 fork炸彈,系統執行海量的進程,直到系統僵死 echo -e "\e[32m....\e[0m" # 打印顏色 echo -e "\033[0;31mL\033[0;32mO\033[0;33mV\033[0;34mE\t\033[0;35mY\033[0;36mO\033[0;32mU\e[m" # 打印顏色 } 變量{ A="a b c def" # 將字符串複製給變量 A=`cmd` # 將命令結果賦給變量 A=$(cmd) # 將命令結果賦給變量 eval a=\$$a # 間接調用 i=2&&echo $((i+3)) # 計算後打印新變量結果 i=2&&echo $[i+3] # 計算後打印新變量結果 a=$((2>6?5:8)) # 判斷兩個值知足條件的賦值給變量 A=(a b c def) # 將變量定義爲組數 $1 $2 $* # 位置參數 *表明全部 env # 查看環境變量 env | grep "name" # 查看定義的環境變量 set # 查看環境變量和本地變量 read name # 輸入變量 readonly name # 把name這個變量設置爲只讀變量,不容許再次設置 readonly # 查看系統存在的只讀文件 export name # 變量name由本地升爲環境 export name="RedHat" # 直接定義name爲環境變量 export Stat$nu=2222 # 變量引用變量賦值 unset name # 變量清除 export -n name # 去掉只讀變量 shift # 用於移動位置變量,調整位置變量,使$3的值賦給$2.$2的值賦予$1 name + 0 # 將字符串轉換爲數字 number " " # 將數字轉換成字符串 a=`ps -auxh|grep node|awk '{print $2}'` for x in seq $a; do kill $x; done #刪除node的全部進程 } declare -F #顯示當前可見的全部函數 declare -f #查看詳細函數代碼 ifconfig網卡{ #網卡的經常使用命令 ifconfig -a #查看全部網卡 ifconfig eth85 ifconfig eth85 down ifconfig eth85 up #在eth85網口上,配置IP地址爲156.41.50.11、子網掩碼爲255.255.255.0的IP ifconfig eth85 156.41.50.11 netmask 255.255.255.0 #刪除eth85網口上,IP地址爲156.41.50.12、子網掩碼爲255.255.255.0的IP ip addr del 156.41.50.12/24 dev eth85 ifconfig eth1:0 10.175.102.123 netmask 255.255.252.0 up 配置浮動ip #防止重啓失效 在/etc/sysconfig/network目錄下,vi ifcfg-【網卡名稱】【Mac地址】 例:ifcfg-eth1 ifcfg-E0:24:7F:B6:FD:1B 在文件中加入IP信息,並保存文件 BOOTPROTO='static' STARTMODE='auto' IPADDR='182.3.1.180' NETMASK='255.255.0.0' 重啓網卡讓IP生效 rcnetwork restart eth5 #樣例 BOOTPROTO='static' BROADCAST='' IPADDR='192.121.1.71' NETMASK='255.255.255.0' STARTMODE='auto' USERCONTROL='no' FIREWALL='no' DEVICE=eth1 } 變量{ #賦值時等號兩邊不能有空格 #在使用變量時,要在變量前面加上符號$,但定義的時候不須要 變量的範圍 1、未經特殊處理的變量均爲全局變量 腳本中定義了的變量能夠在該腳本中任何其餘地方使用。 注意:函數內部定義的變量也能夠在該函數之外使用。 2、能夠用export把普通變量變成環境變量 環境變量能夠被其子進程使用,而普通變量不能夠。 export $var 3、能夠用local來定義一個局部變量 local關鍵字只能在函數內部使用。 用local定義的變量只能在本函數。 #特殊變量 有些變量是一開始執行Script時就會設定,擁有特定含義,而且不能加以修改的。這些是系統特殊變量: $0 當前腳本的名稱 $n 腳本或函數的第n個參數值,n=1..9 $* 腳本或函數的全部參數 $# 腳本或函數的參數個數 $$ 當前shell進程的pid $! 上一個shell後臺進程的pid $? 上一條命令返回值 其餘參數: $CDPATH 包含一系列目錄名,cd命令對他們諸葛進行搜索來查找做爲參數傳遞給它的目錄;若是該變量未設置,cd命令搜索當前目錄 $EDITOR 程序(如e-mail程序)裏使用的默認編輯器 $ENV UNIX查找配置文件的路徑 $HOME 用戶初次登陸時的起始目錄名 $MAIL 用戶的系統郵箱文件的名稱 $MAILCHECK shell檢查用戶郵箱是否有新郵件並將結果通知用戶的間隔時間(以秒爲單位) $PATH 包含用戶的搜索路徑的變量—shell用來搜索外部命令或程序的目錄 $PPID 父進程的進程ID $PS1 系統第一個提示符,通常爲$ $PS2 系統第二個提示符,通常爲> $PWD 當前工做目錄的名稱 $TERM 用戶的控制終端的類型. $LINENO 所在的代碼行,通常用來輸出錯誤行號 shift [n] 將命令行參數往左移n位,但$0不變 export 變量名錶 將變量名錶所列變量傳遞給子進程 read 變量名錶 從標準輸入讀字符串,傳給指定變量 echo 變量名錶 將變量名錶指定的變量顯示到標準輸出 set 顯示設置變量 env 顯示目前全部變量 set命令能夠從新設定參數表.如set hello wold命令會設定$*爲字符串hello world,$n和$#也同時受影響。 shift命令能夠將全部參數左移一個單位,$*、$n、$#均受影響 } 數組{ 1.初始化 #!/bin/bash #指定索引值 array1[0]=one array1[1]=1 echo ${array1[0]} echo ${array1[1]} #全數組初始化 array2=( one two three ) echo ${array2[0]} echo ${array2[2]} #間隔索引 array3=( [9]=nine [11]=11 ) echo ${array3[9]} echo ${array3[11]} #讀取鍵盤輸入,空格隔開,換行結束 read -a array4 exit 0 2.操做 !/bin/bash array=( apple bat cat dog elephant frog ) #打印第一個元素 echo ${array[0]} echo ${array:0} #打印全部元素 echo ${array[@]} echo ${array[*]} echo ${array[@]:0} #除了第一個元素,打印全部元素 echo ${array[@]:1} #從第二個元素開始,打印四個元素 echo ${array[@]:1:4} #第一個元素的長度 echo ${#array[0]} echo ${#array} #總元素數 echo ${#array[*]} echo ${#array[@]} #將元素的a替換爲A echo ${array[@]//a/A} exit 0 3.遍歷 for i in 「${array[@]}」 do #access each element as $i. . . done for x in ${b[@]};do echo $x; done 4.刪除 直接經過:unset 數組[下標] 能夠清除相應的元素。 echo ${varlist[*]} 1 100 3 4 5 8 unset varlist[7] echo ${varlist[*]} 1 100 3 4 5 不帶下標,清除整個數據 unset varlist } sed { sed -i 's/cpu/lgj/' sys_info.txt #將修改生效到原文件 經常使用sed的語法: 1. p:打印 sed 'num1,num2p' fileName #打印fileName中的num1到num2行 2. s:替換字符串 sed 's/str1/str2/' fileName #把fileName中str1替換成str2(只替換每一行中的第一個str1) 3. g:全局 sed 's/str1/str2/g' fileName #把fileName中str1替換成str2(替換全部的) 4. y:替換字符 sed 'y/abc/ABC/g' fileName #把fileName中全部的a替換成A,b替換成B, 參數-e:執行一條命令。能夠用-e參數給一行一次執行多條命令以提升效率 sed –e 'command1' –e 'command2' …… fileName #文件中的每一行執行命令:command1 #command2 ...... ^:行的開頭 $:行的結尾 sed 's/^str1/str2/' fileName #把fileName中每行開頭的str1替換成str2 sed –e 's/^str1/str2/' –e 's/str1$/str2/' fileName 一些經常使用場景介紹: 1.行的匹配 sed -n '2p' /etc/passwd 打印出第2行 sed -n '1,3p' /etc/passwd 打印出第1到第3行 sed -n '$p' /etc/passwd 打印出最後一行 sed -n '/user/'p /etc/passwd 打印出含有user的行 sed -n '/\$/'p /etc/passwd 打印出含有$元字符的行,$意爲最後一行 2.插入文本和附加文本(插入新行) sed -n '/FTP/p' /etc/passwd 打印出有FTP的行 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin sed '/FTP/ a\ 456' /etc/passwd 在含有FTP的行後面新插入一行,內容爲456 sed '/FTP/ i\ 123' /etc/passwd在含有FTP的行前面新插入一行,內容爲123 sed '/FTP/ i\ "123"' /etc/passwd在含有FTP的行前面新插入一行,內容爲"123" sed '5 a\ 123' /etc/passwd 在第5行後插入一新行,內容爲123 sed '5 i\ 「12345」' /etc/passwd 在第5行前插入一新行,內容爲「12345」 3.刪除文本 sed '1d' /etc/passwd 刪除第1行 sed '1,3d' /etc/passwd 刪除第1至3行 sed '/user/d' /etc/passwd 刪除帶有user的行 sed -i '/^$/d' ver_info.txt #刪除空行 sed 's/remote_gateway_hostname.*/remote_gateway_hostname=/' config.ini #頗有用 4. 替換文本,替換命令用替換模式替換指定模式,格式爲: [ a d d r e s s [,address]] s/ pattern-to-find /replacement-pattern/[g p w n] sed 's/user/USER/' /etc/passwd 將第1個user替換成USER,g代表全局替換 sed 's/user/USER/g' /etc/passwd 將全部user替換成USER sed 's/user/#user/' /etc/passwd 將第1個user替換成#user,如用於屏蔽做用 sed 's/user//' /etc/passwd 將第1個user替換成空 sed 's/user/&11111111111111/' /etc/passwd 若是要附加或修改一個很長的字符串,可使用( &)命令,&命令保存發現模式以便從新調用它,而後把它放在替換字符串裏面,這裏是把&放前面 sed 's/user/11111111111111&/' /etc/passwd 這裏是將&放後面 5. 快速一行命令 下面是一些一行命令集。([ ]表示空格,[ ]表示t a b鍵) 's / \ . $ / / g' 刪除以句點結尾行 '-e /abcd/d' 刪除包含a b c d的行 's / [ ] [ ] [ ] * / [ ] / g' 刪除一個以上空格,用一個空格代替 's / ^ [ ] [ ] * / / g' 刪除行首空格 's / \ . [ ] [ ] * / [ ] / g' 刪除句點後跟兩個或更多空格,代之以一個空格 '/ ^ $ / d' 刪除空行 's / ^ . / / g' 刪除第一個字符 's /COL \ ( . . . \ ) / / g' 刪除緊跟C O L的後三個字母 's / ^ \ / / / g' 從路徑中刪除第一個\ 's / [ ] / [ ] / / g' 刪除全部空格並用t a b鍵替代 'S / ^ [ ] / / g' 刪除行首全部t a b鍵 's / [ ] * / / g' 刪除全部t a b鍵 若是使用sed對文件進行過濾,最好將問題分紅幾步,分步執行,且邊執行邊測試結果。 } cat { 主要有三大功能: 1.一次顯示整個文件。$ cat filename 2.從鍵盤建立一個文件。$ cat > filename <<qq qq 建立fiename文件,追加內容,遇到qq時結束輸入 只能建立新文件,不能編輯已有文件. 3.將幾個文件合併爲一個文件: $cat file1 file2 > file cat -n config.ini 顯示行編號 } cut { cut [-bn] [file] 或 cut [-c] [file] 或 cut [-df] [file] 使用說明 cut 命令從文件的每一行剪切字節、字符和字段並將這些字節、字符和字段寫至標準輸出。 若是不指定 File 參數,cut 命令將讀取標準輸入。必須指定 -b、-c 或 -f 標誌之一。 主要參數 -b :以字節爲單位進行分割。這些字節位置將忽略多字節字符邊界,除非也指定了 -n 標誌。 -c :以字符爲單位進行分割。 -d :自定義分隔符,默認爲製表符。 -f :與-d一塊兒使用,指定顯示哪一個區域。 -n :取消分割多字節字符。僅和 -b 標誌一塊兒使用。若是字符的最後一個字節落在由 -b 標誌的 List 參數指示的<br />範圍以內,該字符將被寫出;不然,該字符將被排除 #實例 $ cat /etc/passwd | tail -n 5 | cut -d : -f 1 postfix apache icecream mysql news } du { 查看目錄的大小 -s 只顯示最終結果 -m 以M爲單位顯示 -k 以K爲單位顯示 -h 以合適的單位顯示 經常使用: du –hs ./* } expect { #!/usr/bin/expect -f if {$argc < 2} { #打印 puts stdout "$argv0 err params\n" exit 1 } #行後面不能夠加註釋 #定義函數 proc do_console_login {login pass} { puts $login; puts $pass; } #打印參數長度 puts [llength $argv] #設置變量 #set timeout -1 設置expect永不超時 set timeout 5 #設置超時時間 set user [lindex $argv 0] #獲取腳本運行時帶的第一個參數值 set password [lindex $argv 1] #調用函數 do_console_login $user $password spawn ssh $user@10.175.102.219 #判斷上次輸出結果裏是否包含「password:」的字符串,若是有則當即返回,不然就等待一段時間後返回,等待時長就是前面設置的10秒。 #開始匹配後,裏面不能夠在行後面加註釋 expect { "(yes/no)?" { send "yes\r" expect "password:" send "$password\r" exp_continue } "*assword" { send "$password\r" exp_continue } } ########## puts 會把全部的打印都放在一塊兒############ #遍歷的幾種方法: foreach i { 1 3 5 7 9 } { puts "$i" } #i默認增量是1,即等價incr i 1 puts "---1---" for {set i 0} {$i < 3} {incr i} { puts "I inside first loop: $i" } puts "---2---" for {set i 3} {$i < 2} {incr i} { puts "I inside second loop: $i" } puts "---3---" set i 0 while {$i < 4} { puts "I inside third loop: $i" incr i puts "I after incr: $i" } set i 0 incr i puts "---4---" puts "$i" #expect裏的加減法 set i [expr {$i + 1}] puts "---5---" puts "$i" #替代手工輸入,執行命令,每條命令以空格隔開! if { 1 eq 1 } { puts "SYNC complete!" } else { puts "SYNC error!" } #if 的用法 set File "/usr/lgj" if {[file isfile $File]!=1} { send_user "$argv0: file $File not found. " send_user "mkdir $File\n" send "cd /usr/\r mkdir $File\n" send "cd lgj\n touch 11.log\r" } send_user "for use\n" send_user "read file as print\n" #################打開原主機中的文件在登錄機上打印################ set fd [open "./test.sh" "r"] set number 0 # read each line while { [gets $fd line] >= 0} { incr number #puts "Number of lines: $number" puts $line } send_user "read file as cmd\n" close $fd #################打開原主機中的文件做爲shell命令行在登錄機上執行##### set fd [open "./lgj.sh" "r"] set number 0 while { [gets $fd line] >= 0} { incr number send "$line\n" } close $fd puts "you do next!"; #把控制權交給控制檯,這個時候就能夠手工操做 interact }