#2 sh/bash ./a.sh 這種情況不需要腳本具有執(zhí)行權(quán)限
以上兩種執(zhí)行方式都是在子shell中執(zhí)行的,也就是說(shuō)當(dāng)前shell需要啟動(dòng)另外一個(gè)shell,用來(lái)執(zhí)行a.sh內(nèi)的命令
#1 source ./a.sh
#2 ../a.sh(注意前面的 . )
以上兩種執(zhí)行方式是在當(dāng)前shell下執(zhí)行,并不需要建立子shell
source和 . 命令的作用:用來(lái)執(zhí)行一個(gè)腳本
前兩種方式和后兩種方式的另外區(qū)別:如果你在一個(gè)腳本里export $KKK=111 ,如果你用./a.sh執(zhí)行該腳本,執(zhí)行完畢后,你運(yùn)行 echo $KKK ,發(fā)現(xiàn)沒(méi)有值,如果你用source來(lái)執(zhí)行 ,然后再echo ,就會(huì)發(fā)現(xiàn)KKK=111。因?yàn)檎{(diào)用./a.sh來(lái)執(zhí)行shell是在一個(gè)子shell里運(yùn)行的,所以執(zhí)行后,結(jié)構(gòu)并沒(méi)有反應(yīng)到父shell里,但是source不同它就是在本shell中執(zhí)行的,所以可以看到結(jié)果。
# 執(zhí)行腳本時(shí)是在一個(gè)子shell環(huán)境運(yùn)行的,腳本執(zhí)行完后該子shell自動(dòng)退出
# 一個(gè)shell中的系統(tǒng)環(huán)境變量只對(duì)該shell或者它的子shell有效,該shell結(jié)束時(shí)變量消失(并不能返回到父shell中)
# 用export定義的變量會(huì)被復(fù)制到該shell的子shell中
第一個(gè)shell腳本程序:#!/bin/bash# 上面中的 #! 是一種約定標(biāo)記, 它可以告訴系統(tǒng)這個(gè)腳本需要什么樣的解釋器來(lái)執(zhí)行;echo "Hello, world!" 變量:定義變量:country="China"Number=100 注意: 1,變量名和等號(hào)之間不能有空格;2,首個(gè)字符必須為字母(a-z,A-Z)。
3, 中間不能有空格,可以使用下劃線(_)。4, 不能使用標(biāo)點(diǎn)符號(hào)。
5, 不能使用bash里的關(guān)鍵字(可用help命令查看保留關(guān)鍵字)。使用變量:只需要在一個(gè)定義過(guò)的變量前面加上美元符號(hào) $ 就可以了, 另外,對(duì)于變量的{} 是可以選擇的, 它的目的為幫助解釋器識(shí)別變量的邊界.country="China"echo $countryecho ${country}echo "I love my ${country}abcd!" #這個(gè)需要有{}的;重定義變量: 直接把變量重新像開(kāi)始定義的那樣子賦值就可以了:country="China"country="ribenguizi" 只讀變量: 用 readonly 命令 可以把變量字義為只讀變量。
readonly country="China"#或 country="China"readonly country 刪除變量: 使用unset命令可以刪除變量,但是不能刪除只讀的變量。用法:unset variable_name 變量類(lèi)型 運(yùn)行shell時(shí),會(huì)同時(shí)存在三種變量:1) 局部變量 局部變量在腳本或命令中定義,僅在當(dāng)前shell實(shí)例中有效,其他shell啟動(dòng)的程序不能訪問(wèn)局部變量。
2) 環(huán)境變量 所有的程序,包括shell啟動(dòng)的程序,都能訪問(wèn)環(huán)境變量,有些程序需要環(huán)境變量來(lái)保證其正常運(yùn)行。必要的時(shí)候shell腳本也可以定義環(huán)境變量。
3) shell變量 shell變量是由shell程序設(shè)置的特殊變量。shell變量中有一部分是環(huán)境變量,有一部分是局部變量,這些變量保證了shell的正常運(yùn)行 特殊變量:$* 和 $@ 的區(qū)別為: $* 和 $@ 都表示傳遞給函數(shù)或腳本的所有參數(shù),不被雙引號(hào)(" ")包含時(shí),都以"$1" "$2" … "$n" 的形式輸出所有參數(shù)。
但是當(dāng)它們被雙引號(hào)(" ")包含時(shí),"$*" 會(huì)將所有的參數(shù)作為一個(gè)整體,以"$1 $2 … $n"的形式輸出所有參數(shù);"$@" 會(huì)將各個(gè)參數(shù)分開(kāi),以"$1" "$2" … "$n" 的形式輸出所有參數(shù)。$? 可以獲取上一個(gè)命令的退出狀態(tài)。
所謂退出狀態(tài),就是上一個(gè)命令執(zhí)行后的返回結(jié)果。退出狀態(tài)是一個(gè)數(shù)字,一般情況下,大部分命令執(zhí)行成功會(huì)返回 0,失敗返回 1。
Shell中的替換 轉(zhuǎn)義符:在echo中可以用于的轉(zhuǎn)義符有:使用 echo 命令的 –E 選項(xiàng)禁止轉(zhuǎn)義,默認(rèn)也是不轉(zhuǎn)義的; 使用 –n 選項(xiàng)可以禁止插入換行符;使用 echo 命令的 –e 選項(xiàng)可以對(duì)轉(zhuǎn)義字符進(jìn)行替換。另外,注意,經(jīng)過(guò)我的實(shí)驗(yàn),得到:echo "\\" #得到 \echo -e "\\" #得到 \echo "\\\\" #得到 \\echo -e "\\" #得到 \ 命令替換:它的意思就是說(shuō)我們把一個(gè)命令的輸出賦值給一個(gè)變量,方法為把命令用反引號(hào)(在Esc下方)引起來(lái). 比如:directory=`pwd`echo $directory 變量替換:可以根據(jù)變量的狀態(tài)(是否為空、是否定義等)來(lái)改變它的值.Shell運(yùn)算符 算數(shù)運(yùn)算符:原生bash不支持簡(jiǎn)單的數(shù)學(xué)運(yùn)算,但是可以通過(guò)其他命令來(lái)實(shí)現(xiàn),例如 awk 和 expr. 下面使用expr進(jìn)行; expr是一款表達(dá)式計(jì)算工具,使用它可以完成表達(dá)式的求值操作;比如:a=10b=20expr $a + $bexpr $a - $bexpr $a \* $bexpr $a / $bexpr $a % $b a=$b 注意: 1. 在expr中的乖號(hào)為:\*2. 在 expr中的 表達(dá)式與運(yùn)算符之間要有空格,否則錯(cuò)誤;3. 在[ $a == $b ]與[ $a != $b ]中,要需要在方括號(hào)與變量以及變量與運(yùn)算符之間也需要有括號(hào), 否則為錯(cuò)誤的。
(親測(cè)過(guò)) 關(guān)系運(yùn)算符:只支持?jǐn)?shù)字,不支持字符串,除非字符串的值是數(shù)字。常見(jiàn)的有:注意:也別忘記了空格;布爾運(yùn)算符:字符串運(yùn)算符:文件測(cè)試運(yùn)算符:檢測(cè) Unix 文件的各種屬性。
Shell中的字符串 單引號(hào)的限制:?jiǎn)我?hào)里的任何字符都會(huì)原樣輸出,單引號(hào)字符串中的變量是無(wú)效的;單引號(hào)字串中不能出現(xiàn)單引號(hào)(對(duì)單引號(hào)使用轉(zhuǎn)義符后也不行)。雙引號(hào)的優(yōu)點(diǎn):雙引號(hào)里可以有變量雙引號(hào)里可以出現(xiàn)轉(zhuǎn)義字符 拼接字符串:country="China"echo "hello, $country"#也可以echo "hello, "$country" " 獲取字符串長(zhǎng)度:string="abcd"echo ${#string} #輸出 4 提取子字符串:string="alibaba is a great company"echo ${string:1:4} #輸出liba 查找子字符串:string="alibaba is a great company"echo `expr index "$string" is` 處理路經(jīng)的字符串:例如:當(dāng)一個(gè)路徑為 /home/xiaoming/1.txt時(shí),如何怎么它的路徑(不帶文件) 和如何得到它的文件名??得到文件名使用 bashname命令: # 參數(shù):# -a,表示處理多個(gè)路徑;# -s, 用于去掉指定的文件的后綴名; basename /home/yin/1.txt -> 1.txt basename -a /home/yin/1.txt /home/zhai/2.sh -> 1.txt2.sh basename -s .txt /home/yin/1.txt -> 1basename /home/yin/1.txt .txt -> 1 得到路徑名(不帶文件名)使用 dirname命令:參數(shù):沒(méi)有啥參數(shù);//例子:dirname /usr/bin/ -> /usrdirname dir1/str dir2/str ->dir1dir2dirname stdio.h -> .Shell的數(shù)組:bash支持一維數(shù)組, 不支持多維數(shù)組, 它的下標(biāo)從0開(kāi)始編號(hào). 用下標(biāo)[n] 獲取數(shù)組元素;定義數(shù)組:在shell中用括號(hào)表示數(shù)組,元素用空格分開(kāi)。
如:array_name=(value0 value1 value2 value3) 也可以單獨(dú)定義數(shù)組的各個(gè)。
#2 sh/bash ./a.sh 這種情況不需要腳本具有執(zhí)行權(quán)限 以上兩種執(zhí)行方式都是在子shell中執(zhí)行的,也就是說(shuō)當(dāng)前shell需要啟動(dòng)另外一個(gè)shell,用來(lái)執(zhí)行a.sh內(nèi)的命令 #1 source ./a.sh #2 ../a.sh(注意前面的 . ) 以上兩種執(zhí)行方式是在當(dāng)前shell下執(zhí)行,并不需要建立子shell source和 . 命令的作用:用來(lái)執(zhí)行一個(gè)腳本 前兩種方式和后兩種方式的另外區(qū)別:如果你在一個(gè)腳本里export $KKK=111 ,如果你用./a.sh執(zhí)行該腳本,執(zhí)行完畢后,你運(yùn)行 echo $KKK ,發(fā)現(xiàn)沒(méi)有值,如果你用source來(lái)執(zhí)行 ,然后再echo ,就會(huì)發(fā)現(xiàn)KKK=111。
因?yàn)檎{(diào)用./a.sh來(lái)執(zhí)行shell是在一個(gè)子shell里運(yùn)行的,所以執(zhí)行后,結(jié)構(gòu)并沒(méi)有反應(yīng)到父shell里,但是source不同它就是在本shell中執(zhí)行的,所以可以看到結(jié)果。 # 執(zhí)行腳本時(shí)是在一個(gè)子shell環(huán)境運(yùn)行的,腳本執(zhí)行完后該子shell自動(dòng)退出 # 一個(gè)shell中的系統(tǒng)環(huán)境變量只對(duì)該shell或者它的子shell有效,該shell結(jié)束時(shí)變量消失(并不能返回到父shell中) # 用export定義的變量會(huì)被復(fù)制到該shell的子shell中。
聲明:本網(wǎng)站尊重并保護(hù)知識(shí)產(chǎn)權(quán),根據(jù)《信息網(wǎng)絡(luò)傳播權(quán)保護(hù)條例》,如果我們轉(zhuǎn)載的作品侵犯了您的權(quán)利,請(qǐng)?jiān)谝粋€(gè)月內(nèi)通知我們,我們會(huì)及時(shí)刪除。
蜀ICP備2020033479號(hào)-4 Copyright ? 2016 學(xué)習(xí)鳥(niǎo). 頁(yè)面生成時(shí)間:2.619秒