Linux筆記10——shell編程基礎-4

補充

  • $#——取參數個數
  • “$n”,有值取值,無值取空字符,一般都會加引號,在某些情況下避免報語法錯誤

一、read接收鍵盤輸入

[root@localhost ~]# cat demo.sh 
#!/bin/bash
echo -n "請輸入你的姓名:"
read nameecho "你的名字是:"$name
[root@localhost ~]# bash demo.sh 
請輸入你的姓名:zhangsan
你的名字是:zhangsan
[root@localhost ~]# 

語法:read [選項] [變量名]

  • -p:提示信息,在read等待時輸入的信息
  • -t:秒數,read等待的秒數
  • -s:隱藏輸入信息
  • -n:字符數,read最多能接收的字符數(達標即執行)

實驗一:測試各選項的用法

#!/bin/bash
#-p:提示信息
read -p "請輸入你的姓名:" name
#-s:隱藏年齡
read -p "請輸入你的年齡:" -s age
#-t:輸入時間只有10秒
read -p "請輸入你的性別:" -t 10 sex
#-n:電話號碼最多只能輸十一位
read -p "請輸入你的電話號碼:" -n 11 numberecho "輸入你的信息:"$name $age $sex $number

實驗二:可以同時接收多個參數,分別放在多個變量里

[root@localhost ~]# cat test2.sh 
#!/bin/bash
read -p "請輸入你的姓名、性別、年齡、電話號碼:" name sex age number
echo "輸入你的信息:"$name $age $sex $number
[root@localhost ~]# bash test2.sh
請輸入你的姓名、性別、年齡、電話號碼:zhangsna man 32 123456789
輸入你的信息:zhangsna 32 man 123456789
[root@localhost ~]# 

實驗三:嘗試修改接收參數個數,再看運行效果(某些特殊選項會出現不自動換行的bug,所以這里用echo來換行)

[root@localhost ~]# cat test2.sh 
#!/bin/bash
echo "請輸入你的姓名、性別、年齡、電話號碼:"
read name sex age number
echo "輸入你的信息:"$name $age $sex $number
[root@localhost ~]# bash test2.sh
請輸入你的姓名、性別、年齡、電話號碼:
zhangsan man 32 123456 你好嗎?我是誰?
輸入你的信息:zhangsan 32 man 123456 你好嗎?我是誰?
[root@localhost ~]# 

結論

  • 如果只提供了一個變量名,則整個輸入全部賦予該變量
  • 如果提供了一個以上的變量名,則輸入行分為若干字,一個接一個地賦予各個變量,而命令行上的最后一個變量取得剩余的所有值

二、shell常用運算符

1.聲明指定類型的變量

注:數值運算需要使用declare聲明變量類型

類型分類

  • 整數型
  • 數組型
  • 環境變量
  • 只讀變量

實驗一:查看變量類型

[root@localhost ~]# name=lisi
[root@localhost ~]# declare -p name
declare -- name="lisi"

實驗二:整數型(shell中變量默認類型是字符串,兩個字符串相加的效果是字符拼接)

[root@localhost ~]# n1=10
[root@localhost ~]# n2=20
[root@localhost ~]# n=$n1+$n2
[root@localhost ~]# echo $n
10+20#整型
[root@localhost ~]# declare -i a=100 b=200
[root@localhost ~]# declare -i num=$a+$b
[root@localhost ~]# echo $num
300

注:變量類型——字符串(--)、數值(-i)、數組(-a)

2.命令:declare [+-][選項] [變量]

  • -:給變量設置類型
  • +:取消變量類型
  • -i:將變量聲明成整數型
  • -a:將變量聲明成數組型
  • -x:將變量聲明成環境變量
  • -r:將變量聲明成只讀
  • -p:顯示指定變量的類型和內容

注:若使用echo輸出數值運算,則輸出結果只會是字符串拼接,不是數值運算的結果

#變量n是字符
[root@localhost ~]# declare -i n1=10
[root@localhost ~]# declare -i n2=20
[root@localhost ~]# n=$n1+$n2
[root@localhost ~]# echo $n
10+20
#變量n是整型
[root@localhost ~]# declare -i n
[root@localhost ~]# n=$n1+$n2
[root@localhost ~]# echo $n
30
#變量n是整型,n3和n4都是字符串
[root@localhost ~]# n3=10
[root@localhost ~]# n4=20
[root@localhost ~]# n=$n3+$n4
[root@localhost ~]# echo $n
30

即:

  • 字符串=數值+數值——字符串的拼接
  • 數值=數值+數值——數值的運算
  • 數值=字符串+字符串——數值的運算

