1. 程式人生 > >【Linux】Shell使用

【Linux】Shell使用

記錄命令歷史

我們敲過的命令,linux是會有記錄的,預設可以記錄1000條歷史命令這些命令儲存在使用者的家目錄中的.bash_history檔案中有一點需要你知道的是,只有當用戶正常退出當前shell時,在當前shell中執行的命令才會儲存至.bash_history檔案中

與命令歷史有關的有一個有意思的字元那就是”!”常用的有這麼幾個應用:(1!! (連續兩個”!”),表示執行上一條指令;(2!n(這裡的n是數字),表示執行命令歷史中第n條指令,例如”!100”表示執行命令歷史中第100個命令;(3!字串(字串大於等於1),例如!ta,表示執行命令歷史中最近一次以ta為開頭的指令

[image]

別名

前面也出現過alias的介紹,這個就是bash所特有的功能之一了我們可以通過alias把一個常用的並且很長的指令別名一個簡潔易記的指令如果不想用了,還可以用unalias解除別名功能直接敲alias會看到目前系統預設的alias 

[image]

看到了吧,系統預設的
alias指令也就這幾個而已,你也可以自定義你想要的指令別名。alias語法很簡單,alias [命令別名]=[’具體的命令’]。

作業控制

當執行一個程序時,你可以使它暫停(按Ctrl+z),然後使用fg命令恢復它,利用bg命令使他到後臺執行,你也可以使它終止(按Ctrl+c

變數

前面章節中筆者曾經介紹過環境變數PATH

,這個環境變數就是shell預設的一個變數,通常shell預設的變數都是大寫的變數,說簡單點就是使用一個較簡單的字串來替代某些具有特殊意義的設定以及資料就拿PATH來講,這個PATH就代替了所有常用命令的絕對路徑的設定因為有了PATH這個變數,所以我們執行某個命令時不再去輸入全域性路徑,直接敲命令名即可你可以使用echo命令顯示變數的值

[image]

除了PATH, HOME, LOGNAME外,系統預設的環境變數還有哪些呢?

[image]

使用env命令即可全部列出系統預設的全部系統變量了不過登入的使用者不一樣這些環境變數的值也不一樣當前顯示的就是root這個賬戶的環境變量了下面筆者簡單介紹一下常見的環境變數:

PATH決定了shell將到哪些目錄中尋找命令或程式

HOME當前使用者主目錄

HISTSIZE歷史記錄數

LOGNAME當前使用者的登入名

HOSTNAME指主機的名稱

SHELL前使用者Shell型別

LANG語言相關的環境變數,多語言可以修改此環境變數

MAIL當前使用者的郵件存放目錄

PWD當前目錄

env命令顯示的變數只是環境變數,系統預設的變數其實還有很多,你可以使用set命令把系統預設的全部變數都顯示出來

[image]

限於篇幅,筆者在上例中並沒有把所有顯示結果都截圖。set不僅可以顯示系統預設的變數,也可以連同使用者自定義的變數顯示出來使用者自定義變數?是的,使用者自己同樣可以定義變數

[image]

雖然你可以自定義變數,但是該變數只能在當前shell中生效,不信你再登入一個shell試試?

[image]

使用bash命令即可再開啟一個shell,此時先前設定的myname變數已經不存在了,退出當前shell回到原來的shellmyname變數還在那要想設定的變數一直生效怎麼辦?有兩種情況:

1要想系統內所有使用者登入後都能使用該變數

需要在/etc/profile檔案最末行加入 “export myname=Aming” 然後執行”source /etc/profile”就可以生效了此時你再執行bash命令或者直接su - test賬戶看看

[image]

2)只想讓當前使用者使用該變數

需要在使用者主目錄下的.bashrc檔案最後一行加入“export myname=Aming” 然後執行”source .bashrc”就可以生效了這時候再登入test賬戶,myname變數則不會生效了上面用的source命令的作用是,講目前設定的配置重新整理,即不用登出再登入也能生效

筆者在上例中使用”myname=Aming”來設定變數myname,那麼在linux下設定自定義變數有哪些規則呢?

a. 設定變數的格式為”a=b”,其中a為變數名,b為變數的內容,等號兩邊不能有空格;

b. 變數名只能由英數字以及下劃線組成,而且不能以數字開頭;

c. 當變數內容帶有特殊字元(如空格)時,需要加上單引號;

[image]

有一種情況,需要你注意,就是變數內容中本身帶有單引號,這就需要用到雙引號了

[image]

d. 如果變數內容中需要用到其他命令執行結果則可以使用反引號;

[image]

e. 變數內容可以累加其他變數的內容,需要加雙引號;

[image]

在這裡如果你不小心把雙引號加錯為單引號,將得不到你想要的結果

[image]

通過上面幾個例子也許你能看得出,單引號和雙引號的區別:用雙引號時不會取消掉裡面出現的特殊字元的本身作用(這裡的$),而使用單引號則裡面的特殊字元全部失去它本身的作用

在前面的例子中筆者多次使用了bash命令,如果在當前shell中執行bash指令後,則會進入一個新的shell,這個shell就是原來shell的子shell了,不妨你用pstree指令來檢視一下

[image]

pstree這個指令會把linux系統中所有程序通過樹形結構打印出來限於篇幅筆者沒有全部列出,你可以直接輸入pstree檢視即可在父shell中設定一個變數後,進入子shell後該變數是不會生效的,如果想讓這個變數在子shell中生效則要用到export指令,筆者曾經在前面用過

[image]

export其實就是宣告一下這個變數的意思,讓該shell的子shell也知道變數abc的值是123.如果export後面不加任何變數名,則它會宣告所有的變數

[image]

在最後面連同我們自定義的變數都被聲明瞭

前面光講如何設定變數,如果想取消某個變數怎麼辦?只要輸入”unset 變數名即可

[image]

unset abc後,再echo $abc則不再輸出任何內容

系統環境變數與個人環境變數的配置檔案

上面講了很多系統的變數,那麼在linux系統中,這些變數被存到了哪裡呢,為什麼使用者一登陸shell就自動有了這些變數呢?

/etc/profile:這個檔案預設了幾個重要的變數,例如PATH, USER, LOGNAME, MAIL, INPUTRC, HOSTNAME, HISTSIZE, umas等等

/etc/bashrc :這個檔案主要預設umask以及PS1。這個PS1就是我們在敲命令時,前面那串字元了,例如筆者的linux系統PS1就是 [[email protected] ~]# ,你不妨看一下PS1的值

[image]

\u就是使用者,\h 主機名, \W 則是當前目錄,\$就是那個’#’了,如果是普通使用者則顯示為’$’

除了兩個系統級別的配置檔案外,每個使用者的主目錄下還有幾個這樣的隱藏檔案:

.bash_profile:定義了使用者的個人化路徑與環境變數的檔名稱每個使用者都可使用該檔案輸入專用於自己使用的shell資訊,當用戶登入時,該檔案僅僅執行一次

.bashrc:該檔案包含專用於你的shellbash資訊,當登入時以及每次開啟新的shell,該該檔案被讀取例如你可以將使用者自定義的alias或者自定義變數寫到這個檔案中

.bash_history:記錄命令歷史用的

.bash_logout :當退出shell時,會執行該檔案可以把一些清理的工作放到這個檔案中

linux shell中的特殊符號

你在學習linux的過程中,也許你已經接觸過某個特殊符號,例如”*”,它是一個萬用字元號,代表零個或多個字元或數字下面筆者就說一說常用到的特殊字元

1. * :代表零個或多個字元或數字

[image]

test後面可以沒有任何字元,也可以有多個字元,總之有或沒有都能匹配出來

2. ? :只代表一個任意的字元

[image]

不管是數字還是字母,只要是一個都能匹配出來

3. # :這個符號在linux中表示註釋說明的意思,即”#”後面的內容linux忽略掉

[image]

在命令的開頭或者中間插入”#” linux都會忽略掉的這個符號在shell指令碼中用的很多

4. \ :脫意字元,將後面的特殊符號(例如”*” )還原為普通字元

[image]

5. | :管道符,前面多次說過,它的作用在於將符號前面命令的結果丟給符號後面的命令這裡提到的後面的命令,並不是所有的命令都可以的,一般針對文件操作的命令比較常用,例如cat, less, head, tail, grep, cut, sort, wc, uniq, tee, tr, split, sed, awk等等,其中grep, sed, awk為正則表示式必須掌握的工具,在後續內容中詳細介紹

6. $ :除了用於變數前面的識別符號外,還有一個妙用,就是和’!’結合起來使用

[image]

‘!$’表示上條命中中最後一個變數(也許稱為變數不合適,總之就是上條命令中最後出現的那個東西)例如上邊命令最後是test.txt那麼在當前命令下輸入!$則代表test.txt。

1grep:過濾一個或多個字元,將會在後續內容中詳細介紹其用法

[image]

2) cut:擷取某一個欄位

語法:cut -d “分隔字元” [-cf] n 這裡的n是數字

-d :後面跟分隔字元,分隔字元要用雙引號括起來

-c :後面接的是第幾個字元

-f :後面接的是第幾個區塊

[image]

-d 後面跟分隔字元,這裡使用冒號作為分割字元,-f 1 就是擷取第一段,-f1之間的空格可有可無

[image]

-c 後面可以是1個數字n,也可以是一個區間n1-n2,還可以是多個數字n1,n2,n3

[image]

3) sort:用做排序

語法:sort [-t 分隔符] [-kn1,n2] [-nru] 這裡的n1 < n2

-t 分隔符:作用跟cut-d一個意思

-n :使用純數字排序

-r :反向排序

-u :去重複

-kn1,n2 :由n1區間排序到n2區間,可以只寫-kn1,即對n1欄位排序

[image]

[image]

[image]

4) wc:統計文件的行數字元數詞數,常用的選項為:

