Shell_02_變量

一狡蝶、什么是變量

簡單說就是讓一個特定的字符串代表不固定的內(nèi)容

yy=123
yy是變量的名字豺旬,123是變量的值

echo $yy //查看變量的值

就是用一個簡單的好記的字符串终抽,來取代比較復(fù)雜或者容易變動的數(shù)據(jù)

二溯警、變量的設(shè)定

設(shè)定規(guī)則:

  1. 變量名與變量內(nèi)容以一個等號 = 的連結(jié)戈抄,且等號兩邊不能有空格。如下所示:
myname=XiguaTian
  1. 變量名稱只能是英文字母與數(shù)字,但是開頭字符不能是數(shù)字呀癣,如下為錯誤:
2myname=xiguatian
  1. 變量內(nèi)容若有空格符可使用雙引號 " 或單引號' 將變量內(nèi)容組合起來旅东,但

? 雙引號內(nèi)的特殊字符如 $! 等十艾,可以保有原本的特性,如下所示:

var="lang is $LANG"

#則
echo $var

#可得
lang is en_US

感嘆號 ! 不可以在shell命令行里直接在雙引號里使用腾节,但是可以在腳本中使用忘嫉。

? 單引號內(nèi)的特殊字符則僅為一般字符 (純文本),如下所示:

var='lang is $LANG' 

# 則
echo $var

#可得
lang is $LANG 
  1. 可用轉(zhuǎn)意符 \ 將特殊符號(如 [Enter], $, \, 空格符, 等)變成一般字符案腺;
  2. 在一串命令中庆冕,還需要藉由其他的命令提供的信息,可以使用反單引號 `命令` 或$(命 令)(推薦這種)劈榨。特別注意访递,那個反引號 是鍵盤上方數(shù)字鍵1` 左邊那個按鍵,而不是單引號同辣!

例如想要取得
核心版本的內(nèi)容:

version=$(uname -r)
# 再
echo $version

#可得
4.9.125-linuxkit
  1. 增加變量的內(nèi)容時拷姿,則可用 "$變量名稱"字符串${變量}字符串 (推薦)累加內(nèi)容,如下所示:
PATH="$PATH":/home/bin

PATH=${PATH}:/home/bin
  1. 若該變量需要在其他子程序執(zhí)行旱函,則需要以 export 來使變量變成環(huán)境變量:
export PATH
  1. 通常大寫字符為系統(tǒng)默認(rèn)變量响巢,自定義變量可以使用小寫字符,方便判斷 (純粹個人習(xí)慣) 棒妨;

  2. 取消變量的方法為使用 unset :unset 變量名稱 例如取消 myname 的設(shè)定:

unset myname

三踪古、 環(huán)境變量

這種變量是會影響bash環(huán)境操作的,會在真正進(jìn)入系統(tǒng)前由一個bash程序讀入到系統(tǒng)中券腔。通常都環(huán)境變量的名字以大寫字符命名伏穆。

常見環(huán)境變量

  • PATH HOME MAIL SHELL PWD USER UID ID 等。

  • RANDOM 隨機(jī)數(shù)

echo  $RANDOM
  • PS1:(提示字符的設(shè)置)

\d :可顯示出“星期 月 日”的日期格式纷纫,如:"Mon Feb 2"
\H :完整的主機(jī)名稱枕扫。如 www.sharkyun.com
\h :僅取主機(jī)名稱在第一個小數(shù)點(diǎn)之前的名字, www
\t :顯示時間,為 24 小時格式的“HH:MM:SS”
\T :顯示時間涛酗,為 12 小時格式的“HH:MM:SS”
\A :顯示時間铡原,為 24 小時格式的“HH:MM”
@ :顯示時間,為 12 小時格式的“am/pm”樣式
\u :目前使用者的帳號名稱商叹,如“dmtsai”燕刻;
\v :BASH 的版本信息
\w :完整的工作目錄名稱,由根目錄寫起的目錄名稱剖笙。但主文件夾會以 ~ 取代卵洗;
\W :利用 basename 函數(shù)取得工作目錄名稱,所以僅會列出最后一個目錄名。
# :下達(dá)的第幾個指令过蹂。
$ :提示字符十绑,如果是 root 時,提示字符為 # 酷勺,否則就是 $

讀取環(huán)境變量的值

echo $HOME

列出shell環(huán)境下的所有環(huán)境變量及其內(nèi)容

  • env // env 是 environment (環(huán)境) 的簡寫本橙,所有的環(huán)境變量(包含自定義的環(huán)境表里)

  • set // 列出系統(tǒng)中所有的變量,包括自定義的變量

  • export 變量名 // 使自定義的變量 成為 環(huán)境變量脆诉,環(huán)境變量可以被向下繼承

子進(jìn)程 僅會繼承父 shell 的環(huán)境變量甚亭, 不會繼承父 shell 的自定義變量

name=shark
export  name

bash
echo $name

并且 export 聲明的環(huán)境變量只能被其子 shell 繼承使用,不能被 父 shell 繼承使用

[root@kube-master py3]# bash           # 打開一個子 shell
[root@kube-master py3]# export a=hello # 在 子 shell 聲明一個環(huán)境變量
[root@kube-master py3]# bash           # 在子 shell 中再打開一個 子 shell
[root@kube-master py3]# echo $a        # 變量可以生效
hello
[root@kube-master py3]# exit           # 退出 子 shell 的 子 shell
exit
[root@kube-master py3]# exit           # 退出 子 shell
exit
[root@kube-master py3]# echo $a        # 在 當(dāng)前 shell 中击胜, 其子 shell 聲明的環(huán)境變量是無效的

[root@kube-master py3]# 

bash 的環(huán)境變量文件

  • longin shell
    取得shell時需要完整的登入流程亏狰;特點(diǎn)是登入時需要用戶帳號和密碼

  • non-login shell
    取得shell時不需要再次輸入帳號和密碼的情況下,所得到的 shell

longin shell 會讀取以下兩個文件:

  1. ·/etc/profile· :這是系統(tǒng)整體設(shè)定偶摔,最好不要修改
  2. ·~/.bash_profile~/.bash_login~/.profile` :屬于個人的配置文件

