1. 程式人生 > 資訊 >售價 24.38 萬元,奧迪新款 Q2L e-tron 純電 SUV 正式上市,325 公里續航

售價 24.38 萬元,奧迪新款 Q2L e-tron 純電 SUV 正式上市,325 公里續航

Bash Shell 環境變數

變數 說明
* 含有所有命令列引數(以單個文字值的形式)
@ 含有所有命令列引數(以多個文字值的形式)
# 命令列引數數目
? 最近使用的前臺程序的退出狀態碼
- 當前命令列選項標記
$ 當前shell的程序 ID (PID)
! 最近執行的後臺程序的 PID
0 命令列中使用的命令名稱
_ shell 的絕對路徑名
BASH 用來呼叫 shell 的完整檔名
BASHOPTS 允許冒號分隔列表形式的 Shell 選項
BASHPID 當前 bash shell 的程序 ID
BASH_ALIASED 含有當前所用別名的陣列
BASH_ARGC 當前子函式中的引數數量
BASH_ARGV 含有所有指定命令列引數的陣列
BASH_CMDS 含有命令的內部散列表的陣列
BASH_COMMAND 當前正在被執行的命令名
BASH_ENV 如果設定了的話,每個 bash 指令碼都會嘗試在執行前執行由該變數定義的起始檔案
BASH_EXECUTION_STRING 在 -c 命令列選項中用到的命令
BASH_LINENO 含有指令碼中每個命令的行號的陣列
BASH_REMATCH 含有與指定的正則表示式匹配的文字元素的陣列
BASH_SOURCE 含有 shell 中已宣告函式所在原始檔名的陣列
BASH_SUBSHELL 當前 shell 生成的子 shell 數目
BASH_VERS INFO 含有當前 bash shell 例項的主版本號和次版本號的陣列
BASH_VERS ION 當前 bash shell 例項的版本號
BASH_XTRACEFD 當設定一個有效的檔案描述符整數時,跟蹤輸出生成,並與診斷和錯誤資訊分離開檔案描述符必須設定 -x 啟動
COLUMNS 含有當前 bash shell 例項使用的終端的寬度
COMP_CWORD 含有變數 COMP_WORDS 的索引直,COMP_WORDS 包含當前游標所在的位置
COMP_KEY 呼叫補全功能的按鍵
COMP_LINE 當前命令列
COMP_POINT 當前游標位置相對幹當前命令起始位置的索引
COMP_TYPE 補全型別所對應的整數值
COMP_WORDBREAKS 在進行單詞補全時閈作單詞分隔符的一組字元
COMP_WORDS 含有當前命令列上所有單詞的陣列
COMPREPLY 含有由 shell 函式生成的可能補全碼的陣列
COPROC 含有若干匿名協程 I/O 的檔案描述符的陣列
DIRSTACK 含有目錄棧當前內容的陣列
EMACS 如果設定了該環境變數,則 shell 認為其使用的是 emacs shell 緩衝區,同時禁止行編輯功能
ENV 當 shell 以 POSIX 模式呼叫時,每個 bash 指令碼在執行之前都會執行由該環境變數所定義的起始檔案
EUID 當前使用者的有效使用者 ID(數字形式)
FCEDIT fc 命令使用的預設編輯器
FIGNORE 以冒號分隔的字尾名列表,在檔名補全時會被忽略
FUNCNAME 當前執行的 shell 函式的名稱
FUNCNEST 巢狀函式的最髙層級
GLOBIGNORE 以冒號分隔的模式列表,定義了檔名展開時要忽略的檔名集合
GROUPS 含有當前使用者屬組的陣列
histchars 控制歷史記錄展開的字元(最多可有3個)
HISTCMD 當前命令在歷史記錄中的編號
HISTCONTROL 控制哪些命令留在歷史記錄列表中
HISTFILE 儲存 shell 歷史記錄列表的檔名(預設是 .bash_history)
HISTFILESIZE 儲存在歷史檔案中的最大行數
HISTIGNORE 以冒號分隔的模式列表,用來決定哪些命令不存進歷史檔案
HISTSIZE 最多在歷史檔案中儲存多少條命令
HISTIMEFORMAT 設定後,決定歷史檔案條目的時間戳的格式字串
HOSTFILE 含有 shell 在補全主機名時讀取的檔案的名稱
HOSTNAME 當前主機的名稱
HOSTTYPE 當前執行 bash shell 的機器
IGNOREEOF shell 在退出前必須收到連續的 EOF 字元的數量。如果這個值不存在,預設是 1
INPUTRC readline 初始化檔名(預設是 .inputrc)
LANG shell 的語言環境分類
LC_ALL 定義一個語言環境分類,它會覆蓋 LANG 變數
LC_COLLATE 設定對字串值排序時用的對照表順序
LC_CTYPE 決定在進行檔名擴充套件和模式匹配時,如何解釋其中的字元
LC_MESSAGES 決定解釋前置美元符($)的雙引號字串的語言環境設定
LC_NUMERIC 決定格式化數字時的所使用的語言環境設定
LINENO 指令碼中當前執行程式碼的行號
LINES 定義了終端上可見的行數
MACHTYPE 用“cpu-公司-系統”格式定義的系統型別
MAILCHECK Shell 多久檢視一次新郵件(以秒為單位,預設值是 60)
MAPFILE 含有 mapfile 命令所讀入文字的陣列,當沒有給出變數名的時候,使用該環境變數
OLDPWD shell 之前的工作目錄
OPTERR 設定為 1 時,bash shell 會顯示 getopts 命令產生的錯誤
OSTYPE 定義了 shell 執行的作業系統
PIPESTATUS 含有前臺程序退出狀態碼的陣列
POSIXLY_CORRECT 如果設定了該環境變數,bash 會以 POSIX 模式啟動
PPID bash shell 父程序的 PID
PROMPT_COMMAND 如果設定該環境變數,在顯示命令列主提示符之前會執行這條命令
PS1 主命令列提示符字串
PS2 次命令列提示符字串
PS3 select 命令的提示符
PS4 如果使用了 bash 的 -x 選項,在命令列顯示之前顯示的提示符
PWD 當前工作目錄
RANDOM 返回一個 0~32 767 的隨機數,對其賦值可作為隨機數生成器的種子
READLINE_LINE 儲存了 readline 行緩衝區中的內容
READLINE_POINT 當前 readline 行緩衝區的插入點位置
REPLY read 命令的預設變數
SECONDS 自 shell 啟動到現在的秒數,對其賦值將會重置計時器
SHELL shell 的全路徑名
SHELLOPTS 已啟用 bash shell 選項列表,由冒號分隔
SHLVL 表明 shell 層級,每次啟動一個新的 bash shell 時計數加 1
TIMEFORMAT 指定了 shell 顯示的時間值的格式
TMOUT select 和 read 命令在沒輸入的情況下等待多久(以秒為單位)。預設值為零,表示無限長
TMPDIR 如果設定成目錄名,shell 會將其作為臨時檔案目錄
UID 當前使用者的真實使用者 ID (數字形式)

