shell 變量是用一個(gè)固定的字符串去表示不固定的內(nèi)容,便于修改。
==變量類型==
自定義變量? 環(huán)境變量? ? 位置變量和預(yù)定義變量
=自定義變量=
A. 特性
1. 自定義變量(示例:ping01.sh引入變量)
定義變量: 變量名=變量值 變量名必須以字母或下劃線開(kāi)頭,區(qū)分大小寫(xiě) ip1=192.168.2.115
引用變量: $變量名 或 ${變量名}
查看變量: echo $變量名; "set"可以查看所有變量(包括自定義變量和環(huán)境變量)
取消變量: unset 變量名
作用范圍:
僅在當(dāng)前shell中有效
B. 示例:
使用變量前。麻煩
ping -c1 192.168.100.10 &>/dev/null? && echo 192.168.100.10up || echo 192.168.100.10down
使用變量后,簡(jiǎn)潔
#!/bin/bash
ip=192.168.100.10
ping -c1 $ip &>/dev/null? && echo $ip? up ||? echo "$ip? down"
C. 變量賦值(定義變量):
1. 顯式賦值:變量名=變量值
示例:
ip1=192.168.1.251
school="BeiJing 1000phone"
today1=`date +%F`
today2=$(date +%F)
2. read 從鍵盤(pán)讀入變量值
read 變量名
read -p "提示信息: " 變量名
read -t 5 -p "提示信息: " 變量名? //-t 等待5秒,后超時(shí)
read -n 2 變量名? ? ? ? ? ? //-n? 只記錄幾個(gè)字符
示例:
read -p "請(qǐng)輸入您測(cè)試的IP地址:" ip
ping -c1 $ip? &>/dev/null? && echo? " $ip up" || echo? "$ip? down"
=環(huán)境變量(了解)=
定義環(huán)境變量: 方法一 export back_dir2=/home/backup
方法二 export back_dir1 將自定義變量轉(zhuǎn)換成環(huán)境變量
引用環(huán)境變量: $變量名 或 ${變量名}
查看環(huán)境變量: echo $變量名 env 例如env |grep back_dir2
取消環(huán)境變量: unset 變量名
變量作用范圍: 在當(dāng)前shell和子shell有效 !!!
使變量開(kāi)機(jī)、登陸生效,將變量放到~/.bash_profile
永久生效:寫(xiě)到四個(gè)登錄腳本,/etc/profile ~/.baserc ~/.bash_profile /etc/bashrc
=位置變量和預(yù)定義變量(了解)=
語(yǔ)法命令? ? 參數(shù)1 參數(shù)2 參數(shù)3 ....9以后特殊定義
$1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ...
預(yù)先定義過(guò)的變量
$0 腳本名
$* 所有的參數(shù)
$@ 所有的參數(shù)
$# 參數(shù)的個(gè)數(shù)
$$ 當(dāng)前進(jìn)程的PID
$! 上一個(gè)后臺(tái)進(jìn)程的PID
$? 上一個(gè)命令的返回值 0表示成功
示例
準(zhǔn)備工作:
# vim test.sh
#!/usr/bin/bash
echo "第2個(gè)位置參數(shù)是$2"
echo "第1個(gè)位置參數(shù)是$1"
echo "第4個(gè)位置參數(shù)是$4"
echo "所有參數(shù)是: $*"
echo "所有參數(shù)是: $@"
echo "參數(shù)的個(gè)數(shù)是: $#"
echo "當(dāng)前進(jìn)程的PID是: $$"
echo '$1='$1
echo '$2='$2
echo '$3='$3
echo '$*='$*
echo '$@='$@
echo '$#='$#
echo '$$='$$
演示結(jié)果如下:
[root@localhost ~]# chmod +x test.sh
[root@localhost ~]# ./1.sh? 1 2 3 4 5 6 7 8 9
第2個(gè)位置參數(shù)是2
第1個(gè)位置參數(shù)是1
第4個(gè)位置參數(shù)是4
所有參數(shù)是: 1 2 3 4 5 6 7 8 9
所有參數(shù)是: 1 2 3 4 5 6 7 8 9
參數(shù)的個(gè)數(shù)是: 9
當(dāng)前進(jìn)程的PID是: 1946
$1=1
$2=2
$3=3
$*=1 2 3 4 5 6 7 8 9
$@=1 2 3 4 5 6 7 8 9
$#=9
$$=1946
$*和$@區(qū)別(資料)
shell中$*與$@的區(qū)別
關(guān)于$* 和 $@的 一點(diǎn) 認(rèn)識(shí) 同是菜鳥(niǎo)一起學(xué)習(xí)
$*? 所有的位置參數(shù),被作為一個(gè)單詞.
注意:"$*"必須被“”引用.
$@ 與$*同義,但是每個(gè)參數(shù)都是一個(gè)獨(dú)立的""引用字串,
這就意味著參數(shù)被完整地傳遞,并沒(méi)有被解釋和擴(kuò)展.這也意味著,每個(gè)參數(shù)列表中的每個(gè)參數(shù)都被當(dāng)成一個(gè)獨(dú)立的單詞.
注意:"$@"必須被“”引用.
$@ $* 只在被雙引號(hào)包起來(lái)的時(shí)候才會(huì)有差異
雙引號(hào)括起來(lái)的情況:
$*將所有的參數(shù)認(rèn)為是一個(gè)字段
$@以IFS(默認(rèn)為空格)來(lái)劃分字段,如果空格在“”里面,不劃分。采用LS的腳本運(yùn)行./test 1 "2 3" 4? 來(lái)發(fā)現(xiàn)差異
沒(méi)有括起來(lái)的情況是$@和$*一樣的,見(jiàn)到IFS就劃分字段。還是采用LS的腳本運(yùn)行./test 1 "2 3" 4? 來(lái)發(fā)現(xiàn)差異
一個(gè)小例子 ,僅供參考
[Copy to clipboard] [ - ]CODE:#!/bin/bash
echo
index=1
echo "Listing args with\"\$*\":"
for arg in "$*"
do
echo "Arg #$index=$arg"
let "index+=1"
done
echo "所有的參數(shù)被認(rèn)為是一個(gè)單詞"
echo
index=1
echo "Listing args with \"\$@\":"
for arg in "$@"
do
echo "Arg #$index=$arg"
let "index+=1"
done
echo "所有的參數(shù)被認(rèn)為是各個(gè)獨(dú)立的單詞"
echo
index=1