1. 程式人生 > >bash shell學習的記錄(一)

bash shell學習的記錄(一)

1,什麼是bash shell

在linux核心下,無論什麼版本的linux發行版,都會有下列的shell支援。BASH,CSH,TCSH,ZSH,SCSH. 這些shell都是由最初的shell發展而來的。你可以參考如下的框架圖理解。

USER RequestShellLinux kernalComputer hardwareApplication

通過上面的關係圖,可以清楚的明白,shell是使用者需求和linux核心之間的一個轉換媒介,使用者為了讓linux系統處理使用者的需求完成特定的任務,使用者可以編寫shell,執行shell程式就能實現與linux核心之間的互動,linux核心與計算機的底層硬體之間存在雙向的互動,從而實現控制硬體的功能。shell語言是一種命令列語言的互動。

2,CLI(commond line interface),命令列互動

shell語言提供與linux核心之間的互動,這樣我們就可以通過命令列鍵入命令就可以實現與linux的互動。

2.1 怎麼找到當前的shell 型別

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

因為我使用的是ubuntu系統而且安裝了tmux工具,所以會有/usr/bin/tmux。你可能會沒有,這裡,每個人的情況可能都不相同。當時學習的是bash,支援bash即可。

2.2 基礎的命令列快捷鍵

快捷鍵 含義
CTRL-L 清除命令視窗
CTRL-W 刪除當前命令列中游標所在位置的一個單詞
CTRL-U 刪除當前命令列一行的全部內容
CTRL-R 搜尋之前使用過的命令
CTRL-C 取消當前正在執行的命令

例如,你可以在命令列輸入date命令。

$ date
>>
2018年 11月 26日 星期一 09:16:14 CST

這是當你輸入快捷鍵 CTRL+L則命令視窗會被清空!,你可一不斷嘗試理解上面表格的命令含義。

2.3 ,在linux中獲得命令的幫助

如果你使用過python,matlab你會很清除的理解help是什麼。當你不知道**某一和函式或者關鍵詞

**的意義或者怎麼使用時,你可以使用help等指令,在linux中你可以在命令列中使用如下三種方式檢視某一個指令的含義和使用方式

man date
info date
date --help

3, shell 程式設計的大體流程總結

3.1 type 命令

type命令是用來找出一個命令,它是屬於內嵌(build-in)還是外部的二進位制可執行檔案
例如,

