Shell入門

變量

變量

變量引用:$ 和 ${}

命令替換

命令輸出中提取信息衅澈,并將其賦給變量
反引號(hào) 和 $()

wu=`命令` 或者 wu =$()

注意:`` 和 $() 與= 不能有空格

echo/讀取:read

echo命令可用單引號(hào)或雙引號(hào)來劃定文本字符串颤诀,便可以正常輸出。
echo -n :文本字符串和命令輸出顯示在同一行中

read -p "Enter your age:" name
echo "hello $name"

read –p 相當(dāng)于 echo -n 提示作用

read -p "Enter your name: " first last
echo "Checking data for $last, $first…"
-t 指定時(shí)間
-s 隱藏輸入內(nèi)容(可用于輸入密碼)

read 文件內(nèi)容
count=1
cat test | while read line
do
  echo "Line $count: $line"
  count=$[ $count + 1 ]
done

標(biāo)準(zhǔn)輸入輸出

ls -la t test3 test4 2>text1 1>text
&>test 則正確和錯(cuò)誤輸入到同一個(gè)文件

運(yùn)算符

expr

處理數(shù)學(xué)表達(dá)式
ARG1 | ARG2 如果ARG1既不是null也不是零值竟稳,返回ARG1跋涣;否則返回ARG2
ARG1 & ARG2 如果沒有參數(shù)是null或零值,返回ARG1;否則返回0
ARG1 % ARG2 返回ARG1被ARG2除的算術(shù)余數(shù)
*號(hào)等運(yùn)算符識(shí)別不出 需要 加 \
expr 5 \* 2

整數(shù)運(yùn)算$[ ]

bash shell數(shù)學(xué)運(yùn)算符只支持整數(shù)運(yùn)算
var1=$[1+5]

var1=[var * 2]


浮點(diǎn)運(yùn)算 bc

直接輸入bc汇荐,進(jìn)行運(yùn)算
–q 不顯示bash計(jì)算器冗長(zhǎng)的歡迎信息
scale 控制小數(shù)位數(shù)



if結(jié)構(gòu)化語(yǔ)句

If 條件;then
fi

If 條件盆繁;then
else
fi

if 條件掀淘;then
elif 條件;then
fi

方括號(hào)定義了測(cè)試條件油昂。注意革娄,第一個(gè)方括號(hào)之后和第二個(gè)方括號(hào)之前必須加上一個(gè)空格,否則就會(huì)報(bào)錯(cuò)
if [ condition ]
then
commands
fi

數(shù)值比較

-eq 相等
-ge 大于或等于
-gt 大于
-le 小于或等于
-lt 小于
-ne 不等于

字符串比較

str1 = str2 檢查str1是否和str2相同
str1 != str2 檢查str1是否和str2不同
str1 < str2 檢查str1是否比str2小
str1 > str2 檢查str1是否比str2大
-n str1 檢查str1的長(zhǎng)度是否非0
-z str1 檢查str1的長(zhǎng)度是否0
-o 或 相當(dāng)于 ||
-a 和 相當(dāng)于 &&

>
-n

文件比較

-d file 檢查file是否存在并是一個(gè)目錄
-f file 檢查file是否存在并是一個(gè)文件
-e file 檢查file是否存在
-s file 檢查file是否存在并非空
-r file 檢查file是否存在并可讀
-w file 檢查file是否存在并可寫
-x file 檢查file是否存在并可執(zhí)行
-O file 檢查file是否存在并屬當(dāng)前用戶所有
-G file 檢查file是否存在并且默認(rèn)組與當(dāng)前用戶相同
file1 -nt file2 檢查file1是否比file2新
file1 -ot file2 檢查file1是否比file2舊

復(fù)合條件測(cè)試

if-then語(yǔ)句允許你使用布爾邏輯來組合測(cè)試秕狰。有兩種布爾運(yùn)算符可用:
? [ condition1 ] && [ condition2 ]
? [ condition1 ] || [ condition2 ]

用于數(shù)學(xué)表達(dá)式的雙括號(hào)

