linux之shell編程基本語法

  Shell是用戶與內核進行交互操做的一種接口,目前最流行的Shell稱爲bash Shell。Shell也是一門編程語言<解釋型的編程語言>,即shell腳本<就是在用linux的shell命令編程>。一個系統能夠存在多個shell,能夠經過cat /etc/shells命令查看系統中安裝的shell,不一樣的shell可能支持的命令語法是不相同的。
html

 

原文和做者一塊兒討論:http://www.cnblogs.com/intsmaze/p/6681562.htmllinux

微信:intsmazeshell

 

基本格式

  代碼寫在普通文本文件中,一般以 .sh爲後綴名編程

vi intsmaze.shcentos

#!/bin/bash ## 表示用哪種shell解析器來解析執行咱們的這個腳本程序 echo "hello world"   ## 註釋也能夠寫在這裏
## 這是一行註釋

執行腳本bash

sh intsmaze.sh微信

或給腳本添加x權限,直接執行,不然只能經過sh xxx.sh執行
app

chmod 755 intsmaze.shless

./intsmaze.sh編程語言

基本語法

系統變量

Linux Shell中的變量分爲「系統變量」和「用戶自定義變量」。能夠經過set命令查看系統變量。

[hadoop@centos-Reall-131 shtest]$ set BASH=/bin/bash HADOOP_HOME=/home/hadoop/hadoop-2.6.4 HISTCONTROL=ignoredups HISTFILE=/home/hadoop/.bash_history HISTFILESIZE=1000 HISTSIZE=1000 HOME=/home/hadoop HOSTNAME=centos-Reall-131 HOSTTYPE=i386 ID=500 JAVA_HOME=/home/hadoop/app/jdk1.7.0_65 LANG=en_US.UTF-8 LESSOPEN='|/usr/bin/lesspipe.sh %s' LINES=24 LOGNAME=hadoop

訪問系統變量:$HOME、$PWD、$SHELL、$JAVA_HOME等等

自定義變量

  一、語法

  變量=值 (例如STR=abc)

  等號兩側不能有空格

  使用變量: $arg

   雙引號和單引號有區別:雙引號僅將字符串中的空格脫意;單引號會將字符串中的變量引用好比$param脫意。

  二、示例

[hadoop@centos-Reall-131 ~]$ STR=hello world 
-bash: world: command not found
[hadoop@centos-Reall-131 ~]$ STR="hello world" [hadoop@centos-Reall-131 ~]$ A=9 [hadoop@centos-Reall-131 ~]$ echo $A 9 [hadoop@centos-Reall-131 ~]$ echo $STR hello world

若是想打印 hello worlds is greater  怎麼辦?

echo $STRs is greate 行嗎?

不行,正確寫法是:

echo ${STR}s is greate

[hadoop@centos-Reall-131 ~]$ echo ${STR}s is greate hello worlds is greate [hadoop@centos-Reall-131 ~]$ echo '${STR}s is greate' ${STR}s is greate
[hadoop@centos-Reall-131 ~]$ echo "please$STR"
pleasehello world
[hadoop@centos-Reall-131 ~]$ echo 'please$STR'
please$STR

unset A 撤銷變量 A

readonly B=2 聲明靜態的變量 B=2,不能 unset

export  A   #可把變量提高爲當前shell進程中的全局環境變量,可供其餘子shell程序使用

 vi a.sh

#!/bin/bash
a="a in a.sh" echo $a /root/scripts/b.sh

vi b.sh

#!/bin/bash
b="b in b.sh" echo $b echo $a

而後執行  ./a.sh ,會發現b腳本中並無把a腳本中定義的a變量打印出來。

若是要在b中打印出a腳本的變量a,須要在a腳本中把變量a作export定義,此時,a變量就成了a.sh腳本所在bash進程的全局變量,該進程的全部子進程都能訪問到變量a。

另外一種方式:

若是在a.sh腳本中用以下方式調用b.sh

.  ./b.sh    ## 注意:重點關注最前面那個 「.」號

或者

source ./b.sh   ##

則,b.sh就在a.sh所在的bash進程空間中運行,而不是在a進程中的子進程中運行了。

總結:

一、a.sh中直接調用b.sh,會讓b.sh在a所在的bash進程的「子進程」空間中執行

二、而子進程空間只能訪問父進程中用export定義的變量

三、一個shell進程沒法將本身定義的變量提高到父進程空間中去

四、「.」號執行腳本時,會讓腳本在調用者所在的shell進程空間中執行

三、反引號賦值

A=`ls -la`    ## 反引號,運行裏面的命令,並把結果返回給變量A

A=$(ls -la)   ## 等價於反引號

四、特殊變量

$? 表示上一個命令退出的狀態碼

$$ 表示當前進程編號

$0 表示當前腳本名稱

$n 表示n位置的輸入參數(n表明數字,n>=1)

$# 表示參數的個數,經常使用於循環

$*和$@ 都表示參數列表

注:$*與$@區別

$* 和 $@ 都表示傳遞給函數或腳本的全部參數

ü 不被雙引號" "包含時——

$* 和 $@ 都以$1  $2  … $n 的形式組成參數列表

ü 當它們被雙引號" "包含時——

"$*" 會將全部的參數做爲一個總體,以"$1 $2 … $n"的形式組成一個整串;

"$@" 會將各個參數分開,以"$1" "$2" … "$n" 的形式組成一個參數列表

相關文章
相關標籤/搜索