CentOS shell中的變數

哈哈哈hh發表於2022-07-29

映象下載、域名解析、時間同步請點選  阿里雲開源映象站

shell中的變數

變數的介紹

變數即變化的量,核心是”變“與”量“二字,變即變化,量即衡量狀態。

量:是記錄現實世界當中的某種狀態
變:指的是記錄的狀態是可以傳送變化的

name=wsh
age=22

如何使用變數

變數名	賦值符號 變數值
name=wsh	//shell中定義變數
name:wsh	//yaml中定義的變數

定義變數的語法

  • 變數名

相當於一個門牌號,便於取出變數值,是訪問到值的唯一方式

  • 賦值符號

將值的記憶體地址,繫結給變數名

  • 變數值

用來表示狀態

變數的使用規則:先定義,再透過變數名去引用

定義變數名的規範

變數名的命名規則

1.大前提:變數名的命名應該能夠反映出值記錄的狀態
2.變數是用來訪問變數值的,所以變數名應該遵循一定規範,來方便我們標識存到記憶體中值的功能

1.變數名只能是字母、字母、數字或下劃線的任意組合(區分大小寫)
2.變數名不可以使用中文
3.變數名不可以使用命令來命名
4.不要用拼音
5.變數名不能以數字開頭

變數名定義的方式

1.下劃線+純小寫
name_of_wsh='wushihang'
name_of_oldboy='laonanhai'
2.駝峰體
nameOfWsh='wushihang'
nameOfOldboy='laonanhai'
ageOfOldboy=88
3.下劃線+純大寫
NAME_OF_OLDBOY='laonanhai'
不好的方式:
1.變數名為中文、拼音
2.變數名過長
3.變數名詞不達意

變數的分類

系統內建環境變數

## 檢視系統環境變數
env
declare
export
## 環境變數
LANG		## 字符集語言
PATH		## 該變數中路徑裡的所有可執行檔案,都可以直接執行,不需要加路徑
PS1			## 命令提示符
UID			## 當前登入使用者的uid
HOSTNAME	## 當前主機
PWD			## 當前工作路徑
USER		## 當前登入的使用者名稱
## 歷史記錄相關
HISTSIZE
HISTFILESIZE
HISTFILE
TMOUT
HISTCONTROL:	export HISTCONTROL=ignorespace	# 離職專用變數(強制歷史記錄不記住該命令)
PROMPT_COMMAND

普通變數

DATE=$(date +%F-%T)
IP=$(ifconfig eth0|awk 'NR==2{print $2}')
mkdir $DATE_$IP_$HOSTNAME ## 基本涼了
### 注意使用大括號分隔變數
mkdir ${DATE}_${IP}_${HOSTNAME}

位置變數

$n:	N正整數,$1 $2 $3....$n		兩位數要使用{}, ${10} ${11}
$0:	執行指令碼的路徑和名字
$#:	傳遞引數的個數
$*:	1.不適合陣列使用			2.呼叫時加雙引號	## 接收指令碼後面所有的引數
$@:	1.適合後面陣列資料型別使用	2.呼叫時加雙引號	## 接收指令碼後面所有的引數

特殊變數(狀態)

$?:表示上一個命令執行的狀態(上一條命令的返回值) 0,成功執行 非0,失敗
特殊命令:
	- false
	- diff
$$:表示當前指令碼執行的pid
$!:上一個指令碼或程式執行的pid
$_:獲取上一條命令的最後一個引數(以空格為分隔符)	## 相當於 Esc + .

變數的子串

