初識shell腳本編程

一. Shell基礎(chǔ)

shell是鏈接用戶和linux內(nèi)核的一個命令解釋程序, 常見shell包括bash(linux默認)以及其他

1. shell概述

  • 新建一個文件
    vi hello.sh
#!/bin/bash
echo 'hello world';

2. 腳本執(zhí)行方式

  • shell腳本執(zhí)行有兩種方式
    • bash hello.sh
    • chmod 755 hello.sh; ./hello.sh

3. 別名設(shè)置

  1. 臨時別名

    • alias vi=vim
    • alias mell='ls -l --color=auto'
    • 移除臨時別名 unalias vi
  2. 永久別名, 修改配置文件

    • vi ~/.bashrc
    • source ~/.bashrc

4. 歷史命令 history

配置文件 cat ~/.bash_history

5. 輸入輸出

linux標準輸入是鍵盤, 標準輸出設(shè)備是顯示器

  • /dev/stderr 2 標準錯誤輸出
  • /dev/stdin 0 標準輸入
  • /dev/stdout 1 標準輸出
5.1. 輸出重定向
  1. 覆蓋式重定向 ls > 1.log
  2. 追加重定向 ls >> 2.log
  3. 標準錯誤輸出 2>>和2>
ls xdy 2>>1.log
ls xdy &>>2.log 執(zhí)行正確和錯誤都輸出
ls &>>2.log
ls xdy >> 1.log 2>>2.log
5.2. 輸入重定向

<< wc << abc

6. 管道符

  1. ; 表示順序執(zhí)行
    ls; cd /tmp; touch a;
  2. && 邏輯與
  3. || 邏輯或
ls && echo 'yes' || echo 'no'
abc && echo 'yes' || echo 'no'
  1. | 管道
    netstat -an | grep 22 | wc -l;

7. 通配符

  1. ? 一個字符
    • 多個字符
  2. [] 范圍
aa=`ls`
 1012  echo $ss
 1013  echo $aa
 1014  echo "$aa\n"

ls=`head hello.sh `
 1019  echo ls
 1020  echo $ls
 1021  echo $ls + "\n"
  echo "$ls\n"
 1023  echo 'abc'
 1024  bb=$(ls)
 1025  echo $bb
 1026  echo "\n$bb\n"

二. 變量

1. 用戶變量

  • 變量規(guī)則

    • 只能以字母, 下劃線開頭, 不能以數(shù)字開頭
    • 等號兩側(cè)不能出現(xiàn)空格, 如a = 3, 錯誤的寫法
    • 數(shù)據(jù)類型默認都是字符串類型
    • 調(diào)用時, 必須使用$符號
  • 變量連接

a=123
b=2
a=$a+$b;(不要出現(xiàn)空格)
echo $a;  # a=123+2
c="$a"456
d=${c}789
# d=123+2456789
  • 查看所有變量 set

set -u 如果變量未定義, 則提示

[root@localhost xdy]# echo $g

[root@localhost xdy]# set -u
[root@localhost xdy]# echo $g
-bash: g: unbound variable
[root@localhost xdy]# 
  • 刪除變量
    unset c 不能加$符號

2. 環(huán)境變量

  • 定義環(huán)境變量
    • 直接定義 : export a=1
    • 先定義, 后檢出 : b=2; export b;
    • env查看當前所有的環(huán)境變量
    • 刪除時, 在哪兒定義, 就在那兒刪除
  • PATH
    當我們打linux命令時, 其實默認會在PATH環(huán)境變量定義的目錄下查找, 如果找到則執(zhí)行, 沒有找到就報錯, 所以我們可以把路徑加入到PATH中
[root@localhost ~]# echo $PATH
[root@localhost ~]# PATH="$PATH":/root/test
[root@localhost ~]# echo $PATH
......:/root/test
[root@localhost ~]# hello.sh 
  • PS1 是定義系統(tǒng)起始符號
[root@localhost ~]# echo $PS1
[\u@\h \W]\$
[root@localhost ~]# PS1=' [\u@\a \w]\$ '
 [root@ ~]# PS1=' [\u@\t \w]\$ '
 [root@14:20:38 ~]# PS1='[\u@\t \w]\$ '
[root@14:20:46 ~]# cd /usr/bin/
[root@14:21:19 /usr/bin]# 
  • PS2是定義命令換行符號的, 默認為 >