Shell解析器

Linux提供的Shell解析器

cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/bash
/usr/bin/bash
/bin/rbash
/usr/bin/rbash
/bin/dash
/usr/bin/dash
/usr/bin/tmux
/usr/bin/screen

預設的解析器

echo $SHELL
/bin/bash

Shell指令碼入門

指令碼格式

指令碼以#!/bin/bash開頭(指定解析器)

第一個Shell指令碼:helloworld

建立一個Shell指令碼,輸出helloworld

vim helloworld.sh
#!/bin/bash
echo "helloworld"

指令碼的常用執行方式

採用bash或sh+指令碼的相對路徑或絕對路徑

不用賦予指令碼+x許可權

sh+指令碼的相對路徑

sh helloworld.sh
helloworld

sh+指令碼的絕對路徑

sh /home/owenxuan/helloworld.sh
helloworld

bash+指令碼的相對路徑

bash helloworld.sh
helloworld

bash+指令碼的絕對路徑

bash /home/owenxuan/helloworld.sh
helloworld

採用輸入指令碼的絕對路徑或相對路徑執行指令碼

必須具有可執行許可權+x

首先要賦予helloworld.sh

sudo chmod 777 helloworld.sh

相對路徑執行指令碼

./helloworld.sh 
helloworld

絕對路徑執行指令碼