-l :統計行數

-m :統計字元數

-w :統計詞數

[image]

5 uniq:去重複的行,筆者常用的選項只有一個:

-c :統計重複的行數,並把行數寫在前面

[image]

有一點需要注意,在進行uniq之前,需要先用sort排序然後才能uniq,否則你將得不到你想要的,筆者上面的試驗當中已經是排序過所以省略掉那步了

6tee :後跟檔名,類似與重定向”>”,但是比重定向多了一個功能,在把檔案寫入後面所跟的檔案中的同時,還顯示在螢幕上

[image]

7tr :替換字元,常用來處理文件中出現的特殊符號,如DOS文件中出現的^M符號常用的選項有兩個:

-d :刪除某個字元,-d 後面跟要刪除的字元

-s :把重複的字元去掉

最常用的就是把小寫變大寫: tr ‘[a-z]’ ‘[A-Z]’

[image]

當然替換一個字元也是完全可以的

[image]

不過替換刪除以及去重複都是針對一個字元來講的,有一定侷限性如果是針對一個字串就不再管用了,所以筆者建議只是簡單瞭解這個tr即可,以後你還會學到更多可以實現針對字串操作的工具

[image]

8split :切割文件,常用選項:

-b :依據大小來分割文件,單位為byte

[image]

格式如上例,後面的passwd為分割後文件名的字首,分割後的檔名為passwdaa, passwdab, passwdac …