結論:變量名的類型要更加重要一些

三、數值的運算

方法一:定義一個數值類型的變量作為結果

#定義n為整型,計算n1+n2的值
[root@localhost ~]# declare -i n
[root@localhost ~]# n=$n1+$n2
[root@localhost ~]# echo $n
30

方法二:使用expr進行數值運算

[root@localhost ~]# x=100
[root@localhost ~]# y=200
[root@localhost ~]# expr $x + $y
300
[root@localhost ~]# expr $x * $y
expr: 語法錯誤:未預期的參數 “anaconda-ks.cfg”
[root@localhost ~]# expr $x \* $y
20000
[root@localhost ~]# 

注:運算符左右兩端得有空格;乘號需要使用轉義符取消特殊含義

方法三:使用let進行數值計算

  • 運算符左右不需要空格,但需要聲明一個新變量用于接收計算結果
  • let還能進行自增減,或指定增加量或減少量
[root@localhost ~]# let he=$x+$y
[root@localhost ~]# echo $he
300
[root@localhost ~]# n=10
[root@localhost ~]# let n++
[root@localhost ~]# echo $n
11
[root@localhost ~]# let n=$n+1
[root@localhost ~]# echo $n
12
[root@localhost ~]# let n+=5
[root@localhost ~]# echo $n
17
[root@localhost ~]# 

方法四:使用$(())或$[]進行數值運算

[root@localhost ~]# unset x;unset y
[root@localhost ~]# x=100
[root@localhost ~]# y=200
[root@localhost ~]# echo $(($x+$y))
300
[root@localhost ~]# echo $[$x+$y]
300

補充

#測試運算符的順序
[root@localhost ~]# echo $((16/5))
3
[root@localhost ~]# echo $((-16/5))
-3
[root@localhost ~]# echo $((-16/-5))
3
[root@localhost ~]# echo $((16/-5))
-3
#a%b,取余結果的符號和a一致
[root@localhost ~]# echo $((16%5))
1
[root@localhost ~]# echo $((-16%5))
-1
[root@localhost ~]# echo $((-16%-5))
-1
#對一個數n取余,余數是有范圍的,即[0-(n-1)]
------------
#指定范圍的隨機數,默認范圍是[0,32767]
$ echo $RANDOM
#在0~10之間產生一個隨機數
$ echo $(($RANDOM%11))
#在1~100之間產生一個隨機數
$ echo $(($RANDOM%100+1))
#表格中的優先級是乘除優先于加減,但是若加減被()調用,則括號內的優先級高于乘除
[root@localhost ~]# n1=$(((11+22)*33/44))
[root@localhost ~]# echo $n1
24
#邏輯與(一般單獨使用)
[root@localhost ~]# echo $((0&&0))
0
[root@localhost ~]# echo $((0&&1))
0
[root@localhost ~]# echo $((1&&0))
0
[root@localhost ~]# echo $((1&&1))
1
-----------
#shell中處理的數值都是整數類型,若處理小數用bc
5、Shell的環境變量配置
5-1、登錄環境變量的配置文件
[root@localhost ~]# yum -y install bc
[root@localhost ~]# echo "2.5+3.5"|bc
6.0
[root@localhost ~]# echo "2.3*3"|bc
6.9

注:$變量名取值;$(命令)取命令的值;$(())取運算表達式的值

四、數組

定義:名=(值1 值2 值3....)

[root@localhost ~]# name=(zhangsan lisi wangwu)
[root@localhost ~]# echo $name    #默認情況下只能取第一個值
zhangsan
[root@localhost ~]# echo ${name[1]}    #根據下標取值
lisi
--------------
#隨機取數值name中的值
[root@localhost ~]# echo ${name[$RANDOM%3]}
zhangsan
或
[root@localhost ~]# echo ${name[$(($RANDOM%3))]}
zhangsan
--------------
[root@localhost ~]# echo ${name[*]}
zhangsan lisi wangwu
[root@localhost ~]# echo ${name[@]}
zhangsan lisi wangwu
--------------
[root@localhost ~]# echo ${#name[@]}    #取 值的個數,即數組的長度
3
[root@localhost ~]# echo ${#name[0]}    #取的是一個值的字符串長度
8
[root@localhost ~]# 
---------------
改:
[root@localhost ~]# name[1]=lisiis
[root@localhost ~]# echo ${name[@]}
zhangsan lisiis wangwu
增:
[root@localhost ~]# name[3]=laoliu
[root@localhost ~]# echo ${name[@]}
zhangsan lisiis wangwu laoliu
刪:
[root@localhost ~]# unset name[3]
[root@localhost ~]# echo ${name[@]}
zhangsan lisiis wangwu
[root@localhost ~]# unset name
[root@localhost ~]# echo ${name[@]}[root@localhost ~]# 

