Linux Shell編程(2) - Bash 變量

1、簡介與分類

1. Bash 變量的命名規則

  • 變量名只能包含字母、數字、下劃線
  • 變量名不能以數字做爲開頭
  • 變量名區分大小寫
  • 變量名長度不超過255個字符
  • 變量名在有效範圍內必須惟一

2. 變量按照存儲的數據類型分類

在Bash中,變量的默認類型都是字符串型
  • 字符串型
  • 整型
  • 浮點型
  • 日期型

3. 變量的分類

用戶自定義變量

  • 用戶本身定義的變量名

環境變量

  • 環境變量主要保存的是和系統操做環境相關的數據。
  • 變量能夠自定義,可是對系統生效的環境變量名和變量做用是固定的。

位置參數變量

  • 位置參數變量主要是用來向腳本當中傳遞參數或數據的。
  • 變量名不能自定義,變量做用是固定的。

預約義變量

  • 預約義變量是 bash 中已經定義好的便令。
  • 變量名不能自定義,變量做用是固定的。

2、用戶自定義變量

1. 定義變量

語法

變量名="變量值"

說明

  • 等號兩邊不能有空格
  • 當變量值中間有空格時,要用引號包裹變量值
  • 變量的默認類型都是字符串型
  • 變量只在當前的 bash 中生效

實例

[root~]# age=18
[root~]# name="zhang san"

2. 變量調用

語法

$變量名

說明

  • 調用變量須要在變量名前加 $
  • 變量的默認類型都是字符串型,因此沒法直接作 +, - 等運算操做
  • 賦值時引用變量,可以使用 "$變量名"${變量名}
  • 賦值時引用變量,若要在值兩邊使用引號,則必須使用雙引號,若使用單引號,則單引號內的變量不會轉換成變量值

實例

  • 調用變量須要在變量名前加 $
[root~]# echo $name
zhang san
  • 變量的默認類型都是字符串型,因此沒法直接作 +, - 等運算操做
[root~]# x=1
[root~]# y=2
[root~]# z=$x+$y
[root~]# echo $z
1+2
  • 賦值時引用變量,可以使用 "$變量名"${變量名}
[root~]# a=hel
[root~]# b="$a"lo
[root~]# echo $b
hello
  • 當變量值中間有空格時,要用引號包裹。賦值時引用變量,必須使用雙引號
[root~]# c="${b} world"
[root~]# echo $c
hello world
  • 賦值時引用變量,若使用單引號,則單引號內的變量不會轉換成變量值
[root~]# d='${b} world'
[root~]# echo $d
${b} world

3. 變量疊加

實例

[root~]$x=123
[root~]$echo $x
123

[root~]$x=${x}456
[root~]$echo $x
123456

[root~]$x="$x"789
[root~]$echo $x
123456789

4. 變量查看

語法

set [選項]

選項

-u:若是設定此項,調用未聲明的變量時會報錯(默認無任何提示)

實例

  • m 賦值爲空字符串,n 未定義。默認狀況下,echo $m$n,都沒有任何提示
[root~]# m=''
[root~]# echo m
m
[root~]# echo $m

[root~]# echo $n
  • set -u 後,echo $n 會報錯
[root~]# set -u
[root~]# echo $m

[root~]# echo $n
bash: n: unbound variable

5. 變量刪除

語法

unset 變量名

實例

[root~]# set -u

[root~]# x=hello
[root~]# echo $x
hello

[root~]# unset x
[root~]# echo $x
bash: x: unbound variable

3、環境變量

1. 環境變量和用戶自定義變量的區別

環境變量是全局變量;
用戶自定義變量是局部變量。

用戶自定義變量只在當前shell中生效;
環境變量在當前shell和這個shell的全部自shell中生效。shell

2. 設置環境變量

export 變量名=變量值

vim

變量名=變量值
export 變量名

實例

[root~]# export xxx=env
[root~]# env | grep xxx
xxx=env

[root~]# yyy=env
[root~]# export yyy
[root~]# env | grep yyy
yyy=env
[root~]# yyy=yyy
[root~]# env | grep yyy
yyy=yyy

3. 查看環境變量

set:查看全部變量

env:只查看環境變量

實例

[root~]# env
XDG_SESSION_ID=2
HOSTNAME=10.0.2.15
SHELL=/bin/bash
TERM=cygwin
HISTSIZE=1000
OLDPWD=/home/vagrant
USER=root
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00 ... 36:*.xspf=00;36:
SUDO_USER=vagrant
SUDO_UID=1001
USERNAME=root
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAIL=/var/spool/mail/vagrant
PWD=/root
LANG=en_US.UTF-8
SHLVL=1
SUDO_COMMAND=/bin/su
HOME=/root
LOGNAME=root
LESSOPEN=||/usr/bin/lesspipe.sh %s
SUDO_GID=1001
_=/bin/env

