1. 程式人生 > 實用技巧 >第二章 變數

第二章 變數

一、變數介紹

1)什麼是變數?

量指的是記錄事物的狀態
變指的是事物的狀態是可以發生變化的
#變數本質就是一種資料儲存的機制,變數的資料都是存放於記憶體中的

2)為何要有變數?

程式=資料+功能
程式執行的本質就是一系列狀態的變化,變是程式執行的直接體現,所以我們需要有一種機制能夠反映或者說是儲存下來程式執行時狀態以及狀態的變化
#比如
	英雄2的等級為1,打怪升級(變)為10
	殭屍的存活狀態為true,被植物打死了,於是變為false
	人的名字為jh,也可以修改為JH

二、變數的使用

1)先定義、後引用

1.先定義
	#1.語法:變數名=值
	#2.注意:等號左右兩邊不能有空格!!!
	#3.例如
	[root@localhost shell]# name="jh"
	
2.後引用
	[root@db04 /scripts/day02]# ip="192.168.1.10"
	[root@db04 /scripts/day02]# echo $ip
	192.168.1.10
	
	注意:如果是列印百分比,建議使用$(變數名)%
	[root@db04 /scripts/day02]# percent=44
	[root@db04 /scripts/day02]# echo ${percent}%
	44%

2)刪除變數

[root@db04 /scripts/day02]# ip="192.168.1.10"
[root@db04 /scripts/day02]# echo $ip
192.168.1.10
[root@db04 /scripts/day02]# unset ip
[root@db04 /scripts/day02]# echo $ip

[root@db04 /scripts/day02]# 

三、變數的三大組成部分

定義一個變數由三大部分組成:
1.變數名:用來訪問到變數值的
2.賦值符號:將變數值的記憶體地址繫結給變數名
3.變數值:記錄的事物的狀態,即我們存的資料

1)變數名的命名規範

定義變數把資料存到記憶體中不是目的,目的是以後要取出來用,而變數名就是用來取變數值的,而變數的名字直接表明了所存值的意義,可見變數名的命名非常重要。

#變數名的命令應該見名知意,同時遵循如下規則
以字母或下劃線開頭,剩下的部分可以是:字母、數字、下劃線,最好遵循下述規範:
1.以字母開頭
2.使用中劃線或者下劃線做單詞的連線
3.同類型的用數字區分
4.對於檔案最好加上拓展名
	如: sql_bak.tar.gz,log_bak.tar.bz2 
5、不要帶有空格、?、*等特殊字元
6、不能使用bash中的關鍵字,例如if,for,while,do等
7、不要和系統環境變數衝突

#變數名的命名風格:
  1、純小寫字母加下劃線
	age_of_oldboy=18
				
  2、駝峰體
	AgeOfOldboy=18

2)變數值的三種來源

1.直接賦值

# 1. 顯式賦值:變數名=變數值
示例:
ip1=192.168.11.200
school="Shanghai oldboy"
today1=`date +%F`
today2=$(date +%F)

# 2、應用示例
[root@localhost ~]# url="www.baidu.com"
[root@localhost ~]# echo $url
www.baidu.com
[root@localhost ~]# url="www.sina.com.cn"
[root@localhost ~]# echo $url
www.sina.com.cn

2.從位置引數獲取變數值,即從命令獲取

從呼叫指令碼時傳入的位置引數獲取變數值:./b.sh a1 a2 a3
需要用到$n獲取第n個位置引數值,超過10需要用${n},如下
$0 $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10}
# 示例
[root@egon ~]# cat b.sh
#!/usr/bin/env bash
echo ${0}
echo $1
echo $2
echo $3
echo $4
echo $5
echo $6
echo $7
echo $8
echo $9
echo ${10}
echo ${11}
echo ${12}

# 執行
[root@egon ~]# chmod +x b.sh
[root@egon ~]# ./b.sh a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15
./b.sh
a1
a2
a3
a4
a5
a6
a7
a8
a9
a10
a11
a12
# 企業使用:可以實現指令碼的不同功能(服務程式管理指令碼-啟動功能 關閉功能 重啟功能)
server.sh start|stop|restart

3.與使用者互動獲取變數值,即通過鍵盤鍵入來獲取

何為互動,即輸入輸出

# 1. read 接收使用者的輸入,即從鍵盤讀入變數值
read 變數名
read -p "提示資訊: " 變數名
read -t 5 -p "提示資訊: " 變數名 # -t指定秒數
read -n 2 變數名 # -n讀取的字元個數

應用示例:vim first.sh
back_dir1=/var/backup
read -p "請輸入你的備份目錄: " back_dir2
echo $back_dir1
echo $back_dir2

企業使用:可以根據需求調整變數值,可以便於新員工快速掌握企業指令碼使用