五、知識點補充

字符串判斷

測試選項作用
-z 字符串判斷字符串是否為空(為空返回真)
-n 字符串判斷字符串是否為非空(非空返回真)
字符串1 == 字符串2判斷字符串是否相等(相等返回真)
字符串1 != 字符串2判斷字符串是否不相等(不相等返回真)

練習1:寫一個腳本,計算1到100的值

[root@localhost ~]# cat he.sh 
#!/bin/bash
n=0
for i in {1..100}
don=`expr $n + $i`
done
echo $nn1=0
for i in {1..100}
dolet n1+=$i
done
echo $n1n2=0
for i in {1..100}
don2=$((n2+=$i))
done
echo $n2
[root@localhost ~]# bash he.sh 
5050
5050
5050
[root@localhost ~]# 

練習2:寫一個腳本,給腳本傳輸一個值,計算從1到這個值的和

[root@localhost ~]# cat demo1.sh 
#!/bin/bashecho -n "input start number:" $1
echo -n "input end number:" $2
let n=$2-$1+1
echo "count:"$(($n*($1+$2)/2))
[root@localhost ~]# bash demo1.sh 1 5
input start number: 1input end number: 5count:15
[root@localhost ~]# 

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/920230.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/920230.shtml
英文地址,請注明出處:http://en.pswp.cn/news/920230.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

(Redis)過期刪除策略

1. 背景Redis 支持為 Key 設置過期時間(TTL),讓數據在一定時間后自動失效。 例如:SET session:1001 "userA" EX 60 # 60 秒后過期但是問題來了:Key 到期后,Redis 什么時候、如何刪除它&#xf…

nodejs 集成mongodb實現增刪改查

初始化項目: npm init -y npm install mongoose -save 安裝mongoose 插件 mongoose 鏈接數據庫語法: mongodb://[username:password]host1[:poert1],host2[:port2]…/[databsase]?[options…] userame: 用戶名 passwrod: 密碼 host1:port1,host2:port…

音視頻學習(五十八):STAP-A模式

什么是 STAP-A? STAP-A 是一種特殊的 RTP 封裝機制,專為 H.264 和 H.265 這類視頻編碼協議設計。它的核心目的只有一個:將多個小的 NALU(網絡抽象層單元)打包進一個 RTP 包中,以此來減少網絡開銷&#xff0…

管理型交換機通過VLAN劃分實現不同IP跨網段通信配置方法

管理型交換機應用場景豐富,如果要實現不同IP跨網段通信(比如172.22.106.X和192.168.100.X實現通信),通過VLAN劃分是可以滿足,下面分享基于弱三層交換機RTL9301方案核心模塊SW-24G4F-301EM配置方法! 1. 一般結合交換機的應用場景&a…

什么是高防服務器?如何進行防御?

高防服務器是指能為用戶提供防御網絡攻擊,是主要針對DDOS等流量型攻擊能力的服務器,通過部署專業的硬件設備與軟件系統,具備高帶寬、大流量清洗能力,能有效抵御各類惡意流量沖擊,確保服務器穩定運行,保障網…

SW - 增加導出STL數據中的三角面數,增加別人逆向建模的難度

文章目錄SW - 增加導出STL數據中的三角面數,增加別人逆向建模的難度概述筆記SW版本導出時,選擇STL的導出選項默認導出(精細)導出粗糙自定義導出 - 將誤差和角度改為最大自定義導出 - 將誤差,角度,三角面數改為最大備注這幾天的感想關于我不參考人家零件&…

四十一、【高級特性篇】API 文檔驅動:OpenAPI/Swagger 一鍵導入測試用例

