Shell第一章《變數》

来源:https://www.cnblogs.com/Jqazc/archive/2022/08/23/16616717.html
-Advertisement-
Play Games

shell前言 什麼是shell shell-‘殼’ 命令解釋器,一種應用程式 shell語言特點 SHELL語言是指UNIX操作系統的命令語言,同時又是該命令語言的解釋程式的簡稱。 Shell本身是一個用C語言編寫的程式,它是用戶使用Unix/Linux的橋梁,用戶的大部分工作都是通過Shell完 ...


shell前言

什麼是shell

shell-‘殼’ 命令解釋器,一種應用程式

shell語言特點

SHELL語言是指UNIX操作系統的命令語言,同時又是該命令語言的解釋程式的簡稱。

Shell本身是一個用C語言編寫的程式,它是用戶使用Unix/Linux的橋梁,用戶的大部分工作都是通過Shell完成的。

Shell既是一種命令語言,又是一種程式設計語言。作為命令語言,它互動式地解釋和執行用戶輸入的命令,作為程式設計語言,它定義了各種變數和參數,並提供了許多在高級語言中才具有的控制結構,包括迴圈和分支,它雖然不是Unix/Linux系統內核的一部分,但它調用了系統核心的大部分功能來執行程式、建立文件並以並行的方式協調各個程式的運行。因此,對於用戶來說,shell是最重要的實用程式,深入瞭解和熟練掌握shell的特性極其使用方法,是用好Unix/Linux系統的關鍵。

shell能做什麼

Shell 能做什麼?
1. 自動化批量系統初始化程式 (update,軟體安裝,時區設置,安全策略...)
2. 自動化批量軟體部署程式 (LAMP,LNMP,Tomcat,LVS,Nginx)
3. 應用管理程式 (KVM,集群管理擴容,MySQL,DELLR720批量RAID)
4. 日誌分析處理程式(PV, UV, 200代碼, !200代碼, top 100, grep/awk)
5. 自動化備份恢復程式(MySQL完全備份/增量 + Crond)
6. 自動化管理程式(批量遠程修改密碼,軟體升級,配置更新)
7. 自動化信息採集及監控程式(收集系統/應用狀態信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL)
8. 配合Zabbix信息採集(收集系統/應用狀態信息,CPU,Mem,Disk,Net,TCP Status,Apache,MySQL)
9. 自動化擴容(增加雲主機——>業務上線)
zabbix監控CPU 80%+|-50% Python API AWS/EC2(增加/刪除雲主機) + Shell Script(業務上線)
10. 俄羅斯方塊,列印三角形,列印聖誕樹,列印五角星,運行小火車,坦克大戰,排序演算法實現

shell的執行方式

1 執行1:bash    file1 
2 執行2:sh   file1 
3 執行3:.   file1 
4 執行4: source     file1 

 

多種執行方式的區別:

1.準備環境

1 vim bash.sh 
2 #!/usr/bin/bash 
3 cd /home/ 
4 ls

2. 一種執行方式測試
. bash.sh

3.觀察目錄改變了。說明影響的是當前。並使用子shell執行方式執行。

該種執行方式,是不同於前者SUB shell執行。
而是在當前shell執行,用於影響當前shell環境。

shell解釋器在哪

1 cat /etc/shells
2 3 chsh -l

變數

shell 變數? 用一個固定的字元串去表示不固定的內容,便於修改。

自定義變數

用戶自定義變數是最常用的變數類型,其特點是變數名和變數值都是由用戶自由定義的。

學習要點

定義變數: 變數名=變數值

引用變數: $變數名或 ${變數名}

查看變數: echo $變數名; "set"可以查看所有變數(包括自定義變數和環境變數)

取消變數: unset 變數名

定義變數

該如何定義變數呢?很簡單,只需執行"變數名=變數值"命令即可,不過要遵守變數定義規則。例如

1 [root@localhost ~]# name="test 666"

變數調用