4. 刪除環境變量

unset 變量名
環境變量在當前shell和這個shell的全部自shell中生效。在子shell中刪除或者修改環境變量,並不能影響父shell中的環境變量

實例

  • 定義環境變量 xxxyyy
[root~]# export xxx=xxx
[root~]# export yyy=yyy
[root~]# env
xxx=xxx
yyy=yyy
  • 進入子shell,環境變量 xxxyyy 依然有效
[root~]# bash
[root~]# env
xxx=xxx
yyy=yyy
... 省略其餘環境變量 ...
  • 在子shell中刪除 xxx ,並修改 yyy 的值
[root~]# unset xxx
[root~]# yyy=zzz
[root~]# env
yyy=zzz
... 省略其餘環境變量 ...
  • 回到父shell,xxxyyy 的值沒受影響
[root~]# exit
[root~]# env
xxx=xxx
yyy=yyy
... 省略其餘環境變量 ...

5. 經常使用的環境變量

環境變量 說明
HOSTNAME 主機名
SHELL 當前的shell
TERM 終端環境
HISTSIZE 歷史命令條數
SSH_CLIENT 當前操做環境是使用ssh鏈接的,這裏記錄客戶端IP
SSH_TTY ssh鏈接的終端 pts/1
USER 當前登陸的用戶
PATH 系統查找命令的路徑
PS1 命名提示符設置。env命令不會輸出該環境變量
HOSTNAME=10.0.2.15
SHELL=/bin/bash
TERM=cygwin
HISTSIZE=1000
SSH_CLIENT=10.0.2.2 8432 22
SSH_TTY=/dev/pts/0
USER=vagrant
PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/vagrant/.local/bin:/home/vagrant/bin

PATH 環境變量

系統查找命令的路徑
  • 查看 PATH 環境變量
[root~]# echo $PATH
/sbin:/bin:/usr/sbin:/usr/bin
  • 增長 PATH 環境變量
[root~]# PATH="$PATH":/usr/share/bin
[root~]# echo $PATH
/sbin:/bin:/usr/sbin:/usr/bin:/usr/share/bin
注意這種修改方法只在當前shell中生效,若想永久生效,必須修改環境變量配置文件。

PS1 環境變量

命令提示符設置
  • 經常使用提示符說明
\d:顯示日期,格式爲 「星期 月 日」
\H:顯示完整的主機名,如 「localhost」
\t:顯示24小時制時間,格式爲 「HH:MM:SS」
\A:顯示24小時制時間,格式爲 「HH:MM」
\u:顯示當前用戶名
\w:顯示當前所在目錄的完整名稱
\W:顯示當前所在目錄的最後一個目錄
\$:提示符,若是是root用戶會顯示「#」,普通用戶會顯示「$」
  • 實例