ls
[root@localhost log]# ls \
> haha
  • 語系 LANG
    • 查看當前語系 locale
    • 查看所有語系 locale -a
    • echo $LANG
    • 默認語系配置文件/etc/sysconfig/i18n
[root@localhost log]# cat /etc/sysconfig/i18n 
LANG="zh_CN.UTF-8"
  • 位置參數(shù)$n
    • $0 : 命令本身
    • $1和$9是第一個到第九個參數(shù) 超過九個, 使用 ${10}
#!/bin/bash

a=20;
b=30;
c=$(( $a + $b))
echo $c;

d=$1;
e=$2;
echo $(( $d + $e))
# 調(diào)用時, 需要在命令后跟上兩個參數(shù),, 用于填充$d 和 $e
  • $* : 所有參數(shù), 當成一個整體
  • $@ : 所有參數(shù), 分開處理
  • $# : 參數(shù)個數(shù)
#!/bin/bash

echo $*;
echo $@;
echo $#;

echo "\n"
for i in "$*"
        do
                echo $i
        done

for y in "$@"
        do
                echo $y
        done

3. 預(yù)定義變量

  • $? 表示上一條命令執(zhí)行的結(jié)果, 0 表示正確執(zhí)行, 非零表示報錯
    && || 都是判斷前一條命令的執(zhí)行結(jié)果S?

  • 示例:

ls && echo 'yes' || echo 'no'  :
    |-- 如果ls正確執(zhí)行, $?為0, echo 'yes' 判斷$? = 0, 輸出yes
    |-- 如果ls沒有正確執(zhí)行, $?不為0, echo 'yes' 判斷非0, 不執(zhí)行, echo 'no'判斷非0, 執(zhí)行, 輸出no

每一條命令都會返回一個狀態(tài)值, 來標識自己有沒有成功執(zhí)行, 返回的值, 會被保存到$? 預(yù)定義變量中
  • $$ 表示當前的進程號
  • $! 表示最后一個后臺進程進程號

4. read命令 用戶輸入命令

  • -p 提示信息
  • -t 超時終止腳本
  • -s 隱藏輸入
  • -n 數(shù)字, 只允許輸入幾個字符
#!/bin/bash

read -p "please input your name" -t 30 name
echo $name

read -p "please input your password:" -s password
echo -e "\n"
echo $password

read -p "please input your sex[M/F]:" -n 1 sex
echo $sex

三. shell編程-運算符

1. 聲明變量類型

declare [+/-][選項] 變量

  • - : 給變量設(shè)定屬性
  • + : 取消變量的類型屬性
  • a : 將變量聲明為數(shù)組型
  • i : 將變量聲明為整型
  • x : 將變量聲明為環(huán)境變量
    export其實就是declare -x 變量的簡寫形式
  • r : 只讀屬性, 修改后, 無法改變
  • p : 加變量名, 顯示當前變量屬性, 不加, 顯示所有變量屬性
[root@localhost test]# unset arr
[root@localhost test]# arr[1]=haha
[root@localhost test]# arr[2]=hehe
[root@localhost test]# declare -a arr[3]=heihei
[root@localhost test]# echo ${arr}

[root@localhost test]# echo ${arr[*]}
haha hehe heihei
[root@localhost test]# echo ${arr[2]}
hehe

[root@localhost test]# a=1
[root@localhost test]# b=2
[root@localhost test]# declare -i c
[root@localhost test]# c=$a+$b
[root@localhost test]# echo $c
3
[root@localhost test]# declare -p c
declare -i c="3"
[root@localhost test]# declare +i c
[root@localhost test]# echo $c
3
[root@localhost test]# declare -p c
declare -- c="3"

2. 數(shù)值運算

推薦$(( ))這種寫法

[root@localhost test]# aa=11
[root@localhost test]# bb=22
[root@localhost test]# cc=$(expr $aa + $bb)
[root@localhost test]# echo $cc
33
[root@localhost test]# dd=$(($aa+$bb))
[root@localhost test]# echo $dd
33
[root@localhost test]# ee=$[$aa+$bb]
[root@localhost test]# echo ee
ee
[root@localhost test]# declare -p ee
declare -- ee="33"
[root@localhost test]# let ff=$aa+$bb
[root@localhost test]# echo $ff
33
[root@localhost test]# declare -p ff
declare -- ff="33"
[root@localhost test]# let gg=1&&0
-bash: 0: command not found
[root@localhost test]# let gg=1&0
[1] 2988
-bash: 0: command not found
[root@localhost test]# gg=$((1&&0))
[1]+  Done                    let gg=1
[root@localhost test]# echo $gg
0

