touch 創建空文件(當然,你也可以使用echo >filename)ln 創建鏈接符號(快捷方式|引用):符號鏈接:ln –s硬鏈接:ln區別:符號鏈接產生了一個快捷方式,是對源文件的一個鏈接。硬鏈接是底層位元組的鏈接,簡單來說,相當於是一個文件,兩個文件名,占用同一塊扇區,好處是省空間,即便刪除... ...
1.基本命令
touch 創建空文件(當然,你也可以使用echo >filename)
ln 創建鏈接符號(快捷方式|引用):
- 符號鏈接:ln –s
- 硬鏈接:ln
區別:
- 符號鏈接產生了一個快捷方式,是對源文件的一個鏈接。
- 硬鏈接是底層位元組的鏈接,簡單來說,相當於是一個文件,兩個文件名,占用同一塊扇區,好處是省空間,即便刪除一個,只要還有硬連接,這個文件就依然存在。
ls –i 查看文件inode編號(唯一的,可以確認文件是否為同一個,類似於hash值)
mv 移動|重命名
file 查看文件(文件夾)類型等信息
cat 顯示內容 -n:所有行號 ;-b:有字加行號;-T:不顯示製表符;
more 按頁顯示;例如:cat xxx |more
tail 查看文件結尾;-n number(或-number):指定最後幾行;-f:追蹤,可以動態追蹤日誌文件。
head 與tail類似,不過沒有-f參數
ps 進程
top 顯示linux進程(Linux版任務管理器)
kill 幹掉進程
df 查看硬碟空間
sort 文件內容排序
grep 搜索文本
$BASH_SUBSHELL 子shell檢測變數
sleep timeCount(s)
句子結尾加&:後臺模式運行
jobs 工作
(command 1;command 2…) 任務列表,可以同時執行
coproc 協程(後臺有個子shell,執行你的命令,同時生成一個job)
which 查看命令程式所在位置
history 命令歷史記錄
!! 上一個歷史命令(省著按向上箭頭了)
!number 第n條歷史命令被執行
環境
printenv 查看環境變數(env只能查看所有的全局變數); 本命令支持查看某條變數(不需要加美元符號,echo需要)
set 查看|設置環境變數
export 到處變數為全局變數,就可以在各種shell中使用了(並不能使shell的父shell環境變數發生變化)
unset 刪除環境變數
passwd (chpasswd) 密碼查看|修改
umask 為文件分配預設許可權
chmod 更改許可權
chown 改變歸屬權
分區
fdisk 分區;p:顯示基本設備信息;n:new個分區;w:write進設備
mkefs 格式化ext分區;
mke2fs 格式化ext2分區;
mkfs.ext3 格式化ext3分區;
mkfs.ext4 格式化ext4分區;
mkreiserfs 格式化reiserfs分區
jfs_mkfs 格式化jfs分區
mkfs.xfs 格式化xfs分區
mkfs.zfs 格式化zfs分區
mkfs.btrfs 格式化btrfs分區
fsck 檢查修複分區 -a:自動檢測修複;-A:列出fstab中所有分區,並檢測;-C:顯示支持的文件系統檢測時的進度條(ext2、3);-s:多個文件系統依次檢查;
LVM 可以添加多個硬碟到一個捲組(整合為一個大分區也沒有問題),可以創建快照,鏡像。
如何創建LVM物理捲?使用fdisk t來改變分區類型(為8e);或使用pvcreate創建,pvdisplay查看創建進度;
vgcreate 創建捲組(為物理捲);例如:vgcreate Vol1 /dev/sda1;vgdisplay查看進度
lvcreate 創建邏輯捲;例如:lvcreate –l 100%FREE –n lvtest Vol1;lvdisplay查看進度
淡淡這樣還不夠!!!還要有文件系統,如ext4的LVM:mkfs.ext4 /dev/Vol1/lvtest。上述創建了一個ext4類型的邏輯捲lvtest。還要手動掛載:mount /dev/Vol1/lvtest /mnt/my_partation
LVM的一堆管理命令:
vgchange 激活和禁用捲組
vgremove
刪除捲組
vgextend
將物理捲加到捲組中
vgreduce
從捲組中刪除物理捲
lvextend
增加邏輯捲的大小
lvreduce
減小邏輯捲的大小
2.shell編程
變數是寬鬆的定義,任何由字母、數字或下劃線組成的文本字元串,長度不超過20個。用戶變數區分大小寫,所以變數 Var1 和變數 var1 是不同的。
shell編程最強大的地方在於可以從console的輸出中取回這些輸出,並隨便利用,一旦這樣做,則可以利用shell做任何事情了,只要你能在console中輸出它。
如何從shell中獲取輸出的內容?兩種方法:
- 反引號符號;
- $();
例如,使用date命令可以輸出當前時間,如果寫shell腳本的話,可以通過如下兩種寫法獲取console的date:
1 date=$(date); 2 date=`date`;
字元串如果合併的話,直接各種引號,而不需要+或者其他的操作,如:
str1="string1"; str2="string2"; str3=$str1$str2;
輸出或引用一個變數,則可以:
echo $str3;
輸出重定向:>
在已有的文件中追加內容:>>
輸入重定向:<
內聯輸入重定向:<<
管道:|
實際上,windows console中也支持管道.
例如,之前用more對console的內容進行分頁:ls -al |more
既然是管道,必然支持很多管道,雖然可能只會用到兩個
shell中計算:expr
例如計算1+2:
expr 1 + 2
#註意上式的空格,運算符間都是有的
arg1 |arg2 | 如果arg1既不是null也不是0,返回arg1;否則arg2 |
ARG1 & ARG2 | 如果沒有參數是null或零值,返回 ARG1 ;否則返回 0 |
< | 如果 ARG1 小於 ARG2 ,返回 1 ;否則返回 0 |
<= | 如果 ARG1 小於或等於 ARG2 ,返回 1 ;否則返回 0 |
= | 如果 ARG1 等於 ARG2 ,返回 1 ;否則返回 0 |
!= | 如果 ARG1 不等於 ARG2 ,返回 1 ;否則返回 0 |
>= | 如果 ARG1 大於或等於 ARG2 ,返回 1 ;否則返回 0 |
> | 如果 ARG1 大於 ARG2 ,返回 1 ;否則返回 0 |
+ | |
- | |
* | |
/ | |
% | |
STRING : REGEXP | 如果 REGEXP 匹配到了 STRING 中的某個模式,返回該模式匹配 |
match STRING REGEXP | 如果 REGEXP 匹配到了 STRING 中的某個模式,返回該模式匹配 |
substr STRING POS LENGTH | 返回起始位置為 POS (從 1 開始計數)、長度為 LENGTH 個字元的子字元串 |
index STRING CHARS | 返回在 STRING 中找到 CHARS 字元串的位置;否則,返回 |
index STRING CHARS | 返回字元串 STRING 的數值長度 |
+ TOKEN | 將 TOKEN 解釋成字元串,即使是個關鍵字 |
(EXPRESSION) | 返回 EXPRESSION 的值 |
需要註意,儘可能的把運算符號之前加上轉義字元,否則很可能會導致expr收到錯誤!
例如 expr 1 * 2
所以,bash shell為了保持跟Bourne shell的相容而包含了 expr 命令,但它同樣也提供了一種更簡單方法來執行數學表達式。在bash中,在將一個數學運算結果賦給某個變數時,可以用美元符和方括弧( $[ operation ] )將數學表達式圍起來。
這樣,就相當方便了,還是1+2,則可以寫成:
$[1+2]
而根本不需要考慮空格的問題~~~
這裡需要註意的是,bash shell本身不支持浮點數運算,所以可以利用其他的方法:
bash計算器:bc;
使用bash需要註意,精度(scale)預設為0,所以需要設置:scale=0
bc本身支持定義變數
在腳本中使用bc:
echo “scale=4;1/2” |bc # 或 echo “scale=4;print 1/2” |bc
更好的方法是使用內聯輸入重定向(<<):
#!/bin/bash var1=10.46 var2=43.67 var3=33.2 var4=71 var5=$(bc << EOF scale = 4 a1 = ( $var1 * $var2) b1 = ($var3 * $var4) a1 + b1 EOF ) echo The final answer for this mess is $var5
## EOF既是輸入的開始,又是輸入的結束,所以計算沒有問題的
腳本退出命令:
exit exitCode
查看退出代碼:
echo $?
退出代碼意圖:
0 命令成功結束 1 一般性未知錯誤 2 不適合的shell命令 126 命令不可執行 127 沒找到命令 128 無效的退出參數 128+x 與Linux信號x相關的嚴重錯誤 130 通過Ctrl+C終止的命令 255 正常範圍之外的退出狀態碼
條件結構:if,then,elif,fi
if command #註意是command不是condition! then commands elif command then commands ... else commands ... if command then commands fi fi #或 if command;then commands fi
test
如何是condition呢?答案是:
test,即if行由command 後面改為:
test condition
數值比較
例如:
ret=1 if test ret -eq 1 then echo ret is 1 fi
至於裡面的-eq,則是判斷條件的一種形式:等於。
test 命令的數值比較功能 |
說明 |
等效 |
n1 -eq n2 |
== | = |
-ge |
>= | >= |
-gt | > | < |
-le | <= | <= |
-lt | < | < |
-ne | != | != |
test的另一種寫法是:
[ condition ]
#註意方括弧都和condition有空格的!!!
例如,將test子例改寫一下,即:
ret=1 if [ ret -eq 1 ] then echo ret is 1 fi
test可以做:
數值比較
字元串比較
文件比較
字元串比較
str1=str2 | == |
!= | |
< | len |
> | len |
-n | len>0 |
-z | len=0 |
特別需要註意容易犯錯誤的地方在於符號會與bash本身的一些符號衝突而導致執行出錯!!!包括:
<,>.
所以要進行轉義,即:
\>,\<.
文件比較
-d file | 存在目錄 |
-e file | exist |
-f file | 存在文件 |
-r file | read |
-s file | 文件空 |
-w file | write |
-x file | execute |
-O file | own |
-G file | group |
file1 -nt file2 | new than |
file1 -ot file2 | old than |
如何簡單的獲取條件判斷時條件的結果呢?
test 1 \= 1;echo $?
上句測試,為真,顯示0
註意:test的兩個參數,不應該在其中計算,而應該在之前的步驟完成,否則可能會得到錯誤的結果!!!(親測)
例如:一定存在$HOME,所以test -e $HOME 必然為真(0)。
但是,假設$HOME中不存在123目錄或文件夾,則test -e $HOME/123依然會返回0.
而按照我寫的註意,寫為x1=$HOME/123;test -e $1;echo $?則會返回1,即真實結果.
所以一定要註意這種情況!
更多的條件:
&&,||
更高級的數值條件:(())
val++ | |
val-- | |
++val | |
--val | |
! | 非 |
~ | 按位非 |
** | 冪 |
<< | |
>> | |
& | 按位與 |
| | 按位或 |
&& | 邏輯與 |
|| | 邏輯或 |
測試過程中,發現,還支持很多操作:==,!=,<,>,<=,>=,+,-,*,/.
此外,(())不需要轉義以及空格!!!
更高級的字元串條件:[[]](20章)
高級功能:regex,
更高級的條件結構:case
case variable in pattern1 | pattern2 ) commands1 ;; pattern3 ) commands2 ;; *) default commands ;; esac
更多的結構化:for
for var in list do commands done
上面所說的list,其實可以是字元串(每個項以空格分開,如果想避免項中有空格,則可以為每個項加一對引號,如果同時存在引號,最好轉義,用另一種引號次之)。
看來,這個for用著還是沒有編程語言的方便,如果想執行100次某些命令,那麼需要生成一個具有100項的列表。
for star in $(ls) do echo "111 $star" done