$ type -a ls
>>
ls is aliased to `ls --color=auto'
ls is /bin/ls
$ type -a date 
>>
date is hashed (/bin/date)
$ type -a history
>>
history is a shell builtin
$ type -a echo
>>
echo is a shell builtin
echo is /bin/echo

等等命令,都可以使用type命令檢視它的型別。這裡

#  -a,a是值all的意思
$ type -a

3.2 起手“Hello,world!”

  1. 開啟一個命令列,通過ctrl+alt+t.
  2. 進入你學習bash自己建立的資料夾內,建立一個bash檔案,比如 vim begin00.sh 當然字尾名.sh不一定是必要的,當時為了區分不造成誤解,我就加上了。
  3. 在檔案第一行輸入#! /bin/bash

因為我比較習慣使用vim編輯器,所以我都會一直使用vim建立或者開啟一個檔案,當然你可以使用gedit等其他編譯器做同樣的操作。
如果你像學習vim可以參考這兩篇文章,

言歸正傳,你的檔案應該是這樣的

#! /bin/bash
echo "Hello, world!"

關於第一句#!/bin/bash,#是註釋,!是特殊字元告訴編譯器去下面的位置對應的編譯器對該檔案一下全部內容作解釋。你可以通過type命令檢視bash的位置

$ type -a bash
>>
bash is /bin/bash

第二句使用了echo命令,就是輸出雙引號中的全部內容。

3.3 bash檔案設定成可執行檔案,執行bash程式

$ chmod +x "你的檔案存放的路徑"/"檔名"
#for instance
$ chmod +x ~/Public/bash_lerning/begin00.sh

然後開啟一個命令視窗,執行程式,有下面三種方法:

$ . "檔案路徑"/"檔名"
$ ./"檔案路徑"/"檔名"
$ bash /"檔案路徑"/"檔名"

例如,

$ . ~/Public/base_learning/begin00.sh
>>
Hello, world!

如果不設定可執行檔案即不執行3.3操作,則直接執行bash檔案會提示:bash: “檔案”: Permission denied

3.4 debug bash script

有5種方式,對bash 指令碼進行debug

$ bash -x bash-name  #第一種
$ bash -xv bash-name   #第二種

第3種方式,在bash檔案中設定

#! /bin/bash -x

第4種方式,在bash檔案中設定

#! /bin/bash
## Turn on debug mode##
set -x
...
...
...
##Turn off debug mode##
set +x

第5種

#!/bin/bash -x
set -n     #只閱讀bash程式,不執行程式
set -o noexec

第5種方式一般用來檢查bash檔案的是否存在語法錯誤

4, shell中的變數

4.1 系統變數

可以通過如下3種指令檢視系統變數

$ set
$ env
$ printenv

4.2 bash shell的變數

4.2.1 bash shell的變數語法是:

varName=someValue
注意等號兩邊都不能加空格,這和python,matlab等語言的語法規則很不相同
舉個栗子:

#! /bin/bash
var1="hello, world"
var2 = 123
echo "var1= ${var1}"
echo "var2= ${var2}"

在命令列中執行如下操作

chmod +x begin00.sh
./begin00.sh
>>
./begin00.sh: line 3: var2: command not found
var1= hello, world!
var1= 

bash編譯器解釋時,會認為等號左邊帶空格的var2是一個cmd命令,因此報錯,但是var1是完全正確的。這也就是bash變數的使用方法。

${varName}----推薦
$varName ------不推薦,容易產生誤解。

4.2.2 怎麼顯示(列印)變數的值

兩種方法,一種是echo,一種是C++語言的風格的printf。
語法

echo "${varName}"
print "${varName}"  #printf中的使用方法和C++中的一致

繼續一上面的例子說明,

#! /bin/bash
var1="hello, world!"
var2=123
echo "var1= ${var1}"
printf "var2= %d\n" ${var2}

執行程式:

$ ./begin00.sh 
>>
var1= hello, world!
var2= 123

4.2.3 bash shell 中變數的預設值

語法

echo ${varName=somevalue1 somevalue1}   #第1種

或者

echo ${varName:=somevalue1 somevalue1}  #第2種

或者

echo ${varName-somevalue1 somevalue1}   #第3種

雖然這三種都可以賦予預設值,當時1,2兩種是區別於第3種的,舉個栗子:

echo ${var3:=34 56}
echo ${var4-23 45 78}
echo ${var5=-23 -45}
echo ${var3}
echo ${var4}
echo ${var5}

執行結果,如下:

./begin00.sh 
34 56
23 45 78
-23 -45
34 56

-23 -45

對應程式碼可知,使用第3種方式給變數的預設值,在使用一次後,會立即釋放,相當於執行了unset指令,而第1,2兩種方法會一直儲存在變數中。

4.3 自行程式碼分析

下面貼出一部分程式碼和執行結果,供學習分析,比較簡單的入門:

#! /bin/bash

#================================================================
#   Copyright (C) 2018 * Ltd. All rights reserved.
#
#   File name   : begin01.sh
#   Author      : simileciWH
#   Email       : [email protected]
#   Created date: 2018-11-14 10:44:55
#   Description : code is far away from bugs with the god animal protecting
#
#================================================================

echo hello world
echo "hello world"
echo "Current data: $(date) @ $(hostname)"
echo "Network configuration"
/sbin/ifconfig
pwd
/bin/pwd
echo "Hello, ${LOGNAME}"
echo "Today is $(date)"
echo "Users currently on the machine, and their processes:"
w		#use man w to help yourself

執行結果:

hello world
hello world
Current data: 2018年 11月 26日 星期一 11:27:52 CST @ pcMaster
Network configuration
enp7s0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether 28:d2:44:35:bc:85  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 19  

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 2786  bytes 424414 (424.4 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2786  bytes 424414 (424.4 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlp8s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.31.129  netmask 255.255.255.0  broadcast 192.168.31.255
        inet6 fe80::c363:6e0f:c564:4f4f  prefixlen 64  scopeid 0x20<link>
        ether a4:db:30:bf:8d:c1  txqueuelen 1000  (Ethernet)
        RX packets 295059  bytes 332704942 (332.7 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 132331  bytes 16925943 (16.9 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

/home/simileciwh/Public/bash_begin
/home/simileciwh/Public/bash_begin
Hello, simileciwh
Today is 2018年 11月 26日 星期一 11:27:52 CST
Users currently on the machine, and their processes:
 11:27:52 up  3:18,  1 user,  load average: 0.87, 0.69, 0.63
USER     TTY      FROM             [email protected]   IDLE   JCPU   PCPU WHAT
simileci :0       :0               08:10   ?xdm?   5:11   0.00s /usr/lib/gdm3/g

5,引用quoting

bash script中有3中quote(引用)符號:

quote type 名稱 含義
" 雙引號 保護雙引號中的所有內容,除了,$ , ’ , " 和 \ 這4中特殊符號。變數和命令列是可以被替換的。
單引號 保護單引號中的所有內容,不準替任何換。
\ 反斜槓 取消特殊字元的功能或意義。

舉個栗子:
使用系統變數HOSTNAME,為例,HOSTNAME的值為你的電腦的名字,每個人不相同

#! /bin/bash
echo "${HOSTNAME}"  #系統變數會被替換
echo '${HOSTNAME}'  #系統變數不會被替換
echo "\${HOSTNAME}" #特殊字元$的功能被取消!

執行結果:

pcMaster
${HOSTNAME}
${HOSTNAME}

6,獲得使用者從鍵盤的輸入

6.1 read -p

read 指令:
"語法":

read -p "prompt" variable1 variable2 variableN

引數"-p",是給使用者顯示提示資訊,
變數variable1,variable2,…,variableN是可選則的儲存使用者輸入引數的的變數,其個數是可以選擇的。
舉個栗子:

#! /bin/bash
read -p "請輸入你的姓名:" name
echo "Hi, ${name}. I have remember you!"

不要忘記,將檔案設定成可執行檔案!
執行結果:

請輸入你的姓名:simileciwh
Hi, simileciwh. I have remember you!

6.2 read -t

有時候,我們需要限制與使用者輸入的時間,或者不是一直處於等待使用者輸入的狀態,因此需要設定timeout input的機制,讓等待輸入的視窗在一段時間後就自動關閉。
"語法":

read -t Num -p "prompt" var1 var2 varN

引數-t是timeout的意思,Num時間單位為秒(s),即等到Num秒後,自動結束不在等待使用者輸入。

6.3 read -s

當在獲取使用者密碼時,不希望使用者輸入的密碼是顯示出來的,因此可以使用引數-s使得使用者的輸入隱藏起來不顯示出來。
"語法":

read -s -p "prompt" variable

6.4 read -r批處理多個變數的賦值

舉個栗子:

nameservers="12 23 546"
echo "$nameservers"
read -r v1 v2 v3 <<< "$nameservers"
echo "v1=$v1, v2=$v2, v3=$v3"

執行結果:

12 23 546
v1=12, v2=23, v3=546

7,算數運算

運算子 描述 例子
+ 加法 echo $((2+3))
- 減法 echo $((5-2))
* 乘法 echo $((2*3))
/ 除法 echo $((4/2))
% 取餘 echo $((5%2))
++ 自加 x=2; echo $((x++)),x=2; echo $((++x))
-- 自減 x=3; echo $((x–)),x=3; echo $((–x))
** 乘方 echo $((10**2))

這些和C語言中的規則都不衝突

8,declare

使用declear命令設定變數的值和屬性。
"語法":

declare [引數] variable

引數可選如下:

引數 含義
-i 變數型別----整型
-r 變數型別----readonly----只讀
-x 設定型別為export
-g 建立一個在函式中使用的全域性變數;否則忽略
-p 顯示變數的屬性和值

還有一些其他的屬性,可以通過help命令檢視。

9,建立常數變數

有兩種方法,一種是使用readonly命令,另一種是使用declare -r命令。常數變數的值一但被初始化,那麼即使使用unset不可修改
舉個栗子:

readonly var1=23
declare -r var2=32
var1=34
var2=45
echo "var1= ${var1}"
echo "var2= ${var2}"
unset var1
var1=34
echo "var1= ${var1}"

執行結果:

./123.sh: line 3: var1: readonly variable
./123.sh: line 4: var2: readonly variable
var1= 23
var2= 32
./123.sh: line 7: unset: var1: cannot unset: readonly variable
./123.sh: line 8: var1: readonly variable
var1= 23

相關推薦

shell學習

tdi 文件名 ash 設備 路徑 str 取字符串 黑洞 腳本 一、免密交互 --stdin 1、從標準輸入讀取字符串 如:passwd --stdin heruguo246 [root@localhost mnt]# passwd --stdin heruig

bash shell學習記錄(

1,什麼是bash shell 在linux核心下,無論什麼版本的linux發行版,都會有下列的shell支援。BASH,CSH,TCSH,ZSH,SCSH. 這些shell都是由最初的shell發展而來的。你可以參考如下的框架圖理解。 USER Request

bash shell學習筆記(—— 常用命令

排序 class $@ 幫助 row 自動 from quic 方式 一、基本的bash shell命令 1、默認bash shell 提示符是美元符號($); 2、bash手冊   使用man命令來訪問存儲在Linux系統上的手冊頁面,如: bogon:~ Mac$

Linux shell腳本全面學習

替換 通配 在屏幕上 tee pri des href som p s 1. Linux 腳本編寫基礎 1.1 語法基本介紹 1.1.1 開頭 程序必須以下面的行開始(必須方在文件的第一行): #!/bin/sh   符號#!用來告訴系統它後面的參數是用來執行該文件的程序。

Linux Bash Shell學習(十二 流程控制——select

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

bash shell學習記錄

1,什麼是bash shell 在linux核心下,無論什麼版本的linux發行版,都會有下列的shell支援。BASH,CSH,TCSH,ZSH,SCSH. 這些shell都是由最初的shell發展而來的。你可以參考如下的框架圖理解。 通過上面的關係圖,可以清楚

記錄次vue的學習

記錄一次vue的學習(一) 前言 提前準備 動手! 程式碼 學習筆記 前言 作為一個後端程式設計師(??碼農?),一直因為沒辦法將寫好的web好好的展示出來,苦惱於沒有前端配合,前端還能用node去自己寫點後端,今天

linux學習筆記之shell程式設計(

shell程式設計 基礎正則表示式 正則和萬用字元的區別:正則是包含匹配,匹配檔案內容,grep,awk等支援正則表示式。萬用字元是完全匹配,匹配檔名,例如find,ls不認識正則表示式 ####正則

linux學習筆記之shell程式設計(正則表示式與字元處理

shell程式設計 基礎正則表示式 正則和萬用字元的區別:正則是包含匹配,匹配檔案內容,grep,awk等支援正則表示式。萬用字元是完全匹配,匹配檔名,例如find,ls不認識正則表示式 ####正則表示式常用的字元(注意區別於萬用字元裡面的符號)#### -*

Write a Shell in C 學習

自己的C很差很差,所以趁著這一次寫一個shell的作業來提高一下自己C的程式設計水平。 希望此筆記可以使初學者毫無阻礙的寫成一個shell,並對每一個句子知其所以然。 由於我本人亦是初學者,內容難免謬誤多多,望大神指導海涵。 要寫一個shell出來,同時作為一個

linux之shell指令碼學習

#!/bin/bash echo 'hello' your_name='longxiong' echo $your_name echo ${your_name} for i in `ls /opt`; do echo ${i} done str="1234" echo ${#str} unset s

shell指令碼判斷當前使用者是否為root(學習筆記

可以使用env檢視配置檔案找到USER這個看到當前登入的使用者名稱 [[email protected] shell_project]# env | grep USER USER=root 我把 env查詢出來的內容 使用 grep(查詢) USER 這個出來

Node個人學習----模塊

需要 區別 class 當前 個人 一個 min export ava 1、自定義模塊與系統模塊的引入方式區別:----自定義模塊需要加“./”來聲明它不是一個系統模塊 const mod1=require("系統模塊.js"); const mod1=require(

MySQL學習ODBC 安裝

oca local new cmd 密碼 服務 關閉 mysql 系統 寫前說明 初次接觸MySQL,都說MySQL各種好。我也來學習學習。之前只有SQLServer2008的經驗,其實也只是皮毛。因為SQLServer還是比較容易上手的。也不麻煩。但是自己

vue基礎學習

time tle eight pla use logs new dial for 01-01 vue使用雛形      <div id="box"> {{msg}} </div> <sc

java學習 環境搭建、hello world的demo

環境變量 網上 類庫 .com java開發 www cnblogs rgs .class   本程序媛搞前端的,上班偶有空閑,不妨來學習學習,不然怎麽包養小白臉,走上人生巔峰?   說實話,每個語言都相通,有了javascript的基礎,並且有了兩三年跟java打交道的經

【Cloud Foundry】Could Foundry學習——Could Foundry淺談

art lock mod out isp ted 組成 .com pop 在閱讀的過程中有不論什麽問題。歡迎一起交流 郵箱:[email protected]/* */ QQ:1494713801 Cloud Foundry是VMware

Android中關於JNI 的學習對於JNIEnv的一些認識

else size 初步 jint 使用 包括 pri jnienv 就會 一個簡單的樣例讓我們初步地了解JNI的作用,可是關於JNI中的一些概念還是須要了解清楚,才可以更好的去利用它來實現我們想要做的事情。 那麽C++和Java之間的是怎樣通過JNI來進行互相調用的呢

.Net MVC的學習

後綴 fonts mvc 存在 eth 大致 例如 pre gb2   套種間作,也挺有意思的——近來學習感悟。DRP學習的同一時候,折騰了點曾經不曾學習可是卻非常多次耳聞過的東西——Asp.Net中的MVC架構模式。 一、是什麽?      MVC,即(Model-

Python學習

ubun 安裝目錄 tle setup extract reat 常用插件 增加 網址 Python學習(一) 一:開發工具安裝   1,pycharm下載:Linux版本   2,破解:在help-register下-service輸入:      http://elpo