日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

八、Linux 常用 Shell 命令,控制台的快捷键以及 Shell 编程(中)

發布時間:2024/10/8 linux 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 八、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:指定全局變量
#!/bin/bash # 定義普通變量,沒有特殊字符或者空格,可以不用引號 CITY=Dongguan# 定義全局變量 export NAME=Runsen# 定義只讀變量 readonly AGE=20# 打印變量的值 echo $CITY echo $NAME echo $AGE# 刪除 CITY 變量 unset CITY # 不會輸出 Dongguan echo $CITY

預定義變量

預定義變量常用來獲取命令行的輸入,有下面這些:

$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 true

for 循環和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 3

Linux 問題處理

下面問題是我在用 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 環境之后,進行如下操作。

  • 將根目錄重新掛載,模式可寫:
  • switch_root:/# mount -o rw,remount /sysroot
  • 變更目錄至根目錄下:
  • switch_root:/# chroot /sysroot
  • 更改密碼:
  • sh-4.2# passwd
  • 如果安裝的是中文系統,此時會出現亂碼,可以根據經驗直接輸入,也可輸入以下命令,當次變更語言為英語。
  • sh-4.2# LANG=en_US
  • 如果 SELinux 開啟需要更新 SELinux 上下文,只要創建下面的文件即可。
  • sh-4.2# touch /.autorelabel
  • 退出重啟。
  • sh-4.2# exit switch_root:/# exit

    總結

    以上是生活随笔為你收集整理的八、Linux 常用 Shell 命令,控制台的快捷键以及 Shell 编程(中)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。