/home/owenxuan/helloworld.sh 
helloworld
  • 第一種執行方法,本質是bash解析器幫你執行指令碼,所以指令碼本身不需要執行許可權。
  • 第二種執行方法,本質是指令碼需要自己執行,所以需要執行許可權。

第二個Shell指令碼:多命令處理

在/home/owenxuan/目錄下建立一個cls.txt,在cls.txt檔案中增加“I love cls”

vim batch.sh
#!/bin/bash

cd /home/owenxuan
touch cls.txt
echo "I love cls" >>cls.txt

Shell中的變數

系統變數

echo $HOME
/home/owenxuan

自定義變數

基本語法

  • 定義變數:變數=值
  • 撤銷變數:unset 變數
  • 宣告靜態變數:readonly變數,注意:不能unset

變數定義規則

  • 變數名稱可以由字母、數字和下劃線組成,但是不能以數字開頭,環境變數名建議大寫。
  • 等號兩側不能有空格
  • 在bash中,變數預設型別都是字串型別,無法直接進行數值運算。
  • 變數的值如果有空格,需要使用雙引號或單引號括起來。

案例實操

定義變數A

A=5
echo $A
5

給變數A重新賦值

A=8
echo $A
8

撤銷變數A

unset A
echo $A

宣告靜態的變數B=2,不能unset

readonly B=2
echo $B
2
B=9
-bash: B: readonly variable

在bash中,變數預設型別都是字串型別,無法直接進行數值運算

C=1+2
echo $C
1+2

變數的值如果有空格,需要使用雙引號或單引號括起來

D=I love you
-bash: world: command not found
D="I love you"
echo $A
I love you

可把變數提升為全域性環境變數,可供其他Shell程式使用

export 變數名

vim helloworld.sh
#!/bin/bash

echo "helloworld"
echo $B
sh /helloworld.sh 
Helloworld

發現並沒有列印輸出變數B的值

export B
sh /helloworld.sh 
helloworld
2

特殊變數

$n

基本語法

n為數字,$0代表該指令碼名稱,$1-\(9代表第一到第九個引數,十以上的引數,十以上的引數需要用大括號包含,如\){10}

案例實操

vim parameter.sh
#!/bin/bash
echo "$0  $1   $2"
sh parameter.sh cls  xz
parameter.sh  cls   xz

$#

基本語法

獲取所有輸入引數個數,常用於迴圈

案例實操

vim parameter.sh
#!/bin/bash
echo "$0  $1   $2"
echo $#
sh parameter.sh cls  xz
parameter.sh  cls   xz
2

$*

基本語法

這個變數代表命令列中所有的引數,$*把所有的引數看成一個整體

案例實操

vim parameter.sh
#!/bin/bash
echo "$0  $1   $2"
echo $#
echo $*
sh parameter.sh cls  xz 1 2 3
parameter.sh  cls   xz
2
1 2 3

$@

基本語法

這個變數也代表命令列中所有的引數,過$@把每個引數區分對待

案例實操

vim parameter.sh
#!/bin/bash
echo "$0  $1   $2"
echo $#
echo $*
echo $@
sh parameter.sh cls  xz 1 2 3
parameter.sh  cls   xz
2
1 2 3
1 2 3

$?

基本語法

最後一次執行的命令的返回狀態。如果這個變數的值為0,證明上一個命令正確執行;如果這個變數的值為非0(具體是哪個數,由命令自己來決定),則證明上一個命令執行不正確了

案例實操

sh parameter.sh cls  xz 1 2 3
parameter.sh  cls   xz
2
1 2 3
1 2 3
echo $?
0

運算子

基本語法

  • \(((運算式))”或“\)[運算式]”
  • expr + , - , *, /, % 加,減,乘,除,取餘

案例實操

計算3+2的值

expr 2 + 3
5

計算3-2的值

expr 3 - 2
1

計算(2+3)X4的值

expr一步完成計算

expr `expr 2 + 3` \* 4
20

採用$[運算式]方式

S=$[(2+3)*4]
echo $S
20

條件判斷

基本語法

[ condition ](注意condition前後要有空格)

注意:條件非空即為true,[ atguigu ]返回true,[] 返回false。

常用判斷條件