[root~]# PS1='[\d]'
[Mon May 28]PS1='[\H]'
[10.0.2.15]PS1='[\t]'
[09:51:09]PS1='[\A]'
[09:51]PS1='[\u]'
[root]PS1='[\w]'
[~]PS1='[\W]'
[~]PS1='[\$]'
[#]PS1='[\[\e[1;31m\]\u\[\e[1;34m\]\w\[\e[0m\]]\$ '
[root~]#
注意這種修改方法只在當前shell中生效,若想永久生效,必須修改環境變量配置文件。

6. 語系變量

查看當前系統的語系

  • locale
LANG:定義系統主語系的變量
LC_ALL:定義總體語系的變量
  • 實例
[root~]# locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

語系變量 LANG

  • 查看系統當前語系
[root~]# echo $LANG
en_US.UTF-8
  • 查看系統支持的全部語系
[root~]# locale -a | more
aa_DJ
aa_DJ.iso88591
aa_DJ.utf8
aa_ER
...省略n行...
ar_SY
ar_SY.iso88596
ar_SY.utf8
ar_TN
ar_TN.iso88596
--More--

查詢系統默認語系

/etc/locale.conf    # CentOS7

/etc/sysconfig/i18n  # CentOS6
  • 實例
[root~]# cat /etc/locale.conf
LANG="en_US.UTF-8"

4、位置參數變量

1. 經常使用位置參數變量

位置參數變量 做用
$n n爲數字,$0表明命令自己,$1-$9表明第一個到第九個參數,十以上的參數須要用大括號括起來,如 ${10}
$* 這個變量表明命令行中全部的參數,$*把全部的參數當作一個總體
$@ 這個變量表明命令行中全部的參數,$@把每一個參數區分對待
$# 這個變量表明命令行中參數的個數

2. $n

  • 建立一個加法運算的shell腳本
[root/tmp]# vim eg1.sh

#!/bin/bash

num1=$1
num2=$2

# 變量sum是num1加num2的和
sum=$(( $num1 + $num2 ))

# 輸出變量sum的值
echo $sum
  • 運行shell腳本
[root/tmp]# chmod a+x eg1.sh

[root/tmp]# ./eg1.sh 3 2
5

3. $0$*$@$#

[root/tmp]# vim eg2.sh

#!/bin/bash

echo "\$0 命令是:$0"

echo "\$* 參數是:$*"

echo "\$@ 參數是:$@"

echo "\$# 參數個數是:$#"
  • 運行shell腳本
[root/tmp]# chmod a+x eg2.sh

[root/tmp]# ./eg2.sh 1 2 3 4 5
$0 命令是:./eg2.sh
$* 參數是:1 2 3 4 5
$@ 參數是:1 2 3 4 5
$# 參數個數是:5

[root/tmp]# ./eg2.sh 7 8 9
$0 命令是:./eg2.sh
$* 參數是:7 8 9
$@ 參數是:7 8 9
$# 參數個數是:3

4. $*$@ 的區別

[root/tmp]# vim eg3.sh

#!/bin/bash

echo "\$*中的全部參數當作是一個總體,因此這個for循環只會循環一次"

for m in "$*"
    do
        echo "參數是:$m"
    done

echo -e "\n--------------------------------------------------------\n"

echo "\$@中的每一個參數都當作是獨立的,因此「$@」中有幾個參數,就會循環幾回"

for n in "$@"
    do
        echo "參數是:$n"
    done
  • 運行shell腳本
[root/tmp]# chmod a+x eg3.sh

[root/tmp]# ./eg3.sh 1 2 3 4 5
$*中的全部參數當作是一個總體,因此這個for循環只會循環一次
參數是:1 2 3 4 5

--------------------------------------------------------

$@中的每一個參數都當作是獨立的,因此「1 2 3 4 5」中有幾個參數,就會循環幾回
參數是:1
參數是:2
參數是:3
參數是:4
參數是:5

5、預約義變量

1. 經常使用預約義變量

預約義變量 做用
$? 最後一次執行的命令的返回狀態。
若是這個變量的值爲0,說明上一個命令正確執行;
若是這個變量的值爲非0(具體數值,有命令本身決定),說明上一個命令執行不正確。
$$ 當前進程的進程號(PID)
$! 後臺運行的最後一個進程的進程號(PID)

2. $?:最後一次執行的命令的返回狀態

[root/tmp]# ls
eg1.sh  eg2.sh  eg3.sh
[root/tmp]# echo $?
0

[root/tmp]# cat eg
cat: eg: No such file or directory
[root/tmp]# echo $?
1

[root/tmp]# lll
bash: lll: command not found
[root/tmp]# echo $?
127

3. $$:當前進程的進程號(PID)

[root/tmp]# echo $$
4311
[root/tmp]# vim bl.sh

#!/bin/bash

echo "當前進程PID:$$"


[root/tmp]# chmod a+x bl.sh

[root/tmp]# ./bl.sh
當前進程PID:4382

4. $!:後臺運行的最後一個進程的進程號(PID)

[root/tmp]# find / -name hello &
[1] 4408

[root/tmp]# echo $!
4408

[root/tmp]# echo $!
4408
[1]+  Done                    find / -name hello

6、read 接收鍵盤輸入

1. 命令

read [選項] [變量名]

2. 選項

-p 提示信息:在等待用戶輸入時,輸出的提示信息
-t 秒數:指定等待用戶輸入的時長(秒),不設置的話會一直等待用戶輸入
-n 字符數:最多輸入字符數,當用戶輸入指定字符數時,就會自動執行
-s:隱藏用戶輸入的數據,適用於保密信息的輸入

3. 實例

[root/tmp]# vim read.sh

#!/bin/bash

# 等待30秒
read -p '請輸入你的用戶名:' -t 30 name
echo $name

# 隱藏輸入內容
read -p '請輸入你的密碼:' -s passwd
echo -e '\n'
echo $passwd

# 最多隻能輸入一個字符
read -p '請輸入你的性別 [M/F]:' -n 1 sex
echo -e '\n'
echo $sex
[root/tmp]# ./read.sh
請輸入你的用戶名:Mr.wang
Mr.wang
請輸入你的密碼:

123456
請輸入你的性別 [M/F]:M

M
相關文章
相關標籤/搜索