雙括號(hào):比較過程中使用高級(jí)數(shù)學(xué)表達(dá)式
val++ 后增
val-- 后減
++val 先增
--val 先減
! 邏輯求反
~ 位求反
** 冪運(yùn)算
<< 左位移
/>> 右位移
& 位布爾和
| 位布爾或
&& 邏輯和
|| 邏輯或
== 匹配字符

用于高級(jí)字符串處理功能的雙方括號(hào)

雙方括號(hào):針對(duì)字符串比較的高級(jí)特性
采用的標(biāo)準(zhǔn)字符串比較稠腊,具有模式匹配

結(jié)構(gòu)

case

變量和模式是匹配的
通過豎線操作符在一行中分隔出多個(gè)模式模式:Y|y
* 會(huì)捕獲所有與已知模式不匹配的值

shift 移動(dòng)變量

操作命令行參數(shù)
根據(jù)它們的相對(duì)位置來移動(dòng)命令行參數(shù)
默認(rèn)情況下它會(huì)將每個(gè)參數(shù)變量向左移動(dòng)一個(gè)位置
即變量3的值會(huì)移到2中,變量2的值會(huì)移到1中鸣哀,而變量$1的值則會(huì)被刪除

#!/bin/bash
echo "The original:$*"
shift 2 #移動(dòng)兩個(gè)位置
echo "The position $1"

雙破折線

雙破折線表示選項(xiàng)列表結(jié)束架忌。在雙破折線之后腳本就可以放心地將剩下的命令行參數(shù)當(dāng)作參數(shù),而不是選項(xiàng)來處理了

#!/bin/bash
while [ -n "$1" ]
do
        case "$1" in
                -a) echo "Found the -a option" ;;
                -b) echo "Found the -b option";;
                -c) echo "Found the -c option" ;;
                --) shift
                break ;;
                *) echo "$1 is not an option";;
        esac
shift
done
#
count=1
for param in $@
do
        echo "Parameter #$count: $param"
        count=$[ $count + 1 ]
done

#!/bin/bash
while [ -n "$1" ]
do
case "$1" in
a) echo "print a";;
b) echo "print b";;
--) shift
    break;;
*) echo "$1 is not an option";;
esac
shift
done

count=1
for param in $@
do
echo "param #$count: $param"
count=$[ $count + 1 ]
done

在遇到雙破折線時(shí)我衬,腳本用break命令來跳出while循環(huán)叹放。由于過早地跳出了循環(huán),我們需
要再加一條shift命令來將雙破折線移出參數(shù)變量

for

for var in list(遍歷自身定義一系列值)
do
commands
done

處理循環(huán)的輸出

!/bin/bash

for (( a=1;a<10;a++ ))
do
echo "The number is $a"
done > wu.txt
對(duì)循環(huán)的輸出使用管道或進(jìn)行重定向到文件中

更改字段分隔符

bash shell默認(rèn)
空格
制表符
換行符
為分隔符
IF=$ 可以制定分隔符
IF=\ $’\n’ ,只有\(zhòng)n為分隔符

c語(yǔ)言for

for (( i = 1; i <= 10; i++ ))
do
command
done

while

while command

設(shè)置單個(gè)命令

只要測(cè)試條件成立挠羔, while命令就會(huì)不停地循環(huán)執(zhí)行定義好的命令
測(cè)試條件中用到的變量必須修改井仰,否則就會(huì)陷入無限循環(huán)

設(shè)置多個(gè)命令

只有最后一個(gè)測(cè)試命令的退出狀態(tài)碼會(huì)被用來決定什么時(shí)候結(jié)束循環(huán)

until

untile test commands
do
other commands
done

until條件成立則不執(zhí)行,條件不成立則執(zhí)行與 while 相反

設(shè)置單個(gè)命令

設(shè)置多個(gè)命令

控制循環(huán)

break

退出任意類型的循環(huán)
跳出當(dāng)前正在執(zhí)行的循環(huán)破加,完全終止整個(gè)循環(huán)

break n
n指定了要跳出的循環(huán)層級(jí)