兩個整數之間比較

  • = 字串比較
  • -lt 小於(less than)
  • -le 小於等於(less equal)
  • -eq 等於(equal)
  • -gt 大於(greater than)
  • -ge 大於等於(greater equal)
  • -ne 不等於(Not equal)

按照檔案許可權進行判斷

  • -r 有讀的許可權(read)
  • -w 有寫的許可權(write)
  • -x 有執行的許可權(execute)

按照檔案型別進行判斷

  • -f 檔案存在並且是一個常規的檔案(file)
  • -e 檔案存在(existence)
  • -d 檔案存在並是一個目錄(directory)

案例實操

23是否大於等於22

[ 23 -ge 22 ]
echo $?
0

helloworld.sh是否具有寫許可權

[ -w helloworld.sh ]
echo $?
0

/home/owenxuan/cls.txt目錄中的檔案是否存在

[ -e /home/atguigu/cls.txt ]
echo $?
0

多條件判斷(&& 表示前一條命令執行成功時,才執行後一條命令,|| 表示上一條命令執行失敗後,才執行下一條命令)

[ condition ] && echo OK || echo notok
OK
[ condition ] && [ ] || echo notok
notok

流程控制

if 判斷

基本語法

if [ 條件判斷式 ];then 
  程式 
fi 
或者 
if [ 條件判斷式 ] 
  then 
    程式 
fi

注意:

  • [ 條件判斷式 ],中括號和條件判斷式之間必須有空格
  • if後要有空格

案例實操

輸入一個數字,如果是1,則輸出banzhang zhen shuai,如果是2,則輸出cls zhen mei,如果是其它,什麼也不輸出

vim if.sh
#!/bin/bash

if test $1 -eq "1" 
then
	echo "banzhang zhen shuai"
elif [ $1 -eq "2" ]
then
	echo "cls zhen mei"
fi
bash if.sh 1
banzhang zhen shuai

case 語句

基本語法

case $變數名 in 
  "值1") 
    如果變數的值等於值1,則執行程式1 
    ;; 
  "值2") 
    如果變數的值等於值2,則執行程式2 
    ;; 
  …省略其他分支… 
  *) 
    如果變數的值都不是以上的值,則執行此程式 
    ;; 
esac

注意:

  • case行尾必須為單詞“in”,每一個模式匹配必須以右括號“)”結束。
  • 雙分號“;;”表示命令序列結束,相當於java中的break。
  • 最後的“*)”表示預設模式,相當於java中的default。

案例實操

輸入一個數字,如果是1,則輸出banzhang,如果是2,則輸出cls,如果是其它,輸出renyao

vim case.sh
#!/bin/bash

case $1 in
"1")
	echo "banzhang"
;;

"2")
	echo "cls"
;;
*)
	echo "renyao"
;;
esac
bash case.sh 1
1

for 迴圈

基本語法 1

for (( 初始值;迴圈控制條件;變數變化 )) 
  do 
    程式 
  done

案例實操 1

從1加到100

vim for1.sh
#!/bin/bash
s=0
for((i=0;i<=100;i++))
do
s=$[$s+$i]
done
echo $s
bash for1.sh 
5050

基本語法 2

for 變數 in 值1 值2 值3… 
  do 
    程式 
  done

案例實操 2

列印所有輸入引數

vim for2.sh
#!/bin/bash
#列印數字

for i in $*
do
	echo "ban zhang love $i "
done
bash for2.sh cls xz bd
ban zhang love cls
ban zhang love xz
ban zhang love bd

比較\(*和\)@區別

\(*和\)@都表示傳遞給函式或指令碼的所有引數,不被雙引號“”包含時,都以$1 \(2 …\)n的形式輸出所有引數

vim for.sh
#!/bin/bash

for i in $*
do
	echo "ban zhang love $i "
done

for j in $@
do
	echo "ban zhang love $j"
done
bash for.sh cls xz bd
ban zhang love cls 
ban zhang love xz 
ban zhang love bd 
ban zhang love cls
ban zhang love xz
ban zhang love bd

當它們被雙引號“”包含時,“$*”會將所有的引數作為一個整體,以“$1 \(2 …\)n”的形式輸出所有引數;“$@”會將各個引數分開,以“$1” “\(2”…”\)n”的形式輸出所有引數

