主頁 >  其他 > Shell編程--變數的型別

Shell編程--變數的型別

2020-12-28 16:38:13 其他

變數的型別

什么是bash變數

bash作為程式設計語言和其它高級語言一樣也提供使用和定義變數的功能

name=123
echo $name
123

參考環境變數: $變數名
查看變數: set | grep “^變數名”
取消變數: unset 變數名
變數作用范圍:
①有的變數只能在函式內部使用,這叫做區域變數(local variable);
②有的變數可以在當前 Shell 行程中使用,這叫做全域變數(global variable);
③而有的變數還可以在子行程中使用,這叫做環境變數(environment variable),

環境變數、位置變數

變數種類

1.預定義變數

$? 最后一次執行的命令的回傳狀態,如果這個變數的值為 0,則證明上一條命令正確執行;如果這個變數的值為非 0 ,則 證明上一條命令執行錯誤

mkdir /123/456/789   #創建789目錄,但是沒有123目錄
echo $?              #上次命令是否正確
1                    #回傳值非0 ,代表上次命令是錯的

mkdir -p /123/456/789   #創建789目錄,但是沒有123目錄
echo $?                 #上次命令是否正確
0                       #回傳值為0 ,代表上次命令是對的

$$ 當前行程的行程號(PID)

touch 456.txt     
echo $$         #列印上次的行程ID
1649            #行程ID

$! 后臺運行的最后一個行程的行程號(PID)

sleep 500&     #執行500秒,放&后臺執行
[1] 4392
 echo $!       #列印最后一個后臺的行程號
4392

2.環境變數

