【Linux】Shell使用
記錄命令歷史
我們敲過的命令,linux是會有記錄的,預設可以記錄1000條歷史命令。這些命令儲存在使用者的家目錄中的.bash_history檔案中。有一點需要你知道的是,只有當用戶正常退出當前shell時,在當前shell中執行的命令才會儲存至.bash_history檔案中。
與命令歷史有關的有一個有意思的字元那就是”!”了。常用的有這麼幾個應用:(1)!! (連續兩個”!”),表示執行上一條指令;(2)!n(這裡的n是數字),表示執行命令歷史中第n條指令,例如”!100”表示執行命令歷史中第100個命令;(3)!字串(字串大於等於1),例如!ta,表示執行命令歷史中最近一次以ta為開頭的指令。
別名
前面也出現過alias的介紹,這個就是bash所特有的功能之一了。我們可以通過alias把一個常用的並且很長的指令別名一個簡潔易記的指令。如果不想用了,還可以用unalias解除別名功能。直接敲alias會看到目前系統預設的alias :
看到了吧,系統預設的alias指令也就這幾個而已,你也可以自定義你想要的指令別名。alias語法很簡單,alias
[命令別名]=[’具體的命令’]。
作業控制
當執行一個程序時,你可以使它暫停(按Ctrl+z),然後使用fg命令恢復它,利用bg命令使他到後臺執行,你也可以使它終止(按Ctrl+c)。
【變數】
前面章節中筆者曾經介紹過環境變數PATH
除了PATH, HOME, LOGNAME外,系統預設的環境變數還有哪些呢?
使用env命令即可全部列出系統預設的全部系統變量了。不過登入的使用者不一樣這些環境變數的值也不一樣。當前顯示的就是root這個賬戶的環境變量了。下面筆者簡單介紹一下常見的環境變數:
PATH決定了shell將到哪些目錄中尋找命令或程式
HOME當前使用者主目錄
HISTSIZE歷史記錄數
LOGNAME當前使用者的登入名
HOSTNAME指主機的名稱
SHELL前使用者Shell型別
LANG語言相關的環境變數,多語言可以修改此環境變數
MAIL當前使用者的郵件存放目錄
PWD當前目錄
env命令顯示的變數只是環境變數,系統預設的變數其實還有很多,你可以使用set命令把系統預設的全部變數都顯示出來。
限於篇幅,筆者在上例中並沒有把所有顯示結果都截圖。set不僅可以顯示系統預設的變數,也可以連同使用者自定義的變數顯示出來。使用者自定義變數?是的,使用者自己同樣可以定義變數。
雖然你可以自定義變數,但是該變數只能在當前shell中生效,不信你再登入一個shell試試?
使用bash命令即可再開啟一個shell,此時先前設定的myname變數已經不存在了,退出當前shell回到原來的shell,myname變數還在。那要想設定的變數一直生效怎麼辦?有兩種情況:
1)要想系統內所有使用者登入後都能使用該變數
需要在/etc/profile檔案最末行加入 “export myname=Aming” 然後執行”source /etc/profile”就可以生效了。此時你再執行bash命令或者直接su - test賬戶看看。
2)只想讓當前使用者使用該變數
需要在使用者主目錄下的.bashrc檔案最後一行加入“export myname=Aming” 然後執行”source .bashrc”就可以生效了。這時候再登入test賬戶,myname變數則不會生效了。上面用的source命令的作用是,講目前設定的配置重新整理,即不用登出再登入也能生效。
筆者在上例中使用”myname=Aming”來設定變數myname,那麼在linux下設定自定義變數有哪些規則呢?
a. 設定變數的格式為”a=b”,其中a為變數名,b為變數的內容,等號兩邊不能有空格;
b. 變數名只能由英、數字以及下劃線組成,而且不能以數字開頭;
c. 當變數內容帶有特殊字元(如空格)時,需要加上單引號;
有一種情況,需要你注意,就是變數內容中本身帶有單引號,這就需要用到雙引號了。
d. 如果變數內容中需要用到其他命令執行結果則可以使用反引號;
e. 變數內容可以累加其他變數的內容,需要加雙引號;
在這裡如果你不小心把雙引號加錯為單引號,將得不到你想要的結果
通過上面幾個例子也許你能看得出,單引號和雙引號的區別:用雙引號時不會取消掉裡面出現的特殊字元的本身作用(這裡的$),而使用單引號則裡面的特殊字元全部失去它本身的作用。
在前面的例子中筆者多次使用了bash命令,如果在當前shell中執行bash指令後,則會進入一個新的shell,這個shell就是原來shell的子shell了,不妨你用pstree指令來檢視一下。
pstree這個指令會把linux系統中所有程序通過樹形結構打印出來。限於篇幅筆者沒有全部列出,你可以直接輸入pstree檢視即可。在父shell中設定一個變數後,進入子shell後該變數是不會生效的,如果想讓這個變數在子shell中生效則要用到export指令,筆者曾經在前面用過。
export其實就是宣告一下這個變數的意思,讓該shell的子shell也知道變數abc的值是123.如果export後面不加任何變數名,則它會宣告所有的變數。
在最後面連同我們自定義的變數都被聲明瞭。
前面光講如何設定變數,如果想取消某個變數怎麼辦?只要輸入”unset 變數名”即可。
用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的值。
\u就是使用者,\h 主機名, \W 則是當前目錄,\$就是那個’#’了,如果是普通使用者則顯示為’$’
除了兩個系統級別的配置檔案外,每個使用者的主目錄下還有幾個這樣的隱藏檔案:
.bash_profile:定義了使用者的個人化路徑與環境變數的檔名稱。每個使用者都可使用該檔案輸入專用於自己使用的shell資訊,當用戶登入時,該檔案僅僅執行一次。
.bashrc:該檔案包含專用於你的shell的bash資訊,當登入時以及每次開啟新的shell時,該該檔案被讀取。例如你可以將使用者自定義的alias或者自定義變數寫到這個檔案中。
.bash_history:記錄命令歷史用的。
.bash_logout :當退出shell時,會執行該檔案。可以把一些清理的工作放到這個檔案中。
【linux shell中的特殊符號】
你在學習linux的過程中,也許你已經接觸過某個特殊符號,例如”*”,它是一個萬用字元號,代表零個或多個字元或數字。下面筆者就說一說常用到的特殊字元。
1. * :代表零個或多個字元或數字。
test後面可以沒有任何字元,也可以有多個字元,總之有或沒有都能匹配出來。
2. ? :只代表一個任意的字元
不管是數字還是字母,只要是一個都能匹配出來。
3. # :這個符號在linux中表示註釋說明的意思,即”#”後面的內容linux忽略掉。
在命令的開頭或者中間插入”#” ,linux都會忽略掉的。這個符號在shell指令碼中用的很多。
4. \ :脫意字元,將後面的特殊符號(例如”*” )還原為普通字元。
5. | :管道符,前面多次說過,它的作用在於將符號前面命令的結果丟給符號後面的命令。這裡提到的後面的命令,並不是所有的命令都可以的,一般針對文件操作的命令比較常用,例如cat, less, head, tail, grep, cut, sort, wc, uniq, tee, tr, split, sed, awk等等,其中grep, sed, awk為正則表示式必須掌握的工具,在後續內容中詳細介紹。
6. $ :除了用於變數前面的識別符號外,還有一個妙用,就是和’!’結合起來使用。
‘!$’表示上條命中中最後一個變數(也許稱為變數不合適,總之就是上條命令中最後出現的那個東西)例如上邊命令最後是test.txt那麼在當前命令下輸入!$則代表test.txt。
1)grep:過濾一個或多個字元,將會在後續內容中詳細介紹其用法。
2) cut:擷取某一個欄位
語法:cut -d “分隔字元” [-cf] n 這裡的n是數字
-d :後面跟分隔字元,分隔字元要用雙引號括起來
-c :後面接的是第幾個字元
-f :後面接的是第幾個區塊
-d 後面跟分隔字元,這裡使用冒號作為分割字元,-f 1 就是擷取第一段,-f和1之間的空格可有可無。
-c 後面可以是1個數字n,也可以是一個區間n1-n2,還可以是多個數字n1,n2,n3
3) sort:用做排序
語法:sort [-t 分隔符] [-kn1,n2] [-nru] 這裡的n1 < n2
-t 分隔符:作用跟cut的-d一個意思
-n :使用純數字排序
-r :反向排序
-u :去重複
-kn1,n2 :由n1區間排序到n2區間,可以只寫-kn1,即對n1欄位排序
4) wc:統計文件的行數、字元數、詞數,常用的選項為:
-l :統計行數
-m :統計字元數
-w :統計詞數
5) uniq:去重複的行,筆者常用的選項只有一個:
-c :統計重複的行數,並把行數寫在前面
有一點需要注意,在進行uniq之前,需要先用sort排序然後才能uniq,否則你將得不到你想要的,筆者上面的試驗當中已經是排序過所以省略掉那步了。
6)tee :後跟檔名,類似與重定向”>”,但是比重定向多了一個功能,在把檔案寫入後面所跟的檔案中的同時,還顯示在螢幕上。
7)tr :替換字元,常用來處理文件中出現的特殊符號,如DOS文件中出現的^M符號。常用的選項有兩個:
-d :刪除某個字元,-d 後面跟要刪除的字元
-s :把重複的字元去掉
最常用的就是把小寫變大寫: tr ‘[a-z]’ ‘[A-Z]’
當然替換一個字元也是完全可以的。
不過替換、刪除以及去重複都是針對一個字元來講的,有一定侷限性。如果是針對一個字串就不再管用了,所以筆者建議只是簡單瞭解這個tr即可,以後你還會學到更多可以實現針對字串操作的工具。
8)split :切割文件,常用選項:
-b :依據大小來分割文件,單位為byte
格式如上例,後面的passwd為分割後文件名的字首,分割後的檔名為passwdaa, passwdab, passwdac …
-l :依據行數來分割文件
6. ;:分號。平時我們都是在一行中敲一個命令,然後回車就運行了,那麼想在一行中執行兩個或兩個以上的命令如何呢?則需要在命令之間加一個”;”了。
7. ~:使用者的家目錄,如果是root
變量名 right 浮點型 border 測試 solid 操作符 font pad 在Bash shell環境中,可以利用let、(())和[]執行基本的算術操作。而在進行高級操作時,expr和bc這兩個工具就特別有用 let的使用 Script01.sh #!/bin/
在使用gcc編譯keepalived原始碼的時候,需要執行configure生成Makefile,然後用make命令編譯。但是在這個過程中,configure檔案卻一直無法掃描到一個已經安裝的三方庫。無奈,只能檢視configure原始碼。configure其實就是一個shell指令碼,為了
什麼是shell???
Shell是使用者與核心進行互動操作的一種介面,目前最流行的Shell稱為bash Shell;
Shell也是一門程式語言<解釋型的程式語言>,即shell指令碼;
shell的執行方式???
第一種:
首先賦予shell指令碼可執行許可權, 一、概念
shell陣列就是一個元素集合,它把有限個元素用一個名字來命名,然後用編號對他們分割槽。這個名字稱為陣列名,用於區分不同內容的編號稱為陣列的下標。
二、shell陣列的定義與增刪改查
1.shell陣列的定義
方法1:元素之間使用空格分隔,用小括號將元素括起來
# 定義陣列 array=( aa bb cc dd)# 輸出陣列所有元素,或者 ${array[@]} echo ${array[*]} aa bb cc dd# 輸出元素個數
echo ${#array[*]} # 輸出第一個
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)
Shell中資料型別不多,比如說字串,數字型別,陣列。
陣列是其中比較重要的一種,其重要應用場景,可以求陣列長度,元素長度,遍歷其元素,元素切片,替換,刪除等操作,使用非常方便。
Shell中的陣列不像JAVA/C,只能是一維陣列,沒有二維陣列;陣列元素大小無約束,也無需先定義陣
寫一個指令碼
依次向/etc/passwd中的每個使用者問好,並且說出對方的ID是什麼
例如:Hello root, your UID is0.
方法1:使用awk指定分隔符
cat /etc/passwd | awk -F ":" '{print "H
最近一個專案需要寫一個batch定時讀取檔案往資料庫裡插入記錄,第一次寫,遇到好多問題,記錄一下。
先從shell如何呼叫java說起
建立如下目錄結構
batch 根目錄
├── bin
記錄命令歷史
我們敲過的命令,linux是會有記錄的,預設可以記錄1000條歷史命令。這些命令儲存在使用者的家目錄中的.bash_history檔案中。有一點需要你知道的是,只有當用戶正常退出當前sh
#include <stdio.h>
#include <string.h>
void executeCMD(const char *cmd, char *result)
{
char buf_ps[1024];
char ps[
Shell
一、shell的由來
如果作業系統直接和使用者進行溝通的話,在安全性和使用難度上都會增加很大的難度級,因此我們在他倆之間增加一個媒介–shell。
二、定義
包括在命令列linux下
Shell指令碼語言中也有函式功能,可以幫助我們簡化很多程式碼。下面看一個例子。
建立一個檔案,輸入一下內容
#!/bin/bash
function printit()
{
echo
一、shell指令碼的建立和執行linux操作如下: $ touch test.sh //建立.sh檔案 $ vi test.sh //vi進入.sh檔案鍵入i進入輸入模式, //一些vi或vim編輯器的操作在寫指令碼的時候會用到第一步:插入 #!/bin ssh username 英文 認識 exe 無法找到 usr 過去 操作 使用expect實現自動登錄的腳本,網上有很多,可是都沒有一個明白的說明,初學者一般都是照抄、收藏。可是為什麽要這麽寫卻不知其然。本文用一個最短的例子說明腳本的原理。 腳本代碼如下: ##### 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
定義:一種終端直譯器,可以作為使用者與作業系統內部通訊的媒介,支援變數、引數、迴圈、分支等功能特性
Shell指令碼命令的工作方式:
互動式(interactive):使用者輸入一條指令就立即執行;// 例如,在命令列視窗輸入 pwd 命令,該命令就被執行並顯示當
1.shell原理
shell就是運用程式替換的原理進行實現的。
何為程式替換?
假如作業系統正在執行某一個程式,然後我們利用程式替換函 數指定一個新的程式,讓作業系統去執行我們新指定的程式。也就是這樣一種情形下,我們fork一個程序,如果for 用戶 ebs pass ron 登陸 就是 當前 環境 宋體 常見的操作系統下的shell:Linux下默認的shell是Bourne Again shell(bash)Solaris和FreeBSD下默認的是Bourne shell(sh)AIX系統下默認的是Kirn s
使用SHELL指令碼重複執行ls命令並將結果寫入檔案
1、編寫shell指令碼,存在/root/下,ls.sh
date >> ls.txt 2>&1
while (true)
do
ls -l -k hhhhh >>ls.txt 相關推薦
【Linux】shell數學運算
【linux】shell指令碼除錯技術
【linux】 --- shell程式設計基礎
【Linux】shell陣列
【Linux】Shell - 陣列練習
【Linux】Shell - 字串中插入字元
【Linux】Shell - 陣列操作
【Linux】Shell - 指令碼練習 - 擷取檔案內容
【Linux】shell呼叫Java程式main方法通過crontab定時執行
【Linux】Shell使用
【c/c++】如何呼叫【linux】shell命令列命令並獲取命令列的輸出內容
【linux】--shell和linux許可權管理
【Linux】shell---函式的簡單例子
【linux】shell指令碼(一)
【轉】shell expect spawn、linux expect 用法小記 看著舒服點
【Linux】【Shell】【Basic】一行代碼解決常見問題
【Linux】【Shell直譯器使用小結】
【Linux】實現一個簡單的shell
【Linux】常見Linux默認的shell
【Linux】使用SHELL指令碼實時檢視檔案大小