四十一、【高級特性篇】API 文檔驅動:OpenAPI/Swagger 一鍵導入測試用例 前言 準備工作 第一部分:后端實現 - OpenAPI 解析與批量創建 API 1. 創建 OpenAPI 解析服務 2. 創建批量用例導入 API 3. 注冊新 API 路由 第二部分:前端實現 - OpenAPI 導入界面 1. 更新 `api/testca…

K8S-Service資源對象

一、概述在kubernetes中,pod是應用程序的載體,我們可以通過pod的ip來訪問應用程序,但是pod的ip地址不是固定的,這也就意味著不方便直接采用pod的ip對服務進行訪問。為了解決這個問題,kubernetes提供了Service資源&…

【STM32】CubeMX(十三):RT-THREAD

本篇博客描述的是 RT-Thread STM32 CubeMX 的使用方法。本文也為大家提供了基于 STM32 使用 CubeMX 添加 RT-Thread 并創建閃爍 LED 任務 的操作流程。 便于您更好的理解。 一、RT-Thread 是什么? RT-Thread 是一個開源、輕量級的實時操作系統,適用于…

基于Ubuntu22.04系統PaddleX和PaddleClas訓練推理MMAFEDB人臉表情識別數據集(詳細教程)

目錄 基于Ubuntu22.04系統PaddleX和PaddleClas訓練推理MMAFEDB人臉表情識別數據集(詳細教程) 超實用的Paddle圖像分類訓練推理教程,助力深度學習研究! 1、環境準備(重要???) 構建虛擬環境 安裝PaddlePaddle 安裝PaddleX 安裝PaddleClas插件 2…

Mistral AI音頻大模型Voxtral解讀

1. 引言 傳統的語音處理系統(如OpenAI的Whisper)在ASR任務上取得了巨大成功,能將語音高精度地轉換為文本。但這只是第一步。真正的“語音理解”意味著: 內容推理:不僅知道說了什么,還能理解話語背后的含義、情感和意圖。 長篇摘要:能夠聽完一段長達數十分鐘的播客或會議…

使用Docker+WordPress部署個人博客

一、通過docker compose 自動一鍵部署WordPress 1. 準備工作 安裝 Docker 和 Docker Compose確保服務器有公網 IP(如果需要外部訪問)域名(可選,用于綁定網站) 2. 創建 Docker Compose 配置文件 創建一個docker-compose…

http與https配置

Web 服務詳解:HTTP 與 HTTPS 配置 一、HTTP 服務概述 HTTP(Hypertext Transfer Protocol,超文本傳輸協議)是用于在網絡上傳輸網頁數據的基礎協議,默認使用80 端口,以明文形式傳輸數據。常見的 HTTP 服務軟件…

Python爬蟲實戰:研究amazon-scrapy,構建亞馬遜電商數據采集和分析系統

1 引言 1.1 研究背景 電子商務的高速發展使電商平臺成為數據價值的核心載體。亞馬遜作為全球領先的電商生態,截至 2024 年第二季度,其平臺商品總量突破 1.5 億,日均活躍用戶超 3 億,每日產生 PB 級的交易數據與用戶行為記錄。這些數據包含商品特征(價格、規格、品牌)、…

基于ERNIE 4.5的多智能體協作的自動化視頻輿情分析報告生成器

多智能體協作的自動化視頻輿情分析報告生成器 1. 項目的意義與價值 從“非結構化視頻”中挖掘“結構化洞察”的通用挑戰 在當今的數字生態中,視頻已成為信息傳播、知識分享和消費者意見表達的核心媒介。從企業內部的會議錄屏、技術培訓,到外部的市場宣傳…

Java全棧開發面試實錄:從基礎到實戰的深度解析

Java全棧開發面試實錄:從基礎到實戰的深度解析 面試官與應聘者的對話記錄 第一輪:基礎問題與項目背景 面試官(中年男性,穿著整潔): 你好,歡迎來到我們公司。我是今天的面試官,可以先…

如何清除webview138、139版本軟鍵盤占用的區域

好的,這個問題非常具體且關鍵。在 Android System WebView 的 138 和 139 版本(基于 Chromium 113)的上下文中,“清除軟鍵盤占用的區域”通常意味著:在軟鍵盤收起后,WebView 的布局或視口沒有正確恢復&…

深度學習:卷積神經網絡(CNN)

文章目錄一、CNN 基礎認知1.1 圖像在計算機中的存儲形式1.2 圖像識別的核心需求:畫面不變性1.3 傳統神經網絡的局限二、CNN 核心原理:三大核心層與關鍵操作2.1 卷積層(1)什么是卷積操作?(2)卷積…

iOS 26 正式版即將發布,Flutter 完成全新 devicectl + lldb 的 Debug JIT 運行支持

在之前的 《Flutter 又雙叒叕可以在 iOS 26 的真機上 hotload》 和 《Flutter 在 iOS 真機 Debug 運行出現 Timed out *** to update》 我們聊過,由于 iOS 26 開始,Apple 正式禁止了 Debug 時 mprotect 的 RX 權限,導致了 Flutter 在 Debug 運…

機器學習全流程拆解 _ 從數據到模型的科學之道

-—— 避開80%項目失敗的隱形成本,掌握高效建模方法論*📌 一、明確目標:成敗的起點 1. 問題定位 分類任務:區分二分類/多分類/多標簽分類預測任務:標量預測(如房價)vs 向量預測(如股…