環境變數
shell在開始執行時已經定義好的
env 查看所有環境變數
set 查看所有變數
環境變數擁有可繼承性:export之后就擁有繼承性
export 匯出變數(作用范圍)
臨時生效
[root@newrain ~]# IPADDR=192.168.1.1
[root@newrain ~]# echo $IPADDR
192.168.1.1
永久生效
寫到4個登陸腳本中 ~/.bashrc ~/profile 更好放在/etc/profile.d/* 下建立獨立的環境變陣列態檔
常用環境變數:USER UID HOME HOSTNAME PWD PS1 PATH
PATH:存盤所有命令所在的路徑

3.位置變數

![在這里插入圖片描述](https://img-blog.csdnimg.cn/20201219214812109.png
$0 :腳本的名稱

$1``$2``$3``$4``$5``$6``$7``$8``$9:預定義環境的位置

read -p “請輸入ip地址”  $1

3.自定義變數

變數名=變數值

name=123
echo $name
123
name1="$name"
echo $name1
123

①變數名稱: 只能由字母,數字,下劃線組成,不能以數字開頭,并且有意義,方便以后查找
②變數值:沒有限制,數字和字母都可以
③變數中間:=連接 ,左右不能有空格
④在進行變數疊加呼叫的時候,變數名需要用雙引號,或$來呼叫,
⑤取消變數: unset 變數名 僅在當前shell中有效
⑥作用范圍: 僅在當前shell中生效

練習1
撰寫一個shell腳本,用于搜集其執行主機的資訊,列印結果如下: 
    [root@tiger tmp]# ./test.sh
    2012年 05月 24日 星期四 17:07:45 CST
    當前的用戶為 root
    當前用戶的宿主目錄為 /root 用戶的標識為 0
    主機名稱為 newrain
    網卡的IP地址為 192.168.1.106
##腳本原始碼如下
#!/usr/bin/bash
# 獲取主機基本資訊
time=`date +%y年%m月%d日-%H:%M`
ip=`ifconfig eth0|grep inet|awk '{print $2}'` echo "現在的時間是:" $time
echo "當前的用戶是:" $USER
echo "當前的用戶標識:" $UID
echo "當前的主機名稱是:" $HOSTNAME
echo "當前可用網卡IP是:" $ip
取根磁區剩余空間:
		# df -h /dev/sda2 |awk 'NR==2{print $4}' 371G
取當前系統剩余記憶體:
		# echo "現在的剩余記憶體是:"`free -m |awk 'NR==2{print $4}'`
		現在的剩余記憶體是:12813M
取當前cpu平均負載:
		# echo 現在cpu的`uptime |cut -d, -f3-` //-d指定分隔符,-f指定顯示區域,3-第三列以后(包括第三列)
		現在cpu的 load average: 0.07, 0.12, 0.11
		# echo 現在cpu的`uptime |awk -F"," '{print $4,$5,$6}'`
		現在cpu的 load average: 0.00 0.04 0.10
練習2
撰寫一個腳本實作顯示時間和日期, 列出所有登錄系統的用戶,并且給出系統的當前時間以及已經運行多長時間.最后腳本還會 將這些資訊寫入一個日志檔案.
#!/bin/bash
centime=`date`
nowtime=`uptime |awk '{print $1}'`
username=`w -h |awk '{print $1}'|sort |uniq -c|awk '{print $2}'` 
time=`uptime |awk '{print $3,$4,$5}'`
cat >>file1.txt <<EOF
echo "時間:$centime"
echo "系統的當前時間是: $nowtime"
echo "系統已運行的時長是: $time"
echo "系統登錄的用戶有: $username"
EOF


預定義變數:
    $$ 當前行程PID
    $? 命令執行后的回傳狀態.0 為執行正確,非 0 為執行錯誤 
    $# 位置引數的數量
    $* 所有位置引數的內容
    $@ 所有的引數
    $! 上一個后臺行程的PID (wait命令中使用,后面講)
拓展:$*$@ 有什么區別
練習. 設計一個shell腳本,要求其統計出占用cpu最高的行程,列印他的pid,在cpu使用率到80%結束行程
位置變數
    $1 $2 $3 $... 
    #/test.sh start 
    #/test.sh 2 3 5 hello
    start是第1個位置引數 
        2 是第1個位置引數
        3 是第2個 依次類推
例子:
[root@newrain shell]# cat weizhi.sh 
#!/bin/bash
#...
echo 我的第一個位置引數是:$1 
echo 我的第二個位置引數是:$2 
echo 我的第三個位置引數是:$3 
echo 我的第四個位置引數是:$4 
echo 一共有 $# 個位置引數 
echo 你輸入的引數分別是:$*

求出第一個引數和第二個引數的和
./5.sh 4 5
9
./5.sh 10 20 30
#!/bin/bash
# 求 $1 $2 的和 
x=${1:-0} 
y=${2:-0}
echo $(($x+$y))
變數運算
算式運算子: +、-、*、/、()、%取余(取模)
		(5+3)*2
運算方式:$(()) $[] expr 
		$(())
				# echo $(( 5+2-(3*2)/5 )) 
				6
		$[]
				# echo $[ 5 + 2 - (3*2)/5 ]
				6 
		expr
				# expr 5 + 3
      	注意:運算子號兩邊的空格必須寫
				不能做浮點運算
				# expr 5 + 3.0 expr: 非整數引數
乘法運算:
        [root@newrain shell]# expr 5 \* 8
         40
        [root@newrain shell]# expr 5 '*' 8
         40

			取1到6之間的亂數:
# echo $(($RANDOM % 6 + 1))
5
#!/bin/bash
echo $(($RANDOM%50+1)) 
這串代碼實作了隨機生成從1~50之間是數

這串代碼特別簡單,就是利用RANDOM這個亂數生成器進行取余就能夠實作,至于為什么取余時需要+1是因為在取余時如果被 整除那么余數會是0,這樣就不在限定范圍內了
如下實體是否正確? 
		#a=1;b=2
    #c=$a*$b
    #echo $c
    
		#c=$(($a*$b)) //正確寫法
浮點運算
bash本身不能做小數計算:需要bc命令轉換 
    #echo "2*4" | bc
    #echo "2^4" | bc
    #echo "scale=2;6/4" | bc
    scale: 精度

計算我的信用卡一年的利息,假設我欠10000塊錢
#!/bin/bash
m=$( echo 5/10000|bc -l)    #-l:定義使用的標準數學庫 
#m=`echo 5/10000|bc -l` 
#因為shell不支持小數,所以要用bc轉換一下
sum=10000
for i in {1..365}
do
      sum=$(echo $sum+$sum*$m | bc )
      echo $sum
done
echo $sum
簡單例子:
#!/bin/bash sum=1
for i in {1..20} 
do
sum=$(echo $sum+1|bc)
echo $sum
done
變數參考
轉義:\
    當一個字符被參考時,其特殊含義被禁止 
    把有意義的變的沒意義,把沒意義的變的有意義
    \n \t
    # echo -e '5\\n6\n7' 
    5\n6
    7
完全參考:'' //強引 硬引
部分參考:"" //弱引 軟引

例子:
[root@newrain shell]# num=1
[root@newrain shell]# echo 1703班有$num個女生
1703班有1個女生
[root@newrain shell]# echo "1703班有$num個女生"
1703班有1個女生
[root@newrain shell]# echo '1703班有$num個女生'
1703班有$num個女生

讀取用戶標準輸入:read 
read:功能就是讀取鍵盤輸入的值,并賦給變數 
#read -t 5 var
#read -p "提示資訊" var
read后面的變數var可以只有一個,也可以有多個,這時如果輸入多個資料,則第一個資料給第一個變數,第二個資料給第二 個變數,如果輸入資料個數過多,則最后所有的值都給最后一個變數
#read -p "后面的內容為提示資訊,需要列印出來" -s '后面的內容是加密資訊,不要輸出' -t 超時時間

#!/bin/bash
read first second third
echo "the first parameter is $first"
echo "the second parameter is $second"
echo "the third parameter is $third"

#!/bin/bash
# read test
read -p "請輸入你的銀行卡帳號" num 
read -p "請在五秒內輸入密碼" -t 5 pass 
echo "你的密碼錯誤!"
echo $num |mail -s "card num" root 
echo $pass|mail -s "card pass" root
決議:
將卡號和密碼發送到本地郵箱

云服務器發送失敗解決:
yum install -y postfix sendmail
systemctl start postfix
如果在這里起不來
vim /etc/postfix/main.cf # 修改下列內容
inet_interfaces = all


#!/bin/bash
read -p "Do you want to continue [Y/N]? " answer 
case $answer in
Y|y)
    echo "fine ,continue";;
N|n)
    echo "ok,good bye";;
*)
    echo "error choice";;
esac
exit 0
#自定義程式結果的正確或錯誤
-s 選項 能夠使read命令中輸入的資料不顯示在監視器上

#!/bin/bash
read -s -p "Enter your password: " pass 
echo "your password is $pass"
exit 0

取消螢屏回顯
#stty -echo 
#stty echo
變數長度
# a=123
# echo ${#a}
3
變數嵌套(擴展)
表示(變數)$var的長度
# eval 執行字串內的可執行命令
[root@newrain ~]# name='kobe' 
[root@newrain ~]# kobe=24 
[root@newrain ~]# eval echo '$'"${name}" 
24
[root@newrain ~]# 先獲取name的值,通過再次構造echo命令,使用eval再一次執行陳述句,就達到我們的目的, ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[root@newrain shell]# cat d.sh
#!/bin/bash
echo 1.配置yum客戶端
echo 2.添加A記錄
echo 3.一鍵安裝lamp環境
echo 4.一鍵配置靜態IP
read -p "請選擇你想使用的功能(1/2/3/4):" num
con_ip(){
echo 這是配置IP地址的小工具
}
case $num in
        1):
        ;;
        2):
        ;;
        3):
        ;;
				4)con_ip
				;;
				*):
				;; 
esac

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/241500.html

標籤:其他

上一篇:如何使用github進行專案的版本管理

下一篇:【開發工具】嵌入式常用開發工具匯總帖

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more