- 變量名只能包含字母、數字、下劃線
- 變量名不能以數字做爲開頭
- 變量名區分大小寫
- 變量名長度不超過255個字符
- 變量名在有效範圍內必須惟一
在Bash中,變量的默認類型都是字符串型
變量名="變量值"
[root~]# age=18 [root~]# name="zhang san"
$變量名
$
+
, -
等運算操做"$變量名"
或 ${變量名}
雙引號
,若使用單引號,則單引號內的變量不會轉換成變量值$
[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
[root~]$x=123 [root~]$echo $x 123 [root~]$x=${x}456 [root~]$echo $x 123456 [root~]$x="$x"789 [root~]$echo $x 123456789
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
unset 變量名
[root~]# set -u [root~]# x=hello [root~]# echo $x hello [root~]# unset x [root~]# echo $x bash: x: unbound variable
環境變量是全局變量;
用戶自定義變量是局部變量。用戶自定義變量只在當前shell中生效;
環境變量在當前shell和這個shell的全部自shell中生效。shell
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
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
unset 變量名
環境變量在當前shell和這個shell的全部自shell中生效。在子shell中刪除或者修改環境變量,並不能影響父shell中的環境變量
xxx
和 yyy
[root~]# export xxx=xxx [root~]# export yyy=yyy [root~]# env xxx=xxx yyy=yyy
xxx
和 yyy
依然有效[root~]# bash [root~]# env xxx=xxx yyy=yyy ... 省略其餘環境變量 ...
xxx
,並修改 yyy
的值[root~]# unset xxx [root~]# yyy=zzz [root~]# env yyy=zzz ... 省略其餘環境變量 ...
xxx
和 yyy
的值沒受影響[root~]# exit [root~]# env xxx=xxx yyy=yyy ... 省略其餘環境變量 ...
環境變量 | 說明 |
---|---|
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
系統查找命令的路徑
[root~]# echo $PATH /sbin:/bin:/usr/sbin:/usr/bin
[root~]# PATH="$PATH":/usr/share/bin [root~]# echo $PATH /sbin:/bin:/usr/sbin:/usr/bin:/usr/share/bin
注意這種修改方法只在當前shell中生效,若想永久生效,必須修改環境變量配置文件。
命令提示符設置
\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中生效,若想永久生效,必須修改環境變量配置文件。
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"
位置參數變量 | 做用 |
---|---|
$n |
n爲數字,$0 表明命令自己,$1 -$9 表明第一個到第九個參數,十以上的參數須要用大括號括起來,如 ${10} |
$* |
這個變量表明命令行中全部的參數,$* 把全部的參數當作一個總體 |
$@ |
這個變量表明命令行中全部的參數,$@ 把每一個參數區分對待 |
$# |
這個變量表明命令行中參數的個數 |
$n
[root/tmp]# vim eg1.sh #!/bin/bash num1=$1 num2=$2 # 變量sum是num1加num2的和 sum=$(( $num1 + $num2 )) # 輸出變量sum的值 echo $sum
[root/tmp]# chmod a+x eg1.sh [root/tmp]# ./eg1.sh 3 2 5
$0
,$*
,$@
,$#
[root/tmp]# vim eg2.sh #!/bin/bash echo "\$0 命令是:$0" echo "\$* 參數是:$*" echo "\$@ 參數是:$@" echo "\$# 參數個數是:$#"
[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
$*
與 $@
的區別[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
[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
預約義變量 | 做用 |
---|---|
$? |
最後一次執行的命令的返回狀態。 若是這個變量的值爲0,說明上一個命令正確執行; 若是這個變量的值爲非0(具體數值,有命令本身決定),說明上一個命令執行不正確。 |
$$ |
當前進程的進程號(PID) |
$! |
後臺運行的最後一個進程的進程號(PID) |
$?
:最後一次執行的命令的返回狀態[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
$$
:當前進程的進程號(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
$!
:後臺運行的最後一個進程的進程號(PID)[root/tmp]# find / -name hello & [1] 4408 [root/tmp]# echo $! 4408 [root/tmp]# echo $! 4408 [1]+ Done find / -name hello
read
接收鍵盤輸入read [選項] [變量名]
-p 提示信息
:在等待用戶輸入時,輸出的提示信息
-t 秒數
:指定等待用戶輸入的時長(秒),不設置的話會一直等待用戶輸入
-n 字符數
:最多輸入字符數,當用戶輸入指定字符數時,就會自動執行
-s
:隱藏用戶輸入的數據,適用於保密信息的輸入
[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