continue

continue命令可以提前中止某次循環(huán)中的命令但并不會(huì)完全終止整個(gè)循環(huán)俱恶。
跳過此次循環(huán)中剩余的命令,但整個(gè)循環(huán)還會(huì)繼續(xù)范舀。
可以在循環(huán)內(nèi)部設(shè)置shell不執(zhí)行命令的條件合是。

continue n

實(shí)例

查找可執(zhí)行文件

1.png

這個(gè)腳本使用了兩個(gè)不同的IFS值來解析數(shù)據(jù)。第一個(gè)IFS值解析出/etc/passwd文件中的單獨(dú)
的行锭环。內(nèi)部for循環(huán)接著將IFS的值修改為冒號(hào)聪全,允許你從/etc/passwd的行中解析出單獨(dú)的值。

處理用戶輸入

$0 表示程序名本身

在第9個(gè)變量之后辅辩,你必須在變量數(shù)字周圍加上花括號(hào)难礼,比如/${10}

解決變量$0不顯示就會(huì)使用整個(gè)路徑娃圆。

#!/bin/bash
name=$(basename $0)
echo The script name is:$name
echo This is $0                

$# 參數(shù)統(tǒng)計(jì)

判斷命令行上有多少參數(shù)
echo there were $#

抓取所有的數(shù)據(jù)

$*  將這些參數(shù)視為一個(gè)整體
$@   參數(shù)當(dāng)作同一字符串中的多個(gè)獨(dú)立的單詞

#!/bin/bash
count=1 
for param in "$*"
do
  echo "\$* is #$count=$param"
  count=$[ $count + 1 ]
done

for param in "$@"
do
  echo "\$@ is #$count=$param"
  count=$[ $count + 1 ]
done