當我們需要提取變數中的內容時,需要在變數名之前加入"$"符號。
那麼最簡單的變數調用就是通過 echo 命令輸出變數的值。命令如下

1 #定義變數name 
2 
3 [root@localhost ~]# name="test 666"
4 
5 #輸出變數name的值
6 
7 [root@localhost ~]# echo $name
8 
9 test 666

錯誤定義示範

變數的定義就是這麼簡單,但是如果不遵守變數定義規則,就會報錯。比如:

#變數名不能以數字開頭

[root@localhost ~]# 2name="test 666"

-bash: 2name=test 666: command not found

#等號左右兩側不能有空格

#變數的值如果有空格,必須用引號包含

[root@localhost ~]# name=test 666

-bash: 666: command not found

重覆定義變數

重覆定義變數會進行變數疊加。例如:

#定義變數aa的值是123

#重覆定義變數aa的值是源aa的值加上456

 1 [root@localhost ~]# aa="$aa"456
 2 
 3 #調用變數aa,發現值已經變成了123456
 4 
 5 #在進行變數疊加時,也可以使用${變數名}格式
 6 
 7 [root@localhost ~]# aa=${aa}789
 8 
 9 [root@localhost ~]# echo $aa
10 
11 123456789

這裡要小心,在進行變數疊加時,變數名需要用雙引號或 ${} 包含。

變數查看

我們可以通過 echo 命令查詢已經設定的變數的值,這種查詢是已知變數名查詢變數值。
但是如果我不知道變數名,那麼可以查詢系統中已經存在的變數嗎?

[root@localhost ~]# set 

變數刪除

 1 [root@localhost ~]# aa="$aa"456
 2 
 3 #調用變數aa,發現值已經變成了123456
 4 
 5 #在進行變數疊加時,也可以使用${變數名}格式
 6 
 7 [root@localhost ~]# aa=${aa}789
 8 
 9 [root@localhost ~]# echo $aa
10 
11 123456789

示例

使用變數前

需求:編寫測試主機線上的腳本。當主機線上提示線上,當主機不線上提示不線上。

編寫腳本

ping    -c1      192.168.100.10     &>    /dev/null    &&   echo      192.168.100.10up     ||    echo      192.168.100.10down

註釋:&&和||是三目表達式、&& 前面的命令成功。執行後面的命令、||前面的命令失敗。執行後面的命令

思考:如果更換測試IP。需要修改腳本的哪些部分?

需要修改三個部分

使用變數後

編寫腳本

1 #!/bin/bash
2 
3 ip=192.168.100.10
4 
5 ping -c1 $ip &>/dev/null  && echo $ip  up ||   echo "$ip  down"

思考:添加變數後,修改一處即可。

交互定義變數

read 從鍵盤讀入變數值

賦值方式:read 變數名

示例

1 read -p "請輸入您測試的IP地址:" ip
2 
3 ping -c1 $ip &>/dev/null && echo " $ip up" || echo "$ip
4 down"

 

註意事項:3種引號

定義或引用變數時註意事項:

" " 弱引用
' ' 強引用
` ` 優先執行

 1 雙引號1
 2 [root@localhost ~]# schoo=1000 phone
 3 錯誤示範,shell把空格識別做命令分隔符。
 4 bash: phone: 未找到命令
 5 [root@localhost ~]# schoo="1000 phone" 
 6 正確示範,變數值中的空格,被轉義為一個普通符號
 7 [root@localhost ~]# echo $schoo
 8 1000 phone
 9 執行成功。
10 
11 雙引號2
12 [root@localhost ~]# schoo=$schoo is good
13 錯誤示範,已有變數的基礎上,再追加內容。
14 bash: is: 未找到命令
15 沒有加引號,被識別為兩條命令
16 [root@localhost ~]# schoo="$schoo is good"
17 正確示範,加了雙引號。組成了整體,空格失去含義。
18 [root@localhost ~]# echo $schoo
19 1000 phone is good
20 成功
1 單引號
2 [root@localhost ~]# schoo='$schoo 666'
3 單引號,轉義一切符號
4 [root@localhost ~]# echo $schoo
5 $schoo 666
6 $也被轉義了。一切都被轉義了。
1 反引號
2 [root@localhost ~]# schoo=`date`
3 反引號是優先執行。先執行date的命令,再執行定義變數。
4 [root@localhost ~]# echo $schoo
5 2022年 08月 23日 星期二 14:57:13 CST
6 所以看到變數的結果,是時間

