1、$表示普通用戶,#表示超級(jí)用戶(root user)。超級(jí)用戶是Linux系統(tǒng)中權(quán)限最高的用戶。
2、shell通常以#!起始,例如:#!/bin/bash
3、運(yùn)行腳本的兩種方式:1、將腳本作為sh的命令行參數(shù)。2、將腳本作為具有執(zhí)行權(quán)限的可執(zhí)行文件。
例如:$ sh script.sh Or $ sh /home/path/script.sh
注:如果將腳本作為sh的命令行參數(shù)運(yùn)行,那腳本中#!就沒什么用處了。
腳本的可執(zhí)行權(quán)限可以通過以下方式設(shè)置:$ chmod a+x script.sh 執(zhí)行:./script.sh #當(dāng)前目錄下 $ /home/path/script.sh #使用腳本完整路徑
4、在bash中每個(gè)命令或是命令序列式通過使用分號(hào)或換行符來分隔的。例如: $ cmd1;cmd2 等同于 $ cmd1 $ cmd2
5、echo用于終端打印的基本命令,在echo 的雙引號(hào)形式中打印!需要用轉(zhuǎn)義字符/將!轉(zhuǎn)義。
6、可以用printf輸出,格式與C相同。
7、echo中可以用 -n忽略結(jié)尾的換行符,如果需要使用轉(zhuǎn)義序列,則采用 echo -e"包含轉(zhuǎn)義序列的字符串"這種形式。
8、打印色彩輸出, \e[1;31 將顏色設(shè)置為紅色,\e[0m 將顏色重新置回,例如: echo -e "\e[1;31m This is red txt \e[0m"
9、設(shè)置背景,例如:echo -e "\e[1;42m Green Background \e[0m"
10、可以用env命令在終端查看所有于此終端相關(guān)的環(huán)境變量,對于每個(gè)進(jìn)程,在起運(yùn)行時(shí)的環(huán)境變量可以使用下面的命令查看, cat /proc/$PID/environ
使用pgrep命令獲取進(jìn)程的ID:$ pgrep gedit #gedit為進(jìn)程名稱
替換可以使用tr命令,環(huán)境變量之間由null字符(\0)分割,如果將\0替換成\n 如下:$ cat /proc/12501/environ | tr '\0' '\n'
11、設(shè)置環(huán)境變量,用export,如: HTTP_PROOXY=http://192.168.20.1:134 export HTTP_PROOXY 直接設(shè)置:export PATH="$PATH:/home/user/bin"
12、獲取字符串的長度:length=${#var}
13、識(shí)別當(dāng)前shell版本:echo $SHELL or echo $0
14、檢查是否為超級(jí)用戶(UID環(huán)境變量):if [ $UID -ne 0 ]; then echo Non root user. Please run as root else echo "Root user" fi
注:root用戶的UID時(shí)0.
15、數(shù)學(xué)運(yùn)算:在Bash shell環(huán)境中,可以利用let, (())和[]執(zhí)行基本的算術(shù)操作,而在進(jìn)行高級(jí)操作時(shí),expr和bc這兩個(gè)工具也會(huì)非常有用。
使用let時(shí),變量名之前不需要再添加$,如:no1=4; no2=5; let result=no1+no2 echo $result
自加操作:let no1++ 自減操作:let no1--
簡寫形式:let no+=6 let no-=6
其他方法:result=$[ no1 + no2 ] result=$[ $no1 + 5]
result=$(()no1 + 50)
result='expr 3 + 4'
result=$(expr $no1 + 5)
以上這些方法只能用于整數(shù)運(yùn)算,而不支持浮點(diǎn)數(shù)。可以借助bc工具執(zhí)行浮點(diǎn)數(shù)運(yùn)算。
如:echo "4 * 0.56" | bc
設(shè)定小數(shù)精度:echo "scale=2;3/8" | bc
禁制轉(zhuǎn)換:no=100 echo "obase=2;$no" | bc Result:1100100
no=1100100 echo "obase=10;ibase=2;$no" | bc Result:100
計(jì)算平方以及平方根: echo "sqrt(100)" | bc #Square root
echo "10^10" | bc #Square
16、重定向
系統(tǒng)預(yù)留的三個(gè)標(biāo)準(zhǔn)描述符:stdin(0)、stdout(1)、stderr(2)。
(1)> 與 >>的區(qū)別
$echo "hello world" > temp.txt會(huì)將temp.txt中的內(nèi)容先清空,然后再添加hello world。
而如果是 $echo "hello world" > temp.txt 則直接在文本尾部添加。
(2)將標(biāo)準(zhǔn)輸入、輸出以及err 重定向到文件
比如:cmd 2>stderr.txt 1>stdout.txt
或 cmd 2>&1 output.txt 或 cmd &> output.txt
"&"在這里代表標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤,這里無論是正常輸出還是錯(cuò)誤信息都寫到filename中了。
重新定義標(biāo)準(zhǔn)輸入,輸出,和錯(cuò)誤的文件標(biāo)識(shí)符
重新定義文件標(biāo)識(shí)符可以用i>&j命令,表示把文件標(biāo)識(shí)符i重新定向到j,你可以把"&"理解為"取地址"。
(3)自定義描述符
exec 3<input.txt #使用文件描述符3打開并讀取文件
echo hello world >input.txt
#echo 123456789 >filename 把字符串寫到文件filename中
#exec 3<>filename 把文件filename打開,并指定文件標(biāo)識(shí)符為3
#read -n 4 <&3 從文件中讀4個(gè)字符,句柄已經(jīng)指到第四個(gè)字符末尾
#echo -n . >&3 在第5個(gè)字符處寫一個(gè)點(diǎn),覆蓋第5個(gè)字符,-n表示不換行
#exec 3>&- 關(guān)閉文件標(biāo)識(shí)符3
17、數(shù)組array_var={0 1 2 3 4 5} 打印數(shù)組元素內(nèi)容:$ echo ${array_var[0]} or $ index=5 $ echo ${array_var[$index]}
打印數(shù)組中所有值:$ echo ${array_var[*]} or $ echo ${array_var[@]}
打印數(shù)組長度:$ echo ${#array_var[*]}
列出數(shù)組索引:$ echo ${!array_var[*]} or $ echo ${!array_var[@]}
18、一步按回車鍵的方式讀取字符“n”:read -n numbers_of_chars variable_name 如:$ read -n 4 var $ echo $var
用不回顯的方式讀取密碼:read -s var 顯示提示信息:read -p "Enter Input:" var 在特定時(shí)限內(nèi)讀取輸入:read -t timeout var
用定界符結(jié)束輸入:read -d delim_char var 如:$ read -d ":" var
19、比較符號(hào):-eq 等于 -ne不等于 -gt大于 -lt小于 -ge大于等于 -le小于等于
20、字符串比較:[[ $str1 = $str2 ]] 另一種寫法:[[ $str1 == $str2 ]] [[ -z $str1 ]] 空字符串返回真 [[ -n $str1 ]] 非空返回真
21、$$ shell 本身的PID ;
$! shell最后運(yùn)行的后臺(tái)Process的PID ;
$? 最后運(yùn)行的命令的結(jié)束代碼(返回值);
$- 使用set命令設(shè)定的flag一覽;
$* 所有參數(shù)列表。如"$*"用["]括起來的情況、以"$1$2...$n"的形式輸出所有參數(shù);
$@ 所有參數(shù)列表。如"$@"用["]括起來的情況、以"$1" "$2"..."$n"的形式輸出所有參數(shù);
$# 添加到shell的參數(shù)個(gè)數(shù)
$0 shell本身的文件名
$1~$n 添加到shell的各參數(shù)值。$1是第1參數(shù)、$2是第2參數(shù)...
22、if語句命令:
if 條件
then
Command
else
Command
fi 別忘了這個(gè)結(jié)尾
if [ -f file ] 如果文件存在
if [ -d ... ] 如果目錄存在
if [ -s file ] 如果文件存在且非空 if [ -r file ] 如果文件存在且可讀 if [ -w file ] 如果文件存在且可寫 if [ -x file ] 如果文件存在且可執(zhí)行
整數(shù)變量表達(dá)式
if [ int1 -eq int2 ] 如果int1等于int2
if [ int1 -ne int2 ] 如果不等于 if [ int1 -ge int2 ] 如果>= if [ int1 -gt int2 ] 如果> if [ int1 -le int2 ] 如果<= if [ int1 -lt int2 ]如果<
字符串變量表達(dá)式
If [ $a = $b ] 如果string1等于string2 字符串允許使用賦值號(hào)做等號(hào) if [ $string1 != $string2 ] 如果string1不等于string2 if [ -n $string ]
如果string 非空(非0),返回0(true) if [ -z $string ] 如果string 為空 if [ $sting ] 如果string 非空,返回0 (和-n類似)
條件表達(dá)式引用變量要帶$
[macg@machome ~]$ man test [(1) User Commands [(1)
SYNOPSIS test EXPRESSION [ EXPRESSION ]
[-n] STRING the length of STRING is nonzero -n和直接$str都是非0條件
-z STRING the length of STRING is zero
STRING1 = STRING2 the strings are equal
STRING1 != STRING2 the strings are not equal
INTEGER1 -eq INTEGER2 INTEGER1 is equal to INTEGER2
INTEGER1 -ge INTEGER2 INTEGER1 is greater than or equal to INTEGER2
INTEGER1 -gt INTEGER2 INTEGER1 is greater than INTEGER2
INTEGER1 -le INTEGER2 INTEGER1 is less than or equal to INTEGER2
INTEGER1 -lt INTEGER2 INTEGER1 is less than INTEGER2
INTEGER1 -ne INTEGER2 INTEGER1 is not equal to INTEGER2
FILE1 -nt FILE2 FILE1 is newer (modification date) than FILE2
FILE1 -ot FILE2 FILE1 is older than FILE2
-b FILE FILE exists and is block special
-c FILE FILE exists and is character special
-d FILE FILE exists and is a directory
-e FILE FILE exists 文件存在
-f FILE FILE exists and is a regular file 文件存在且是普通文件
-h FILE FILE exists and is a symbolic link (same as -L)
-L FILE FILE exists and is a symbolic link (same as -h)
-G FILE FILE exists and is owned by the effective group ID
-O FILE FILE exists and is owned by the effective user ID
-p FILE FILE exists and is a named pipe
-s FILE FILE exists and has a size greater than zero
-S FILE FILE exists and is a socket
-w FILE FILE exists and is writable
-x FILE FILE exists and is executabl
-b 當(dāng)file存在并且是塊文件時(shí)返回真
-c 當(dāng)file存在并且是字符文件時(shí)返回真
-d 當(dāng)pathname存在并且是一個(gè)目錄時(shí)返回真
-e 當(dāng)pathname指定的文件或目錄存在時(shí)返回真
-f 當(dāng)file存在并且是正規(guī)文件時(shí)返回真
-g 當(dāng)由pathname指定的文件或目錄存在并且設(shè)置了SGID位時(shí)返回為真
-h 當(dāng)file存在并且是符號(hào)鏈接文件時(shí)返回真,該選項(xiàng)在一些老系統(tǒng)上無效
-k 當(dāng)由pathname指定的文件或目錄存在并且設(shè)置了“粘滯”位時(shí)返回真
-p 當(dāng)file存在并且是命令管道時(shí)返回為真
-r 當(dāng)由pathname指定的文件或目錄存在并且可讀時(shí)返回為真
-s 當(dāng)file存在文件大小大于0時(shí)返回真
-u 當(dāng)由pathname指定的文件或目錄存在并且設(shè)置了SUID位時(shí)返回真
-w 當(dāng)由pathname指定的文件或目錄存在并且可執(zhí)行時(shí)返回真。一個(gè)目錄為了它的內(nèi)容被訪問必然是可執(zhí)行的。
-o 當(dāng)由pathname指定的文件或目錄存在并且被子當(dāng)前進(jìn)程的有效用戶ID所指定的用戶擁有時(shí)返回真。
比較字符寫法:
-eq 等于
-ne 不等于
-gt 大于
-lt 小于
-le 小于等于
-ge 大于等于
-z 空串
* = 兩個(gè)字符相等
* != 兩個(gè)字符不等
* -n 非空串