3. 變量測試

[root@localhost test]# hh=${jj-3}
[root@localhost test]# echo $hh
3
如果jj沒有設(shè)置過, 則hh等于3, 如果為空, 則hh為空, 如果為某個值, 則hh也為某個值

四. 環(huán)境變量配置文件

source 配置文件 使更改完的配置文件立即生效
. 文件 作用等同于source

  • 環(huán)境變量主要配置文件包括
/etc/profile (PATH, umask)
/etc/profile.d/*.sh (lang)
~/.bash_profile (將~/bin加入到環(huán)境變量)
~/.bashrc (別名)
/etc/bashrc (PS1)
  • umask 查看系統(tǒng)默認權(quán)限 022
    文件最高權(quán)限為666
    目錄最高權(quán)限為777
    022 表示為 ----w--w-
創(chuàng)建文件后, 默認是
666 = rw-rw-rw-   
666-022 = 
    rw-rw-rw- - ----w--w- 
    = rw-r--r--
創(chuàng)建目錄后
777-022 = 
    rwxrwxrwx - ----w--w- 
    = rwxr-xr-x
  • 其他配置文件包括
~/.bash_logout(退出登錄時執(zhí)行的腳本)
~/.bash_history(保留歷史命令)
  • /etc/motd 寫歡迎信息

五. 正則表達式

正則表達式和通配符的區(qū)別

  • 正則表達式是用來在文件中匹配符合條件的字符串, 正則式包含匹配, grep, awk, sed 等命令可以支持正則表達式

  • 通配符是用來匹配符合條件的文件名, 通配符是完全匹配, ls, find, cp這些命令不支持正則表達式, 所以只能使用shell自己的通配符來進行匹配

* 表示前一個字符出現(xiàn)0次或者多次  a*會通篇匹配, 必須是用aa* 才會匹配包含a的內(nèi)容
. 表示除換行符外的任意一個字符 
^ 匹配行首任意一個字符 ^a
$ 匹配行尾  a$
[] 括號中任意一個字符 [a-zA-Z]
[^] 取反
\ 轉(zhuǎn)義  \.
{n\} 前面字符恰巧出現(xiàn)n次
\{n,\} 大于n次
\{n, m\} 大于n, 小于m
[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\} 匹配日期
[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\} 匹配ip
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市耕肩,隨后出現(xiàn)的幾起案子张咳,更是在濱河造成了極大的恐慌敷硅,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件耿币,死亡現(xiàn)場離奇詭異效床,居然都是意外死亡,警方通過查閱死者的電腦和手機侯养,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來背伴,“玉大人沸毁,你說我怎么就攤上這事∩导牛” “怎么了息尺?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長疾掰。 經(jīng)常有香客問我搂誉,道長,這世上最難降的妖魔是什么静檬? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任炭懊,我火速辦了婚禮,結(jié)果婚禮上拂檩,老公的妹妹穿的比我還像新娘侮腹。我一直安慰自己,他們只是感情好稻励,可當我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布父阻。 她就那樣靜靜地躺著,像睡著了一般望抽。 火紅的嫁衣襯著肌膚如雪加矛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天煤篙,我揣著相機與錄音斟览,去河邊找鬼。 笑死辑奈,一個胖子當著我的面吹牛苛茂,可吹牛的內(nèi)容都是我干的已烤。 我是一名探鬼主播,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼味悄,長吁一口氣:“原來是場噩夢啊……” “哼草戈!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起侍瑟,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎丙猬,沒想到半個月后涨颜,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡茧球,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年庭瑰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抢埋。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡弹灭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出揪垄,到底是詐尸還是另有隱情穷吮,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布饥努,位于F島的核電站捡鱼,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏酷愧。R本人自食惡果不足惜驾诈,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望溶浴。 院中可真熱鬧乍迄,春花似錦、人聲如沸士败。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拱烁。三九已至生蚁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間戏自,已是汗流浹背邦投。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留擅笔,地道東北人志衣。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓屯援,卻偏偏與公主長得像,于是被迫代替她去往敵國和親念脯。 傳聞我的和親對象是個殘疾皇子狞洋,可洞房花燭夜當晚...
    茶點故事閱讀 45,876評論 2 361