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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...