-l :依據行數來分割文件

[image]

6. :分號平時我們都是在一行中敲一個命令,然後回車就運行了,那麼想在一行中執行兩個或兩個以上的命令如何呢?則需要在命令之間加一個”;”

[image]

7. ~:使用者的家目錄,如果是root

相關推薦

Linuxshell數學運算

變量名 right 浮點型 border 測試 solid 操作符 font pad 在Bash shell環境中,可以利用let、(())和[]執行基本的算術操作。而在進行高級操作時,expr和bc這兩個工具就特別有用 let的使用 Script01.sh #!/bin/

linuxshell指令碼除錯技術

在使用gcc編譯keepalived原始碼的時候,需要執行configure生成Makefile,然後用make命令編譯。但是在這個過程中,configure檔案卻一直無法掃描到一個已經安裝的三方庫。無奈,只能檢視configure原始碼。configure其實就是一個shell指令碼,為了

linux --- shell程式設計基礎

什麼是shell??? Shell是使用者與核心進行互動操作的一種介面,目前最流行的Shell稱為bash Shell; Shell也是一門程式語言<解釋型的程式語言>,即shell指令碼; shell的執行方式??? 第一種: 首先賦予shell指令碼可執行許可權,

Linuxshell陣列

一、概念     shell陣列就是一個元素集合,它把有限個元素用一個名字來命名,然後用編號對他們分割槽。這個名字稱為陣列名,用於區分不同內容的編號稱為陣列的下標。 二、shell陣列的定義與增刪改查 1.shell陣列的定義 方法1:元素之間使用空格分隔,用小括號將元素括起來

LinuxShell - 陣列練習

# 定義陣列 array=( aa bb cc dd)# 輸出陣列所有元素,或者 ${array[@]} echo ${array[*]}   aa bb cc dd# 輸出元素個數 echo ${#array[*]}  # 輸出第一個

LinuxShell - 字串中插入字元

