八、Linux 常用 Shell 命令,控制台的快捷键以及 Shell 编程(中)
@Author : Runsen
@Date:2020/9/11
文章是Runsen在Gitchat付費文章分享:Linux 常用 Shell 命令,控制臺的快捷鍵以及 Shell 編程
順便同步到CSDN中,這里設置了VIP,不好意思!!八月份寫的,有些時間了。
文章目錄
- Shell腳本編程
- 變量
- 預定義變量
- 數組和運算符
- 數組
- 運算符
- 流程控制
- Linux 問題處理
- 不知道文件放在哪里,如何查找文件
- 忘記密碼解決,怎么登錄
Shell腳本編程
所謂腳本,就是把眾多命令寫入一個文件中,讓其按照一定的邏輯順序執行,以完成一個具體的功能。而在Linux的shell編譯環境下,shell編程與眾多編程語言一樣,也有其獨立的語法。
打開文本編輯器(可以使用 vi/vim 命令來創建文件),新建一個文件 test.sh,擴展名為 sh(sh代表shell)。
maoli@ubuntu:~$ vim test.sh#!/bin/bash echo "Hello World !"變量
變量名不加美元符號($,PHP語言中變量需要)。比如在shell中 定義變量name = Runsen,而在php就是$name = Runsen
使用一個定義過的變量,只要在變量名前面加美元符號即可,如:$name或者${name}。變量名外面的花括號是可選的,加不加都行。
變量支持字符串類型,浮點等類型,常見有這 3 個前綴:
- unset:刪除變量
- readonly:標記只讀變量
- export:指定全局變量
預定義變量
預定義變量常用來獲取命令行的輸入,有下面這些:
$0 :腳本文件名 $1-9 :第 1-9 個命令行參數名 $# :命令行參數個數 $@ :所有命令行參數 $* :所有命令行參數 $? :前一個命令的退出狀態,可用于獲取函數返回值 $$ :執行的進程 ID下面我們看一個預定義變量例子:
maoli@ubuntu:~$ vim hello.sh #!/bin/bash echo "\$0 = $0" echo "\$1 = $1" echo "\$2 = $2" echo "\$# = $#" echo "\$@ = $@" echo "\$* = $*" echo "\$$ = $$" echo "\$? = $?"maoli@ubuntu:~$ ./hello.sh 1 2 3 4 5 # 程序名 $0 = ./hello.sh # 第一個參數 $1 = 1 # 第二個參數 $2 = 2 # 一共有 5 個參數 $# = 5 # 打印出所有參數 $@ = 1 2 3 4 5 # 打印出所有參數 $* = 1 2 3 4 5 # 進程 ID $$ = 9450 # 之前沒有執行其他命令或者函數 $? = 0數組和運算符
數組
數組中可以存放多個值。Bash Shell 只支持一維數組(不支持多維數組),初始化時不需要定義數組大小。Shell 數組用括號來表示,元素用"空格"符號分割開,舉例如下:
my_array=(A B "C" D)我們也可以使用下標來定義數組:
array_name[0]=value0 array_name[1]=value1 array_name[2]=value2讀取數組
my_array=(A B "C" D)echo "第一個元素為: ${my_array[0]}" echo "第二個元素為: ${my_array[1]}" echo "第三個元素為: ${my_array[2]}" echo "第四個元素為: ${my_array[3]}"獲取數組中的所有元素
使用@ 或 * 可以獲取數組中的所有元素,例如:
my_array[0]=A my_array[1]=B my_array[2]=C my_array[3]=Decho "數組的元素為: ${my_array[*]}" echo "數組的元素為: ${my_array[@]}"獲取數組的長度
獲取數組長度的方法與獲取字符串長度的方法相同,例如:
my_array[0]=A my_array[1]=B my_array[2]=C my_array[3]=Decho "數組元素個數為: ${#my_array[*]}" echo "數組元素個數為: ${#my_array[@]}"運算符
val=`expr 2 + 2` echo "兩數之和為 : $val"兩點注意:
- 表達式和運算符之間要有空格,例如 2+2 是不對的,必須寫成 2 + 2,這與我們熟悉的大多數編程語言不一樣。
- 完整的表達式要被 包含,注意這個字符不是常用的單引號,在 Esc 鍵下邊。
| + | 加法 | expr $a + $b 結果為 30。 |
| - | 減法 | expr $a - $b 結果為 -10。 |
| * | 乘法 | expr $a \* $b 結果為 200。 |
| / | 除法 | expr $b / $a 結果為 2。 |
| % | 取余 | expr $b % $a 結果為 0。 |
| = | 賦值 | a=$b 將把變量 b 的值賦給 a。 |
| == | 相等。用于比較兩個數字,相同則返回 true。 | [ $a == $b ] 返回 false。 |
| != | 不相等。用于比較兩個數字,不相同則返回 true。 | [ $a != $b ] 返回 true。 |
關系運算符
關系運算符只支持數字,不支持字符串,除非字符串的值是數字。
下表列出了常用的關系運算符,假定變量 a 為 10,變量 b 為 20:
| -eq | 檢測兩個數是否相等,相等返回 true。 | [ $a -eq $b ] 返回 false。 |
| -ne | 檢測兩個數是否相等,不相等返回 true。 | [ $a -ne $b ] 返回 true。 |
| -gt | 檢測左邊的數是否大于右邊的,如果是,則返回 true。 | [ $a -gt $b ] 返回 false。 |
| -lt | 檢測左邊的數是否小于右邊的,如果是,則返回 true。 | [ $a -lt $b ] 返回 true。 |
| -ge | 檢測左邊的數是否大于等于右邊的,如果是,則返回 true。 | [ $a -ge $b ] 返回 false。 |
| -le | 檢測左邊的數是否小于等于右邊的,如果是,則返回 true。 | [ $a -le $b ] 返回 true。 |
流程控制
if判斷語句,下面我們寫一個簡單判斷語句。
maoli@ubuntu:~$ vim hello.sh #!/bin/bash # read 的方法就python中的input,適用于終端命令提示符 read VAR # 下面這兩種判斷方法都可以,使用 [] 注意左右加空格 #if test $VAR -eq 10 if [ $VAR -eq 10 ] thenecho "true" elseecho "false" fi maoli@ubuntu:~$ sh hello.sh 10 truefor 循環和Python沒有什么區別,挺簡單的。如果運行for循環報錯Syntax error: Bad for loop variable,需要使用命令sudo dpkg-reconfigure dash,然后在在選擇項中選No
原因:代碼對于標準bash而言沒有錯,因為Ubuntu為了加快開機速度,用dash代替了傳統的bash,是dash在搗鬼。
下面是for循環的shell代碼
maoli@ubuntu:~$ vim hello.sh #!/bin/bash # 普通 for 循環 declare聲明變量-i declare -i SUM=0 for ((i=1;i<=100;i+=1)) dolet SUM+=$i done echo $SUM# loop 依次代表每個元素 for loop in 1 2 3 4 5 doecho "The value is: $loop" done# VAR 依次代表每個元素 ,{}產生連續數字 for VAR in {1..3} doecho $VAR donemaoli@ubuntu:~$ sh hello.sh 5050 The value is: 1 The value is: 2 The value is: 3 The value is: 4 The value is: 5 1 2 3 #也可以寫成一行,方便在命令行直接運行,注意空格和;號: maoli@ubuntu:~$ for VAR in {1..3}; do echo $VAR; done 1 2 3Linux 問題處理
下面問題是我在用 Linux 時,經常出來,對此,個人做一個簡單的記錄。
不知道文件放在哪里,如何查找文件
很多的時候,我搭建 Hadoop 等環境的時候,不知道下載的安裝包放在哪里,其實使用 locate 命令就可以了。
下面是我的具體演示。
locate:通過文件名查找文件。
語法:
locate [-d ][--help][--version][范本樣式...]
舉例:查找 passwd 文件。
locate passwd
搜索 etc 目錄下所有以 my 開頭的文件:
locate /etc/my
這里說下:在用 whereis 和 locate 查找文件時,有時會找到已經被刪除的數據,或者剛剛建立文件,卻無法查找到,原因就是因為數據庫文件沒有被更新。為了避免這種情況,可以在使用 locate 之前,先使用 updatedb 命令,手動更新數據庫。整個 locate 工作其實是由四部分組成的。
新增的文件無法 locate,使用 updatedb:
[root@cent7 ~]# touch new.txt [root@cent7 ~]# locate new.txt [root@cent7 ~]# updatedb [root@cent7 ~]# locate new.txt /root/new.txt還有 find:在目錄層次結構中查找文件。
忘記密碼解決,怎么登錄
有幾次,我忘了 CentOS 7 的用戶密碼,對此也百度折騰了下。下面介紹解決方法,我以 CentOS 7 為例。
在啟動選擇內核版本的時候按上下鍵,令畫面停住。
CentOS 7 每次會有兩個版本的內核供選擇,簡單的來說就是一個主內核版本,一個副內核版本,如果以后內核升級失敗無法使用新內核重啟時,可以通過這個界面選擇舊內核重啟進行修復。
選擇好了內核之后,按下 e 鍵,進入編輯界面。
找到以 linux16 開頭的那一行,在行尾加上如下幾句話:
- 如果是物理機,添加:rd.break
- 如果是虛擬機,添加:rd.break console=tty0
這里我用的是虛擬機,所以添加 rd.break console=tty0,如下圖所示:
然后按 Ctrl+x 進行啟動。
進入 shell 環境之后,進行如下操作。
總結
以上是生活随笔為你收集整理的八、Linux 常用 Shell 命令,控制台的快捷键以及 Shell 编程(中)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 引起面部凹陷的原因有哪些?如何改善?星美
- 下一篇: 九、为了OFFER而战,那些日子在牛客网