${#變數名}:獲取該變數的長度
[root@web01 ~]# vim a.sh
#!bin/bash
name=wsh
echo ${#name}
[root@web01 ~]# . a.sh 
3
[root@web01 ~]# vim a.sh
#!bin/bash
name=$1
echo ${#name}
[root@web01 ~]# . a.sh  123456
6
[root@web01 ~]# vim a.sh
#!bin/bash
read -p '請輸入使用者名稱:' name
read -p '請輸入密碼:' pas
if [ ${#pas} -lt 8 ];then
  echo '密碼必須大於等於八位'
else
  echo '密碼符合要求'
fi
[root@web01 ~]# . a.sh
請輸入使用者名稱:www
請輸入密碼:111
密碼必須大於等於八位
[root@web01 ~]# . a.sh
請輸入使用者名稱:www
請輸入密碼:12345678
密碼符合要求
${變數名}:呼叫變數
${變數名:偏移量}:字串的擷取
[root@web01 ~]# vim a.sh
#!bin/bash
name=wsh
echo ${name:1}
[root@web01 ~]# . a.sh
sh
${變數名:偏移量:步長}:字串的擷取
[root@web01 ~]# vim a.sh
#!bin/bash
name=wsh_blog51CTO
echo ${name:3:5}
[root@web01 ~]# . a.sh
_blog
${變數名#字串}:從變數開頭,刪除最短匹配word的子串
${變數名##字串}:從變數開頭,刪除最長匹配word的子串
[root@web01 ~]# vim a.sh
#!bin/bash
name=/tmp/abc/1.txt
echo ${name#*/}
echo ${name##*/}
[root@web01 ~]# . a.sh
tmp/abc/1.txt
1.txt
[root@web01 ~]# vim 1.txt
/tmp/abc/1.txt
/root/2.txt
/usr/local/src/3.txt
[root@web01 ~]# vim a.sh
#!bin/bash
for line in `cat 1.txt`;do
  echo ${line##*/}
done
[root@web01 ~]# . a.sh
1.txt
2.txt
3.txt
${變數名%字串}:從變數結尾,刪除最短匹配word的子串
${變數名%%字串}:從變數結尾,刪除最長匹配word的子串
#!bin/bash
for line in `cat 1.txt`;do
  echo ${line%%/*}
  echo ${line%/*}
done
[root@web01 ~]# . a.sh
/tmp/abc
/root
/usr/local/src
${變數名/匹配內容/替換內容}:使用string替換第一個pattern
[root@web01 ~]# vim a.sh
#!bin/bash
read -p '請輸入使用者名稱:' name
echo ${name/ww/wsh}
[root@web01 ~]# . a.sh 
請輸入使用者名稱:ww_fff_ggg_ww
wsh_fff_ggg_ww
${變數名//匹配內容/替換內容}:使用string替換所有pattern
[root@web01 ~]# vim a.sh
#!bin/bash
read -p '請輸入使用者名稱:' name
echo ${name//ww/wsh}
[root@web01 ~]# . a.sh 
請輸入使用者名稱:ww_ff_ww_gg
wsh_ff_wsh_gg

擴充套件變數

給變數預設值

${變數名:-字串}:如果parameter沒被賦值或其值為空,就以string作為預設值,它不會賦值給變數
[root@web01 ~]# echo $gender
[root@web01 ~]# echo ${gender:-male}
male
[root@web01 ~]# gender=female
[root@web01 ~]# echo $gender
female
[root@web01 ~]# echo ${gender:-male}
female
${變數名:=字串}:如果parameter沒被賦值或其值為空,就以string作為預設值,它會賦值給變數(使用者沒有傳遞值)
[root@web01 ~]# echo $gender
[root@web01 ~]# echo ${gender:=male}
male
[root@web01 ~]# gender=female
[root@web01 ~]# echo $gender
female
[root@web01 ~]# echo ${gender:=male}
female
${變數名:?報錯資訊}:如果parameter沒被賦值或其值為空,就以?後面的字串作為報錯輸出
[root@web01 ~]# unset gender 
[root@web01 ~]# echo ${gender:?male}
-bash: gender: male
${變數名:+字串}:如果parameter沒被賦值或其值為空,就什麼都不做,否則用string替換變數內容
[root@web01 ~]# gender=female
[root@web01 ~]# echo ${gender:+wsh}
wsh

變數的賦值方式

直接賦值: name=wsh
間接賦值:將一個命令執行的結果賦值給一個變數,IP=`ifconfig eth0|awk 'NR==2{print $2}'`
互動賦值:read -p '請輸入xxx' 變數名
傳參賦值:執行指令碼的時候,將需要傳遞的變數值,寫在指令碼的後面 $1 $2 $3

互動賦值

read:
read 選項 變數名
read 選項 -p '一句話' 變數名
## 選項
-p:列印一句話
-s:不顯示輸入內容
-t:設定超時時間
-a:將後面的結果放入陣列
[root@web01 ~]# vim a.sh
#!bin/bash
passwd=123
read -p 'm01 login:' name
read -s -p 'password:' pass
if [ $pass == $passwd ];then
  echo '登入成功'
else
  echo '密碼錯誤'
fi
[root@web01 ~]# . a.sh 
m01 login:www
password:密碼錯誤
[root@web01 ~]# . a.sh 
m01 login:www
password:登入成功
[root@web01 ~]# vim a.sh
#!bin/bash
passwd=123
read -p 'm01 login:' -a name
read -t 5 -s -p 'password:' pass
if [ $pass == $passwd ];then
  echo '登入成功'
  echo $name
else
  echo '密碼錯誤'
fi
[root@web01 ~]# . a.sh 
m01 login:www
password:-bash: [: ==: unary operator expected
[root@web01 ~]# . a.sh 
m01 login:www wsg ww rrr
password:登入成功
www

shell中的資料型別

## 字串型別
賦值:
name='字串'
取值:
$name
## 整型
age=18
## 陣列型別
賦值:
list=(python java golang shell)
list[0]='abc'
list[1]='efg'
list[2]='hij'
list[3]='xyz'
取值:
${list[0]}
${list[1]}
${list[2]}
${list[3]}
list=(python java golang shell)
echo $list
echo ${list[1]}
echo ${list[2]}
echo ${list[3]}
-------------------
list[0]='abc'
list[1]='efg'
list[2]='hij'
list[3]='xyz'
list=(python java golang shell)
echo $list
echo ${list[1]}
echo ${list[2]}
echo ${list[3]}
--------------------------
list=(python java golang shell)
list[0]='abc'
list[1]='efg'
list[2]='hij'
list[3]='xyz'
echo $list ${list[1]} ${list[2]} ${list[3]}
----------迴圈陣列------------------
[root@web01 ~]# vim a.sh
#!bin/bash
list=(python java golang shell)
for yuansu in ${#list[*]};do
  echo $yuansu
done
[root@web01 ~]# . a.sh 
4
echo ${#list[*]} // 陣列中元素的個數

本文轉自:https://blog.51cto.com/baicia/5516898


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70003733/viewspace-2908253/,如需轉載,請註明出處,否則將追究法律責任。

相關文章