Ctrl + Alt + T 打開終端, $表明普通用戶,#表明超級用戶(root user)
如: xiangqi@xiangqi ~$
root@xiangqi ~#
echo打印,後可接無引號、單引號、爽引號,方法基本相似,特殊的地方在於:
(1)但願打印!時,雙引號中須要加轉義字符 \ ,如 echo " Hello \!" (在shell中貌似不存在這個問題)
(2)用單引號時,好比echo '$var',這時無法對單引號中的變量求值,僅僅打印$var
另外一種打印方法是printf,用法與C相同
printf "%-5s %-10s %-4s\n" NO Name Mark
printf "%-5s %-10s %-4.2f\n" 1 James 82.3432
printf "%-5s %-10s %-4.2f\n" 2 Lucy 77.986
表明左對齊5個寬度字符串、左對齊10個寬度字符串、左對齊4個寬度2位小數浮點數
環境變量:
環境變量是未在當前進程中定義,而從父進程中繼承而來的變量。
(1)經過env查看環境變量
(2)若是要查一個進程的環境變量,則pgrep查詢該進程的PID,再調用cat /proc/$PID/environ
例若有一個gedit的應用程序正在運行:
$ pgrep gedit
12501
$ cat /proc/12501/environ
更清晰地顯示,則輸入命令:
$ cat /proc/12501/environ | tr '\0' '\n'
(3)export命令用來設置環境變量。
賦值及運算:
var=value 賦值操做
var = value 相等操做
能夠利用let和[]進行基本運算,高級運算經常使用expr和bc
示例:
#! /bin/bash
# test
no1=3
no2=4
echo reslut1=$[ no1 + no2 ]
echo reslut2=$[ $no1 + no2 ]
echo reslut3=$[ $no1 + $no2 ]
let no1++
let no2--
echo reslut4=$no1
echo result5=$no2
結果分別是
reslut1=7
reslut2=7
reslut3=7
reslut4=4
result5=3
數組和關聯數組
示例:
#! /bin/bash
# test
array_value_1=(1 2 3 4 5 6) #賦值定義一個數組
array_value_2[0]="test1" #賦值分別定義一個數組的元素
array_value_2[1]="test2"
array_value_2[2]="test3"
array_value_2[3]="test4"
echo ${array_value_1[2]} #打印結果3
echo ${array_value_2[3]} #打印結果test4
echo ${array_value_1[@]} #以清單形式打印全部的值1 2 3 4 5 6
echo ${#array_value_2[@]} #打印數組長度4
關聯數組定義時須要首先經過declare聲明語句
示例:
#! /bin/bash
# test
declare -a array #-a表明定義數組,相似的還有-f定義函數,-i定義整型
array=([apple]="100 dollars" [orange]="80 dollars" [lemon]="50 dollars")
echo "Orange costs ${array[orange]}"
函數:
(1)函數的定義:
functionname()
{
statements;
}
(2)函數的調用
functionname或者functionname arg1 arg2
(3)函數支持遞歸,最典型的例子:fork炸彈 :(){:|:&};:
具體爲:
:() #說明下面要定義一個函數,函數名爲小數點,沒有可選參數。
{ #表示函數體開始
:|: & #用遞歸方式調用":"函數自己,並用管道(pipe)將其輸出引至另外一次遞歸調用的":"函數,即":|:"表示的是每次調用函數":"的時候就會生成兩份拷貝
#最後的 & 表明調用間脫鉤,以使最初的":"函數被殺死後爲其所調用的兩個":"函數還能繼續執行
} #函數結束標識
; #函數定義結束後將要進行的操做
: #調用":"函數,"引爆"fork炸彈
管道:
$ cmd1 | cmd2 | cmd3
表明的是cmd1的輸出傳遞給cmd2,cmd2的輸出傳遞給cmd3,cmd3的輸出將會被打印或導入其餘文件
例如:
$ ls | cat -n > out.txt #ls的輸出傳給cat -n,cat -n加上行號,重定向到out.txt文件
$ cmd_output=$(ls | cat -n) #cmd_ouput命令能夠讀取輸出
$ echo cmd_output
比較:
[ condition ] && action #若是condition爲真,則執行action
[ condition ] || action #若是condition爲假,則執行action
內部字段分割符IFS:
(1)示例:
#! /bin/bash
# test
data="name,sex,year,location"
oldIFS=$IFS #IFS默認值是空白字符
IFS="," #將IFS設置成逗號
for item in $data
do
echo Item: $item
done
IFS=$oldIFS
結果打印出來即:
Item: name
Item: sex
Item: year
Item: location
(2)示例:
#! /bin/bash
# test
data="root:x:0:0:root:/root:/bin/bash"
oldIFS=$IFS
IFS=":"
count=0
for item in $data
do
[ $count -eq 0 ] && user=$item #count=0時,把此時的item賦值給user
[ $count -eq 6 ] && shell=$item #count=6時,把此時的item賦值給shell
let count++
done
IFS=$oldIFS
echo $user\'s shell is $shell
結果打印出來即:
root's shell is /bin/bash
find命令:
$find . -print #打印當前目錄的文件和目錄列表
$find .. -print #打印父目錄的文件和目錄列表
$find /home -print #打印/home目錄的文件和目錄列表
$find /home -name "*.txt" -print #打印/home目錄名字中含有.txt的文件列表
$find /home \( -name "*.txt" -o -name "*.pdf" \) -print #打印/home目錄名字中含有.txt或.pdf的文件列表
$find /home -iname "*.txt" -print #打印/home目錄名字中含有.txt(忽略大小寫)的文件列表
$find /home -path "*slynux*" -print #打印/home目錄文件路徑中含有slynux的文件路徑或文件列表
$find /home -regex ".*\(\.py\|\.sh)$" #打印/home目錄中含有.py或.sh的文件列表
$find /home -iregex ".*\(\.py\|\.sh)$" #打印/home目錄中含有.py或.sh(忽略大小寫)的文件列表
$find /home ! -name "*.txt" -print #打印/home目錄名字中不含有.txt的文件列表c8c4e6999b8-
$find . -maxdepth 1 -print #打印最大搜索深度爲1的文件和目錄列表
$find . -mindepth 2 -print #打印最小搜索深度爲2的文件和目錄列表
$find . -maxdepth 1 -type f -print #打印最大搜索深度爲1的文件
$find . -maxdepth 1 -type d -print #打印最大搜索深度爲1的目錄列表
$find . -type f -atime -7 -print #打印當前目錄最近7天內被訪問的全部文件
$find . -type f -mtime 7 -print #打印當前目錄剛好7天前被修改過的全部文件
$find . -type f -ctime +7 -print #打印當前目錄元數據(例如權限等)最後一次變化時間超過7天的全部文件
$find . -type f -amin +7 -print #打印當前目錄訪問時間超過7分鐘的全部文件
$find . -type f -size +2k #打印當前目錄文件大小大於2k的全部文件
$find . -type f -perm 644 -print #打印當前目錄訪問權限爲644的全部文件
$find /home -name "*.txt" -delete #刪除/home目錄名字中含有.txt的文件列表
find與exec合用:
-exec: 對匹配的文件執行該參數所給出的shell命令。相應命令的形式爲'command' {} \;,注意{}和\;之間的空格,同時兩個{}之間沒有空格
$find . -type f -name "*.c" -exec cat {} \;> all_c_files.txt
將當前目錄中全部c文件都找出來,經過cat拼接成1個大的all_c_files.txt文件
其中{}是1個特殊的字符串,表明匹配,對於每個匹配的文件,{}會被替換成相應的文件名。
$find . -type f -name "*.txt" -exec printf "Text file: %s\n" {} \;
找到文件並打印
補充說明:{}後邊必定要加分號
find與xargs合用:
xargs:主要功能是從輸入中構建和執行shell命令。
在使用find命令的-exec選項處理匹配到的文件時, find命令將全部匹配到的文件一塊兒傳遞給exec執行。但有些系統對可以傳遞給exec的命令長度有限制,這樣在find命令運行幾分鐘以後,就會出現溢出錯誤。錯誤信息一般是「參數列太長」或「參數列溢出」。這就是xargs命令的用處所在,特別是與find命令一塊兒使用。find命令把匹配到的文件傳遞給xargs命令,而xargs命令每次只獲取一部分文件而不是所有,不像-exec選項那樣。這樣它能夠先處理最早獲取的一部分文件,而後是下一批,並如此繼續下去。
例1:刪除path下的文件
rm `find /path -type f`
若是path下的文件過多,會由於參數列表過長而報錯,改用xargs,問題能夠解決:
$find /path -type f -print0|xargs -0 rm
這裏,-print0表示輸出以null分隔(-print使用換行);-0表示輸入以null分隔
例2:統計全部c程序的行數
$find /path -type f -name "*.c" -print0|xargs -0 wc -l
tr轉換:
tr set1 set2
將set1映射到set2,若是set1更長,則set2會不斷重複最後一個字符,直到長度和set1相等,若是set2長,那麼超出部分會自動被捨棄。
如:
$ echo "ABCDEFGHIJKLMN"|tr 'A-Z' 'a-z'
abcdefghijklmn
$ echo "ABCDEFGHIJKLMN"|tr 'A-G' 'a-g'
abcdefgHIJKLMN
$ echo "ABCDEFGHIJKLMN"|tr 'A-Z' 'a-d'
abcddddddddddd
由此能夠看出,tr能夠用於加密解密
此外,tr還有刪除功能,具體爲:
$cat filename | tr -d '[set]' #刪除set中字符
$cat filename | tr -d -c '[set]' #刪除set之外字符
如:
$ echo "ABCDEFG" | tr -d 'ABCD'
EFG
$ echo "ABCDEFG" | tr -d -c 'ABCD\n'
ABCD
切分文件名:
(1)${VAR%.*} 刪除VAR中位於%右側的通配符(即.*)所匹配的字符串,從右到左找出最短結果
(2)${VAR#*.} 刪除VAR中位於#右側的通配符(即*.)所匹配的字符串,從左到右找出最短結果
(3)${VAR%%.*} 刪除VAR中位於%右側的通配符(即.*)所匹配的字符串,從右到左找出最長結果
(2)${VAR##*.} 刪除VAR中位於#右側的通配符(即*.)所匹配的字符串,從左到右找出最長結果
示例:假定URL="www.google.com"
$ echo ${URL%.*} 獲得 www.google
$ echo ${URL%%.*} 獲得 www
$ echo ${URL#*.} 獲得 google.com
$ echo ${URL##*.} 獲得 com
統計文件:
(1)統計行數 $wc -l filename 或者 $cat filename | wc -l
(2)統計單詞數 $wc -w filename 或者 $cat filename | wc -w
(1)統計字符數 $wc -c filename 或者 $cat filename | wc -c
例題:輸入dkdkkiaoiqqiwideiujdiwd,統計每一個字母出現字數並按字母表排序
INPUT="dkdkkiaoiqqiwideiujdiwd"
OUTPUT=`echo $INPUT | sed 's/[^n]/&\n/g' | sed '/^$/d' | sort | uniq -c | tr -d ' \n' `
echo $OUTPUT
結果爲:1a5d1e6i1j3k1o2q1u2w
其中:
sed 's/[^n]/&\n/g' #在每一個字符後追加1個換行符,使得每行只出現一個字符
sed '/^$/d' #最後1個字符會被sed替換成「字符+\n」,因此多出1個換行符並在最後造成1個空行,這個命令刪除最後的空行
sort #排序
uniq -c #打印出每行各重複了多少次
tr -d ' \n' #刪除空格和換行符,造成最終結果
shell