註意

1.變數名和等號之間不能有空格,這可能和你熟悉的所有編程語言都不一樣。同時,變數名的命名須遵循如下規則:
2.命名只能使用英文字母,數字和下劃線,首個字元不能以數字開頭。
3.中間不能有空格,可以使用下劃線(_)。
4.不能使用標點符號。
5.不能使用bash里的關鍵字(可用help命令查看保留關鍵字)。
6.起變數名,請使用五個字母以上。

整數運算

 

 1 方法一:expr
 2 語法
 3 expr       1       +        2
 4 expr      $num1     +       $num2
 5 + 6 - 7 \*乘(*是任意字元,使用\ 轉義一下。)
 8 / 9 %取餘
10 需求:
11 運算學員的成績總分
12 製作腳本
13 [root@localhost ~]# vim sum.sh
14 #!/bin/bash
15 read -p "請輸入您的第一門成績: " number1
16 read -p "請輸入您的第二門成績: " number2
17 echo -n "總成績是: "
18 expr $number1 + $number2
19 授權腳本
20 [root@localhost ~]# chmod +x sum.sh
21 測試腳本
22 [root@master1 ~]# ./sum.sh
23 請輸入您的第一門成績: 60
24 請輸入您的第二門成績: 70
25 總成績是: 130

小數運算(瞭解) 

1 請提前安裝計算器程式bc
2     echo "2*4" |bc
3 echo "2^4" |bc
4 echo "scale=2;6/4" |bc
5         bc:交互運算器
6         scale=2  保留小數點後面兩位

環境變數(瞭解)

前言

自定義變數,只能再當前shell生效。其他shell是不生效的,說白了,你的變數只能你用。那如果有些變數,需要所有的用戶都使用,怎麼辦呢?

1 定義環境變數:
2     直接聲明
3         方法一 export       back_dir2=/home/backup 
4             聲明環境變數
5     轉換聲明
6         方法二 export      back_dir1 將自定義變數轉換成環境變數
7             轉換環境變數

變數作用範圍: 在當前shell和子shell有效
想使變數。在當前用戶登陸後一直生效,可以將變數放到~/.bash_profile
想使變數。在所有用戶登陸後一直生效,可以將變數放到/etc/profile

 1 示例
 2     [root@localhost ~]# abc=123
 3         定義普通變數1
 4     [root@localhost ~]# def=456
 5         定義普通變數2
 6     [root@localhost ~]# bash
 7         打開子shell
 8     [root@localhost ~]# echo $abc
 9         調用普通變數,失敗
10     [root@localhost ~]# echo $def
11         調用普通變數,失敗
12     [root@localhost ~]# exit
13         退出子shell
14     exit
15     [root@localhost ~]# export abc
16         講變數聲明為環境變數。兒子shell都能用。
17     [root@localhost ~]# bash
18         打開子shell
19     [root@localhost ~]# echo $abc
20         發現變數可以用了。
21     123
22     [root@localhost ~]# echo $def
23         普通變數還是不行。

位置變數和預定義變數(瞭解)

位置變數語法

1 位置變數
2 命令 參數1 參數2 參數3 ....9以後特殊定義
3 $0 $1 $2 $3 $4 $5 $6 $7 $8 $9 ...
 1 示例
 2     需求
 3         制定腳本程式,用戶自行輸入兩門學科的成績(整數),自動算出平均分。
 4     製作腳本
 5         [root@localhost ~]# vim avg.sh
 6         #!/bin/bash
 7         echo "($1+$2)/2" | bc
 8         [root@localhost ~]# chmod      +x        avg.sh
 9     測試腳本