vim for.sh
#!/bin/bash

for i in "$*"
do
	echo "ban zhang love $i"
done

for j in "$@"
do
	echo "ban zhang love $j"
done
bash for.sh cls xz bd
ban zhang love cls xz bd
ban zhang love cls
ban zhang love xz
ban zhang love bd

while 迴圈

基本語法

while [ 條件判斷式 ] 
  do 
    程式
  done

案例實操

從1加到100

vim while.sh
#!/bin/bash
s=0
i=1
while [ $i -le 100 ]
do
	s=$[$s+$i]
	i=$[$i+1]
done
echo $s
bash while.sh 
5050

read讀取控制檯輸入

基本語法

read(選項)(引數)
	選項:
-p:指定讀取值時的提示符;
-t:指定讀取值時等待的時間(秒)。
引數
	變數:指定讀取值的變數名

案例實操

vim read.sh
#!/bin/bash

read -t 7 -p "Enter your name in 7 seconds " NAME
echo $NAME
bash read.sh 
Enter your name in 7 seconds owen
owen

函式

系統函式

basename基本語法

basename [string / pathname] [suffix]

功能描述:

basename命令會刪掉所有的字首包括最後一個(‘/’)字元,然後將字串顯示出來

選項:

suffix為字尾,如果suffix被指定了,basename會將pathname或string中的suffix去掉。

案例實操

擷取該/home/owenxuan/banzhang.txt路徑的檔名稱

basename /home/owenxuan/banzhang.txt 
banzhang.txt
basename /home/owenxuan/banzhang.txt .txt
owenxuan

dirname基本語法

dirname 檔案絕對路徑

功能描述:

從給定的包含絕對路徑的檔名中去除檔名(非目錄的部分),然後返回剩下的路徑(目錄的部分)

案例實操

獲取banzhang.txt檔案的路徑

dirname /home/owenxuan/banzhang.txt 
/home/owenxuan

自定義函式

基本語法

[ function ] funname[()]
{
	Action;
	[return int;]
}
funname

經驗技巧

  • 必須在呼叫函式地方之前,先宣告函式,shell指令碼是逐行執行。不會像其它語言一樣先編譯。
  • 函式返回值,只能通過$?系統變數獲得,可以顯示加:return返回,如果不加,將以最後一條命令執行結果,作為返回值。return後跟數值n(0-255)

案例實操

計算兩個輸入引數的和

vim fun.sh
#!/bin/bash
function sum()
{
    s=0
    s=$[ $1 + $2 ]
    echo "$s"
}

read -p "Please input the number1: " n1;
read -p "Please input the number2: " n2;
sum $n1 $n2;
bash fun.sh
Please input the number1: 2
Please input the number2: 5
7

Shell工具

cut

cut的工作就是“剪”,具體的說就是在檔案中負責剪下資料用的。cut 命令從檔案的每一行剪下位元組、字元和欄位並將這些位元組、字元和欄位輸出

基本用法

cut [選項引數]  filename

說明:

預設分隔符是製表符

選項引數說明

選項引數 功能
-f 列號,提取第幾列
-d 分隔符,按照指定分隔符分割列

案例實操

資料準備

vim cut.txt
dong shen
guan zhen
wo  wo
lai  lai
le  le

切割cut.txt第一列

cut -d " " -f 1 cut.txt 
dong
guan
wo
lai
le

切割cut.txt第二、三列

cut -d " " -f 2,3 cut.txt 
shen
zhen
 wo
 lai
 le

在cut.txt檔案中切割出guan

cat cut.txt | grep "guan" | cut -d " " -f 1
guan

選取系統PATH變數值,第2個“:”開始後的所有路徑:

echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/owenxuan/bin
echo $PATH | cut -d: -f 2-
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/owenxuan/bin

切割ifconfig 後列印的IP地址

ifconfig eth0 | grep "inet addr" | cut -d: -f 2 | cut -d" " -f1
10.10.10.30

sed

sed是一種流編輯器,它一次處理一行內容。處理時,把當前處理的行儲存在臨時緩衝區中,稱為“模式空間”,接著用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往螢幕。接著處理下一行,這樣不斷重複,直到檔案末尾。檔案內容並沒有改變,除非你使用重定向儲存輸出。