str="20171125" $ echo ${str:0:4}-${str:4:2}-${str:6} 2017-11-25 取子串 * $ var="get length of me" $ echo ${var:0:3} get $ echo ${var(-2)

LinuxShell - 陣列操作

Shell中資料型別不多,比如說字串,數字型別,陣列。 陣列是其中比較重要的一種,其重要應用場景,可以求陣列長度,元素長度,遍歷其元素,元素切片,替換,刪除等操作,使用非常方便。 Shell中的陣列不像JAVA/C,只能是一維陣列,沒有二維陣列;陣列元素大小無約束,也無需先定義陣

LinuxShell - 指令碼練習 - 擷取檔案內容

寫一個指令碼 依次向/etc/passwd中的每個使用者問好,並且說出對方的ID是什麼 例如:Hello root, your UID is0. 方法1:使用awk指定分隔符 cat /etc/passwd | awk -F ":" '{print "H

Linuxshell呼叫Java程式main方法通過crontab定時執行

最近一個專案需要寫一個batch定時讀取檔案往資料庫裡插入記錄,第一次寫,遇到好多問題,記錄一下。 先從shell如何呼叫java說起 建立如下目錄結構 batch                          根目錄 ├── bin                

LinuxShell使用

記錄命令歷史 我們敲過的命令,linux是會有記錄的,預設可以記錄1000條歷史命令。這些命令儲存在使用者的家目錄中的.bash_history檔案中。有一點需要你知道的是,只有當用戶正常退出當前sh

c/c++如何呼叫linuxshell命令列命令並獲取命令列的輸出內容

#include <stdio.h> #include <string.h> void executeCMD(const char *cmd, char *result) { char buf_ps[1024]; char ps[

linux--shelllinux許可權管理

Shell 一、shell的由來 如果作業系統直接和使用者進行溝通的話,在安全性和使用難度上都會增加很大的難度級,因此我們在他倆之間增加一個媒介–shell。 二、定義 包括在命令列linux下

Linuxshell---函式的簡單例子

Shell指令碼語言中也有函式功能,可以幫助我們簡化很多程式碼。下面看一個例子。 建立一個檔案,輸入一下內容 #!/bin/bash function printit() { echo

linuxshell指令碼(一)

一、shell指令碼的建立和執行linux操作如下:   $ touch test.sh //建立.sh檔案    $ vi test.sh //vi進入.sh檔案鍵入i進入輸入模式,      //一些vi或vim編輯器的操作在寫指令碼的時候會用到第一步:插入 #!/bin

shell expect spawn、linux expect 用法小記 看著舒服點

ssh username 英文 認識 exe 無法找到 usr 過去 操作 使用expect實現自動登錄的腳本,網上有很多,可是都沒有一個明白的說明,初學者一般都是照抄、收藏。可是為什麽要這麽寫卻不知其然。本文用一個最短的例子說明腳本的原理。 腳本代碼如下:  #####

LinuxShellBasic一行代碼解決常見問題

then 一行代碼 for seq 解決 one use done shel 1. 查看可用IP for i in `seq 1 255`; do ping -c 1 10.210.55.$i >> /dev/null; if [ $? -eq 1 ]; th

LinuxShell直譯器使用小結

定義:一種終端直譯器,可以作為使用者與作業系統內部通訊的媒介,支援變數、引數、迴圈、分支等功能特性 Shell指令碼命令的工作方式: 互動式(interactive):使用者輸入一條指令就立即執行;// 例如,在命令列視窗輸入  pwd 命令,該命令就被執行並顯示當

Linux實現一個簡單的shell

1.shell原理 shell就是運用程式替換的原理進行實現的。 何為程式替換? 假如作業系統正在執行某一個程式,然後我們利用程式替換函 數指定一個新的程式,讓作業系統去執行我們新指定的程式。也就是這樣一種情形下,我們fork一個程序,如果for

Linux常見Linux默認的shell

用戶 ebs pass ron 登陸 就是 當前 環境 宋體 常見的操作系統下的shell:Linux下默認的shell是Bourne Again shell(bash)Solaris和FreeBSD下默認的是Bourne shell(sh)AIX系統下默認的是Kirn s

Linux使用SHELL指令碼實時檢視檔案大小

使用SHELL指令碼重複執行ls命令並將結果寫入檔案 1、編寫shell指令碼,存在/root/下,ls.sh date >> ls.txt 2>&1 while (true) do ls -l -k hhhhh >>ls.txt