10         [root@localhost ~]# ./avg.sh  88 77
11         82
12     請思考
13         位置變數和read讀取變數,到底用哪個?
14             使用誰都可以。
15                 #!/bin/bash
16                 read -p  "請輸入您的第1門成績: "   num1
17                 read -p  "請輸入您的第2門成績: "   num2
18                 echo -n "您的平均成績是:"
19                 echo "($num1+$num2)/2"   |bc
總結
1.位置變數就是$1,$2,$3,$4
2.位置變數預先已經被定義過了。
3.用戶使用時,必須攜帶參數。
4.位置變數不是程式設計的唯一方法。比如read也可以。

總結
這兩類變數,在設計系統時就已經定義好了。
需要使用時,直接調用即可。

練習

編寫自動創建用戶並設置初始化腳本

1 vim create.sh
2 #!/bin/bash
3 read -p "請輸入要創建用戶的名稱:" name
4 useradd ${name}
5 echo "123456" | passwd --stdin ${name} &> /dev/null
6 echo ${name} 已經創建完成,密碼是123456
7 [root@bogon ~]# sh create.sh
8 請輸入要創建用戶的名稱:kk
9 kk 已經創建完成,密碼是123456

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Excelize 是 Go 語言編寫的 Excel 文檔基礎庫,2022年8月22日,社區正式發佈了 2.6.1 版本,該版本包含了多項新增功能、錯誤修複和相容性提升優化。 ...
  • 作者:昌維 來源:https://www.zhihu.com/question/537774494/answer/2534015588 知乎上有一個提問: 分享一個很有意思的回答。 1 我是一名 JetBrains 的忠實粉絲。我學習編程語言的經歷大概有 10 年左右,使用 JetBrains 大概 ...
  • 一、前言 在上一篇隨筆中,我向大家介紹瞭如何製作自己的 nuget 包,並沒有向大家介紹如何發佈製作好的包,今天就繼續向大家介紹如何搭建一個簡易的 nuget 私有倉庫,並上傳自己的包以供內部使用。 老規矩,今天介紹的還是在Windows系統下進行的操作,Linux系統下也可以使用 nexus 來搭 ...
  • 來瞧瞧,WPF 炫酷走馬燈! 控制項名:SpotLight 作者:WPFDevelopersOrg 原文鏈接: https://github.com/WPFDevelopersOrg/WPFDevelopers 框架使用大於等於.NET40; Visual Studio 2022; 項目使用 MIT ...
  • 一:背景 這篇我們來聊一下 PerfView 在協助 WinDbg 分析 Dump 過程中的兩個超實用技巧,可能會幫助我們快速定位最後的問題,主要有如下兩塊: 洞察記憶體泄漏中的靜態大集合變數名。 驗證當前程式的 GC 模式。 這裡就把經驗分享一下,希望讓大家少走彎路。 二:如何洞察 1. 查看靜態變 ...
  • 大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家分享的是IAR下調試信息輸出機制之半主機(Semihosting)。 在嵌入式世界里,輸出列印信息是一種非常常用的輔助調試手段,藉助列印信息,我們可以比較容易地定位和分析程式問題。在嵌入式應用設計里實現列印信息輸出的方式有很多,本系列將以 IA ...
  • 原文鏈接:https://www.zhoubotong.site/post/76.html 最近發現一個文檔類網站,編寫教程很合適,特地查了一下叫Read the Docs ,可以使用 Sphinx 生成文檔,GitHub 托管文檔,然後導入到 ReadtheDocs進行展示,這裡順便記錄一下搭建過 ...
  • 目錄 gun組織 項目 Linux版本 指令下達和執行 如何關機 linux Base gun組織 項目 copyleft:代表無版權。 copyright:代表有版權 opensource:開放源代碼、軟體誰都可以使用、誰都可以傳播、都可二次開發 free:免費 GPL:通用許可證協議,如果軟體打 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...