#2.輸出,把程式的處理結果反饋給使用者:
#2.1 echo命令格式化輸出					
[root@localhost ~]# user="egon"
[root@localhost ~]# age=18
[root@localhost ~]# echo "my name is $user my age is $age"

還可以輸出帶顏色(瞭解即可)
echo -e "\033[31m 紅色字 \033[0m"
echo -e "\033[34m 黃色字 \033[0m"
echo -e "\033[41;33m 紅底黃字 \033[0m"
echo -e "\033[41;37m 紅底白字 \033[0m"

案例:
========egon=========
年齡:18
體重:70
身高:181
等級:10
=====================

#2.2 printf命令的格式化輸出
%s
%d
%7.3f  列印浮點數,總寬度為7,小數位保留3位,並且四捨五入
printf "my name is %s, my age is %s\n" "egon" 18
printf "my name is %s, my age is %d\n" "egon" 18
						
printf "my name is %s, my salary is %s\n" "egon" 3.337
printf "my name is %s, my salary is %.2f\n" "egon" 3.337
printf "my name is %s, my salary is %8.2f\n" "egon" 3.337
												
x="egon"
y=18
printf "my name is %s, my age is %s\n" $x $y

三、預定變數

$* # 獲取所有的位置引數
$@ # 獲取所有的位置引數
$# # 獲取所有的位置引數個數
$$ # 獲取當前shell程序的pid
   # 此外,可以使用只讀變數來獲取父程序的PID:$PPID、獲取執行指令碼的使用者ID:$UID
$? 上一個命令的返回值 0表示成功 非0代表失敗

#示例1:
[root@egon ~]# chmod +x b.sh
[root@egon ~]# ./b.sh a1 a2 a3 a4 a5
a1 a2 a3 a4 a5
a1 a2 a3 a4 a5
5
18988
1
[root@egon ~]# cat b.sh
#!/usr/bin/env bash
echo $*
echo $@
echo $#
echo $$
ping -c1 192.168.11.10 &>/dev/null
echo $?

#示例2:
[root@egon ~]# vim ping.sh
#!/bin/bash
ping -c2 $1 &>/dev/null
if [ $? = 0 ];then
echo "host $1 is ok"
else
echo "host $1 is fail"
fi
[root@egon ~]# chmod +x ping.sh
[root@egon ~]# ./ping.sh 192.168.11.10

瞭解:
如果我們想從命令列中獲取指令碼呼叫者傳入的引數值,用$n可以取到,但如果指令碼呼叫者在命令列傳入的引數個數不固定,那麼此時就需要用$*或$@來獲取了
$*與$@獲取的是所有位置引數,$0除外

當指令碼呼叫者的傳參形式如下是
[root@localhost ~]# ./script.sh 命令1 命令2 命令3

四、常量

相對於變數,常量就是不可以被改變的量,即只能讀不能改,所以又稱為只讀變數
使用readonly 命令可以將變數定義為只讀變數,只讀變數的值不能被改變

[root@egon ~]# x=111
[root@egon ~]# readonly x
[root@egon ~]# x=666

-bash: x: 只讀變數

五、基本資料型別

1.整型:年齡、個數、號碼
	age=10
	level=3
	
2.浮點型:薪資、身高、體重
	salary=3.3
	height=1.81
	
	
3.字串型別:名字、國籍、名人名言、ip地址等描述性質的內容
	msg="hello"
	msg='hello'  # 硬引用,包含的字元均無特殊意義
	
	ps:shell是一門解釋型的、弱型別、
		hobbies="抽菸 喝酒 燙頭"
			
4.陣列型別:
	1)普通陣列
		hobbies=("抽菸" "喝酒" "燙頭")
		echo ${hobbies[0]}
			
		declare -a array1
         array1[0]=111111111111111

		[root@www ~]# array2=([2]=3.3 [1]=1.1 [3]=4.4)
		[root@www ~]# echo ${array2[1]}
		1.1
		[root@www ~]# echo ${array2[3]}
		4.4
		[root@www ~]# echo ${array2[2]}
		3.3
		[root@www ~]# echo ${array2[0]}

		[root@www ~]#
		
	2)關聯陣列
		[root@www /scripts/day02]# name="egon"
		[root@www /scripts/day02]# age=18
		[root@www /scripts/day02]# gender="male"
		[root@www /scripts/day02]# info1=("egon" 18 "male")
		[root@www /scripts/day02]# declare -a |grep info1
		declare -a info1='([0]="egon" [1]="18" [2]="male")'
		[root@www /scripts/day02]# 
		[root@www /scripts/day02]# declare -A info2=(["name"]="egon" ["age"]=18 ["gender"]="male")
		[root@www /scripts/day02]# declare -A | grep info2
		declare -A info2='([gender]="male" [name]="egon" [age]="18" )'
		[root@www /scripts/day02]# echo ${info2["name"]}
		egon
		[root@www /scripts/day02]#