linux shell筆記

来源:https://www.cnblogs.com/absudra/archive/2018/09/02/9572706.html
-Advertisement-
Play Games

touch 創建空文件(當然,你也可以使用echo >filename)ln 創建鏈接符號(快捷方式|引用):符號鏈接:ln –s硬鏈接:ln區別:符號鏈接產生了一個快捷方式,是對源文件的一個鏈接。硬鏈接是底層位元組的鏈接,簡單來說,相當於是一個文件,兩個文件名,占用同一塊扇區,好處是省空間,即便刪除... ...


1.基本命令

touch 創建空文件(當然,你也可以使用echo >filename)

ln 創建鏈接符號(快捷方式|引用):

  1. 符號鏈接:ln –s
  2. 硬鏈接:ln

 

區別:

  1. 符號鏈接產生了一個快捷方式,是對源文件的一個鏈接。
  2. 硬鏈接是底層位元組的鏈接,簡單來說,相當於是一個文件,兩個文件名,占用同一塊扇區,好處是省空間,即便刪除一個,只要還有硬連接,這個文件就依然存在。

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中獲取輸出的內容?兩種方法:

  1. 反引號符號;
  2. $();

 例如,使用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
#註意上式的空格,運算符間都是有的
表11-1 expr 命令操作符
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可以做:

 數值比較
 字元串比較
 文件比較

字元串比較

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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 微信退款需要證書 data為已封裝好的xml數據 具體怎麼封裝>打開 ...
  • 在winForm窗體中綁定(註冊)事件的方法有兩種: 一、綁定事件 雙擊控制項,即進入.cs的代碼編輯頁面,會出現 類似於“ private void 控制項名稱_Click(object sender, DataGridViewCellEventArgs e){ } 的方法”,在”{ }“中添加邏輯代 ...
  • 最近需要對一個文件進行數量的分割,因為數據量龐大,所以就想到了通過寫程式來處理。將代碼貼出來以備以後使用。 //讀取文件的內容 放置於StringBuilder 中 StreamReader sr = new StreamReader(path, Encoding.Default); String ...
  • 根據GUID+DateTime.Now.Ticks生產唯一訂單號 ...
  • 前言 昨天和一個技術比較好的前輩聊了聊,發現有的時候自己的學習方式有些問題,不知道有沒有和我一樣的越學習越感覺到知識的匱乏不過能認識到這個問題的同學們,也不要太心急路是一步一步走的飯是一口一口吃的認識到錯誤才能更高的改進錯誤,腳踏實地只要有上勁學習的心,終會有所成就。認識到自己薄弱的地方進行學習,要 ...
  • 一、字元串 通過string定義一個字元串,或者通過String類來創建對象。 通過new String() 創建有一下幾種構造函數(從元數據),以此順序創建string; // // 摘要: // 將 System.String 類的新實例初始化為由 Unicode 字元數組指示的值。 // // ...
  • 先新建一個過濾器ExceptionHandleErrorAttribute.cs 內容如下: 1 using System; 2 using System.Net; 3 using System.Web; 4 using System.Web.Mvc; 5 using ABBPMP.Utility. ...
  • Supervision,字面意思是監督,是父Actor發現子Actor有異常發生後,對子Actor產用保種策略處理的機制,如果父Actor不處理,則往上傳遞。 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...