${!#}

沒有任何參數(shù)時(shí), $#的值為0蛾茉,
${!#}變量會(huì)返回命令行用到的腳本名
帶參數(shù)時(shí)讼呢,顯示數(shù)量相當(dāng)于 !#

#!/bin/bash
num=$#
echo The num is $num
echo The "!#" is ${!#}
帶參數(shù)時(shí),顯示數(shù)量

沒帶參數(shù)時(shí)臀稚,顯示腳本名

$$ $?

顯示當(dāng)前進(jìn)程
上個(gè)命令的退出狀態(tài)

函數(shù)

創(chuàng)建函數(shù)

有兩種格式

function name {
commands
}


name() {
commands
}
name函數(shù)的唯一名稱吝岭,若定義名字一樣則后續(xù)會(huì)替換第一個(gè)
commands函數(shù)中出現(xiàn)的順序依次執(zhí)行
注:
name 和 { 要有空格,否則出錯(cuò)

#!/bin/bash 
function wu {
 echo  "This my first function"
}

count=1
while [ $count -le 3 ]
do
  wu
  count=$[ $count + 1 ]
done
wu
function wu {
  echo $[ $1 * $2 ]
}

if [ $# -eq 2 ];then
  value=$(wu $1 $2)
  echo "The result is $value"
else
 echo "uage:file a b"
fi

前面的$1h和$2和腳本主體中的$1和$2變量并不相同
要在函數(shù)中使用這些值吧寺,必須在調(diào)用函數(shù)時(shí)手動(dòng)將它們傳過去窜管。

return

函數(shù)的退出狀態(tài)碼是函數(shù)中最后一條命令返回的退出狀態(tài)碼:$?
但是無法知道其他命令中是否成功運(yùn)行
return命令來退出函數(shù)并返回特定的退出狀態(tài)碼(整數(shù)值0~255,大于則會(huì)出錯(cuò))

function wu {
read -p "Enter a value: " value
return $[ $value * 2 ]
}
注意:
函數(shù)一結(jié)束就取返回值
退出狀態(tài)碼必須是0~255

break

退出函數(shù)并返回特定的退出狀態(tài)碼
跳出循環(huán)體稚机,該循環(huán)體已結(jié)束

contiune

中斷循環(huán)中的迭代幕帆,若有指定的條件則繼續(xù)循環(huán)下一個(gè)迭代
循環(huán)沒有結(jié)束

局部變量

函數(shù)內(nèi)部使用的任何變量都可以被聲明成局部變量
局部變量:在變量聲明的前面加上local關(guān)鍵

function wu {
 local temp=$[ $value + 5 ]
 result=$[ $temp * 2 ]
}
temp=4
value=6

wu
echo "The result is $result"
if [ $temp -gt $value ];then
echo "temp is larger"
else
echo "temp is smaller"
fi

數(shù)組

如果你試圖將該數(shù)組變量作為函數(shù)參數(shù),函數(shù)只會(huì)取數(shù)組變量的第一個(gè)值赖条。
將該數(shù)組變量的值分解成單個(gè)的值失乾,然后將這些值作為函數(shù)參數(shù)使用。
在函數(shù)內(nèi)部纬乍,可以將所有的參數(shù)重新組合成一個(gè)新的變量碱茁。

#!/bin/bash
function testit {[圖片上傳中...(5.png-438497-1538820881421-0)]

local newarray=`echo "$@"`
echo "The new array value is: ${newarray[*]}"
}
myarray=(1 2 3 4 5)
echo "The original array is ${myarray[*]}"
testit ${myarray[*]}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市仿贬,隨后出現(xiàn)的幾起案子纽竣,更是在濱河造成了極大的恐慌,老刑警劉巖茧泪,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜓氨,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡队伟,警方通過查閱死者的電腦和手機(jī)穴吹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嗜侮,“玉大人港令,你說我怎么就攤上這事⌒饪牛” “怎么了缠借?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)宜猜。 經(jīng)常有香客問我,道長(zhǎng)硝逢,這世上最難降的妖魔是什么姨拥? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任绅喉,我火速辦了婚禮,結(jié)果婚禮上叫乌,老公的妹妹穿的比我還像新娘柴罐。我一直安慰自己,他們只是感情好憨奸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布革屠。 她就那樣靜靜地躺著,像睡著了一般排宰。 火紅的嫁衣襯著肌膚如雪似芝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天板甘,我揣著相機(jī)與錄音党瓮,去河邊找鬼。 笑死盐类,一個(gè)胖子當(dāng)著我的面吹牛寞奸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播在跳,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼枪萄,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了猫妙?” 一聲冷哼從身側(cè)響起瓷翻,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吐咳,沒想到半個(gè)月后逻悠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡韭脊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年童谒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沪羔。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡饥伊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蔫饰,到底是詐尸還是另有隱情琅豆,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布篓吁,位于F島的核電站茫因,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏杖剪。R本人自食惡果不足惜冻押,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一驰贷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧洛巢,春花似錦括袒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至漓库,卻和暖如春恃慧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背米苹。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工糕伐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蘸嘶。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓良瞧,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親训唱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子褥蚯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

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

  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,380評(píng)論 0 5
  • 背景 之前寫了系列的shell實(shí)戰(zhàn)的文章,得到了挺多小伙伴的關(guān)注况增,遇到有些對(duì)shell不太熟悉小伙伴赞庶,所以有個(gè)想法...
    aron1992閱讀 839評(píng)論 1 1
  • 你有沒有過這樣的經(jīng)歷歧强? 某些你偶爾聽說或聞所未聞的東西,在你使用之后为肮,極大地提升了你的生活質(zhì)量摊册! 對(duì)于這類物品,江...
    LaViedeShan閱讀 1,799評(píng)論 4 6
  • 需求:后臺(tái)返回一個(gè)字符串"已經(jīng)連續(xù)12天簽到", 字符串中的數(shù)字要設(shè)置粗體&紅色. 代碼: 同樣, 小數(shù)也是可以的...
    粒良昭蓿皇閱讀 2,003評(píng)論 0 0
  • 文/納蘇。 關(guān)于他們的一切重斑。 我深知兵睛,卻又一無所知。 我們這些在文字里僥幸存活下來的陌生人,都成了臆想癥患者祖很。 也...
    納蘇閱讀 398評(píng)論 3 5