基本用法

sed [選項引數]  ‘command’  filename

選項引數說明

選項引數 功能
-e 直接在指令列模式上進行sed的動作編輯。

命令功能描述

命令 功能描述
a 新增,a的後面可以接字串,在下一行出現
d 刪除
s 查詢並替換

案例實操

資料準備

vim sed.txt
dong shen
guan zhen
wo  wo
lai  lai

le  le

將“mei nv”這個單詞插入到sed.txt第二行下,列印

sed '2a mei nv' sed.txt 
dong shen
guan zhen
mei nv
wo  wo
lai  lai

le  le
cat sed.txt 
dong shen
guan zhen
wo  wo
lai  lai

le  le

注意:檔案並沒有改變

刪除sed.txt檔案所有包含wo的行

sed '/wo/d' sed.txt
dong shen
guan zhen
ni  ni
lai  lai

le  le

注意:‘g’表示global,全部替換

將sed.txt檔案中的第二行刪除並將wo替換為ni

sed -e '2d' -e 's/wo/ni/g' sed.txt 
dong shen
ni  ni
lai  lai

le  le

awk

一個強大的文字分析工具,把檔案逐行的讀入,以空格為預設分隔符將每行切片,切開的部分再進行分析處理。

基本用法

awk [選項引數] ‘pattern1{action1}  pattern2{action2}...’ filename
  • pattern:表示AWK在資料中查詢的內容,就是匹配模式
  • action:在找到匹配內容時所執行的一系列命令

選項引數說明

選項引數 功能
-F 指定輸入檔案折分隔符
-v 賦值一個使用者定義變數

案例實操

資料準備

sudo cp /etc/passwd ./

搜尋passwd檔案以root關鍵字開頭的所有行,並輸出該行的第7列。

awk -F: '/^root/{print $7}' passwd 
/bin/bash

搜尋passwd檔案以root關鍵字開頭的所有行,並輸出該行的第1列和第7列,中間以“,”號分割。

awk -F: '/^root/{print $1","$7}' passwd 
root,/bin/bash

注意:只有匹配了pattern的行才會執行action

只顯示/etc/passwd的第一列和第七列,以逗號分割,且在所有行前面新增列名user,shell在最後一行新增"dahaige,/bin/zuishuai"。

awk -F : 'BEGIN{print "user, shell"} {print $1","$7} END{print "dahaige,/bin/zuishuai"}' passwd
user, shell
root,/bin/bash
bin,/sbin/nologin
。。。
atguigu,/bin/bash
dahaige,/bin/zuishuai

注意:BEGIN 在所有資料讀取行之前執行;END 在所有資料執行之後執行。

將passwd檔案中的使用者id增加數值1並輸出

awk -v i=1 -F: '{print $3+i}' passwd
1
2
3
4

awk的內建變數

變數 說明
FILENAME 檔名
NR 已讀的記錄數
NF 瀏覽記錄的域的個數(切割後,列的個數)

案例實操

統計passwd檔名,每行的行號,每行的列數

awk -F: '{print "filename:"  FILENAME ", linenumber:" NR  ",columns:" NF}' passwd 
filename:passwd, linenumber:1,columns:7
filename:passwd, linenumber:2,columns:7
filename:passwd, linenumber:3,columns:7

切割IP

ifconfig eth0 | grep "inet addr" | awk -F: '{print $2}' | awk -F " " '{print $1}' 
10.10.10.30

查詢sed.txt中空行所在的行號

awk '/^$/{print NR}' sed.txt 
5

sort

sort命令是在Linux裡非常有用,它將檔案進行排序,並將排序結果標準輸出。

基本語法

sort(選項)(引數)
選項 說明
-n 依照數值的大小排序
-r 以相反的順序來排序
-t 設定排序時所用的分隔字元
-k 指定需要排序的列

引數:指定待排序的檔案列表

案例實操

資料準備

vim sort.sh 
bb:40:5.4
bd:20:4.2
xz:50:2.3
cls:10:3.5
ss:30:1.6

按照“:”分割後的第三列倒序排序。

sort -t : -nrk 3  sort.sh 
bb:40:5.4
bd:20:4.2
cls:10:3.5
xz:50:2.3
ss:30:1.6