/etc/profile 會主動依序調(diào)用以下腳本文件:

  • /etc/inputrc :定義快捷鍵
  • /etc/profile.d/*sh :定義bash操作接口顏色暇唾、語系、命令別名等
  • etc/locale.conf :定義系統(tǒng)的默認(rèn)語系

bash 在讀完 /etc/profile 后辰斋,接下來會讀取以下3個文件策州,且只會讀去一個,會按照以下順序優(yōu)先讀取

~/.bash_profile //會調(diào)用 ~/.bashrc 宫仗,
也會有新的環(huán)境變量在下面的文件中被添加
~/.bash_login
~/.profile

最終抽活,~/.bashrc 才是最后被讀入到系統(tǒng)環(huán)境中的文件

讓這些環(huán)境變量文件中的變量等設(shè)置及時在當(dāng)前 shell 終端中生效,有下兩種方式

source ~/.bashrc 
或者
.    ~/.bashrc

no-longin shell 當(dāng)取得 no-longin shell 時锰什,該 shell 僅會讀取 ~/.bashrc 文件 而~/.bashrc 最后又會調(diào)用 /etc/bashrc

/etc/bashrc 的作用:

? 依據(jù)不同的UID定義出 umask
? 依據(jù)不同的UID定義出提示符(就是PS1變量)
? 呼叫 /etc/profile.d/*.sh 的設(shè)定

其他的相關(guān)配置文件

? /etc/man.config
這個文件最重要的就是定義了MANPATH 這個變量下硕,它定義了man page 的路徑;在以tarball的方式安裝軟件時有用
? ~/.bash_history
歷史命令記錄文件汁胆;記錄的數(shù)量與HISTFILESIZE變量有關(guān)梭姓。在/etc/profile
? ~/.bash_logout
記錄了當(dāng)我注銷bash后,系統(tǒng)再幫我做完什么動作后才離開的嫩码。

四誉尖、預(yù)定義變量

預(yù)定義的特殊變量有著特殊的含義,用戶不可以更改铸题,所有的預(yù)定義變量都由 $ 符號和另外一個符號組成铡恕,常用的預(yù)定義特殊變量如下:

$!   上一個后臺命令對應(yīng)的進(jìn)程號
$?   上一個命令的退出狀態(tài),為十進(jìn)制數(shù)字丢间,如果返回為0探熔,則代表執(zhí)行成功,則否為不成功烘挫。
$$   當(dāng)前的進(jìn)程號PID

以上變量請配合 echo 使用诀艰,例如:

echo $! 
echo $$ 
echo $?

五、從鍵盤的輸入給變量賦值: read

read

[root@www ~]# read [-pt] variable
選項(xiàng)不參數(shù):
-p :后面可以接提示字符!
-t :后面可以接等待的『秒數(shù)其垄!』苛蒲,比如 -t 5 提示用戶輸入信息時間是 5 秒鐘
       超過 5 秒鐘,程序就繼續(xù)向下運(yùn)行

例如:

#vi read.sh 
read -p “請輸入你的姓名” name
echo "你的姓名是: $name"

六绿满、變量內(nèi)容的刪除臂外、取代與替換

準(zhǔn)備工作,防止誤操作導(dǎo)致變量失效喇颁。

先讓小寫的 path 自訂變量設(shè)置的與 PATH 內(nèi)容相同
[dmtsai@study ~]$ path=${PATH}
[dmtsai@study ~]$ echo ${path}
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/shark/bin

? 刪除

  1. 刪除最后一個
echo ${path%:*}

% 從字符串的后面開始進(jìn)行匹配刪除寄月,但匹配到第一個時就結(jié)束匹配。

:* 就是需要進(jìn)行匹配的字符串 无牵, : 是普通字符串 * 是通配符,代表任何數(shù)量的任意字符串厂抖。

所以下面的紅色字體的字符串將會匹配后進(jìn)行刪除

/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/shark/bin

  1. 刪除第一個

接著上例的變量進(jìn)行操作

echo ${path#*:}

# 是從前面開始匹配刪除茎毁,匹配到道理和上面的 % 同樣的道理

${path#*:} 就是 從變量值的最前面開始匹配,直到找到第一個符匹配合格的字符就結(jié)束

所以下面的紅色字體會被匹配后刪除

/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/shark/bin

  • 取代和替換
image.png

以上不需要都掌握忱辅,需要記住下面這個

var=${str:-expr}

strvar 可以是相同的字符串七蜘。比如 inpu_date=${inpu_date:-expr}

expr 可以是任意合法的表達(dá)式,比如一個字符串墙懂,一個子 shell 的命令 $(date +%F)

示例橡卤,生產(chǎn)中會遇到經(jīng)常查數(shù)據(jù)庫的操作,一般查詢最多的就是查當(dāng)天的數(shù)據(jù)损搬,但也有別的日期的數(shù)據(jù)”炭猓現(xiàn)在就希望當(dāng)用戶沒有輸入時,就給一個默認(rèn)值巧勤,這里給的是當(dāng)天的日期嵌灰,假如輸入的具體的日期,就按照用戶輸入的日期查詢颅悉。

  • 初始版本

假設(shè)今天是 20200202

read  -p  "輸入日期>:"   input_date

input_date=${input_date:-20200202}

echo "當(dāng)前的日期是:${input_date}"

執(zhí)行示例效果

[root@sharkyun script]# sh read-defaut-value.sh
輸入日期>:
當(dāng)前的日期是:20200202
[root@sharkyun script]# sh read-defaut-value.sh
輸入日期>:20200201
當(dāng)前的日期是:20200201
[root@sharkyun script]#
  • 進(jìn)化版本
read  -p  "輸入日期>:"   input_date

input_date=${input_date:-$(date +%F)}

echo "當(dāng)前的日期是:${input_date}"

七沽瞭、時間運(yùn)算

// 計算 3 小時之后是幾點(diǎn)幾分
date +%T -d '3 hours'

// 任意日期的前 N 天,后 N 天的具體日期
date +%F -d "20190910 1 day"
date +%F -d "20190910 -1 day"

// 計算兩個日期相差天數(shù), 比如計算生日距離現(xiàn)在還有多少天
d1=$(date +%s -d 20180728)
d2=$(date +%s -d 20180726)
echo $((   (d1-d2)     /   86400          ))

# 輸出 
2
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末剩瓶,一起剝皮案震驚了整個濱河市驹溃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌延曙,老刑警劉巖豌鹤,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異枝缔,居然都是意外死亡傍药,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拐辽,“玉大人拣挪,你說我怎么就攤上這事【阒睿” “怎么了菠劝?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長睁搭。 經(jīng)常有香客問我赶诊,道長,這世上最難降的妖魔是什么园骆? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任舔痪,我火速辦了婚禮,結(jié)果婚禮上锌唾,老公的妹妹穿的比我還像新娘锄码。我一直安慰自己,他們只是感情好晌涕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布滋捶。 她就那樣靜靜地躺著,像睡著了一般余黎。 火紅的嫁衣襯著肌膚如雪重窟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天惧财,我揣著相機(jī)與錄音巡扇,去河邊找鬼。 笑死垮衷,一個胖子當(dāng)著我的面吹牛霎迫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播帘靡,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼知给,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了描姚?” 一聲冷哼從身側(cè)響起涩赢,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎轩勘,沒想到半個月后筒扒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绊寻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年花墩,在試婚紗的時候發(fā)現(xiàn)自己被綠了悬秉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡冰蘑,死狀恐怖和泌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情祠肥,我是刑警寧澤武氓,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站仇箱,受9級特大地震影響县恕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜剂桥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一忠烛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧权逗,春花似錦美尸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽求类。三九已至奔垦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間尸疆,已是汗流浹背椿猎。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留寿弱,地道東北人犯眠。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像症革,于是被迫代替她去往敵國和親筐咧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,383評論 0 5
  • 一噪矛、Python簡介和環(huán)境搭建以及pip的安裝 4課時實(shí)驗(yàn)課主要內(nèi)容 【Python簡介】: Python 是一個...
    _小老虎_閱讀 5,746評論 0 10
  • 一量蕊、shell腳本介紹 1.1 開頭(環(huán)境使用shebang機(jī)制) #!/bin/bash 必須寫在文件首行 符號...
    優(yōu)果馥斯閱讀 3,294評論 0 1
  • 十艇挨、變量 變量的賦值方式 先寫變量名稱残炮,緊接著是“=”這個字符,最后是值缩滨。中間無任何空格势就,通過echo命令加上$o...
    伊恩的道歉閱讀 562評論 0 1
  • 我打算跟我婆婆要只雞泉瞻,這個念頭大概是兩天前產(chǎn)生的。 我要的那只雞苞冯,應(yīng)該是公雞袖牙,當(dāng)時我婆婆其實(shí)是要給我的,我想大概用...
    面包丁閱讀 418評論 0 2