shell 第一篇

一、 查看當前linux 支持的shell 類型php

[root@nfs01 ~]# cat /etc/shells java

/bin/shpython

/bin/bashlinux

/sbin/nologinweb

/bin/dashshell

/bin/tcsh編程

/bin/cshtomcat

上面的前三個是經常使用的,bash比sh要更強,有些若是執行不起來,那麼就用bash加強bash

shell腳本優點在於處理操做系統底層的業務,php是網頁程序,是一款更注重於web網頁開發的腳本語言app

考試題一Centoslinux系統默認的shell是()

bash

查看方法一、

[root@nfs01 ~]# echo $SHELL

/bin/bash

查看方法二、

[root@nfs01 ~]# grep root /etc/passwd

root:x:0:0:root:/root:/bin/bash

更改默認的shell

[root@nfs01 ~]# cat /etc/default/useradd

# useradd defaults file

GROUP=100

HOME=/home

INACTIVE=-1

EXPIRE=

SHELL=/bin/bash

SKEL=/etc/skel

CREATE_MAIL_SPOOL=yes

 

2、書寫腳本方法以下:

腳本開頭(第一行)指明解釋器

#!/bin/bash

#!/bin/sh <==255個字符之內

 

注意bash的漏洞(破殼漏洞,注意升級)

 

下面是linux中經常使用腳本語言開頭的編碼寫法:

#!/bin/sh

#!/bin/bash

#!/usr/bin/awk

#!/bin/sed

#!/usr/bin/tcl

#!/usr/bin/expect(sshpass,pssh)

#!/usr/bin/perl

#!/usr/bin/env python

若是腳本里面沒有上面的解釋器那麼就用 相似 python test.txt等來執行

3、shell的執行方式

注意點,設置crond任務的時候,最好把系統環境變量在定時任務腳本從新定義,不然,一些系統環境變量將不被加載,這個問題要注意

shell腳本的執行一般採起下面幾種方式

1)  bash script-name或者sh script-name (推薦使用)

2)  path /script-name或者./scripts-name  #-->注意「.」點號   《===須要腳本有執行權限

3)  source script-name 或者. script-name   #-->注意「.」點號

4)  sh <script-name 或者 cat script-name|sh(一樣適合bash)

題:

一、  已知以下命令及返回結果,請問echo $user的返回結果爲()

[root@nfs01 pyrene]# cat test.sh

user=`whoami`

[root@nfs01 pyrene]# sh test.sh

[root@nfs01 pyrene]# echo $user

本題答案爲空。解釋:

因爲每一個腳本的父shell是bash因此這裏再用sh執行這裏的執行以後就屬於sh子shell了,而後bash這個父shell裏面就沒有,echo 子shell裏面的東西,固然執行不了就爲空

1)兒子shell會直接繼承父親shell的變量函數等,反之不能夠

2)若是但願反過來繼承,用source或者點號執行腳本

 

4、腳本書寫習慣

1)腳本書寫腳本解釋器

2)腳本開頭增長版權等信息

#date

#auther

#mail

#versipn

#founction

3)腳本不用中文

4)腳本以.sh爲擴展名命名

 

5、shell變量

變量分爲兩類:環境變量(全局變量)和普通變量(局部變量)

環境變量又能夠分爲自定義環境變量和bash內置的環境變量

普通變量也可稱爲局部變量,只能在建立它們的shell函數或者shell腳本中使用,普通變量通常是由開發者用戶建立的

2)su – 這裏的-會把環境變量帶過來

3)環境變量在命令行中建立,推出命令行的時候這些變量就會丟失,若是但願永久保存環境變量能夠在家目錄中設置.bash_profile或者.bashrc文件中

若是但願全局生效(全部用戶都生效)/etc/bashrc 或者/etc/profile

4)傳統上,全部環境變量名字格式都應該大寫,本身定義的環境變量用exprot命令定義,如:export OLDGIRL=1

 

6、自定義環境變量

格式

1) export 變量名=value

2) 變量名= value,export 變量名

3) declare -x 變量名 =value

[root@backup-41 ~]# export NAME=oldboy

[root@backup-41 ~]# env|grep NAME    

HOSTNAME=backup-41

NAME=oldboy

LOGNAME=root

G_BROKEN_FILENAMES=1

固然上面的是否是永久生效的,若是想永久生效須要放入.bash_profile 或者.bashrc中,若是想要全局生效須要放入/etc/profile中

自定義環境變量生產環境java環境配置實例:tomcat,resin,csvn,hadoop

export JAVA_HOME=/application/jdk

export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOME/bin

export RESIN_HOME=/application/resin

常放在/etc/profile

若是寫一個JAVA腳本,好要把上述的java環境配置放入腳本內從新定義,特別是執行定時任務的時候

 

7、環境變量的顯示與取消

1)經過echo或者printf命令輸出變量

$HOME 用戶登陸時進入的目錄

$UID   當前用戶的UID(用戶標識)

$PWD  當前工做目錄的絕對路徑名

$SHELL  當前shell

$USER  當前用戶

2)能夠用env來顯示環境變量

3)unset取消本地環境變量

 

環境變量小節:

1)  變量名一般大些

2)  能夠在自身的shell以及子shell中使用

3)  經過export來定義環境變量

4)  輸出用$變量名,取消用unset變量名

5)  書寫定時任務要注意環境變量,最好在腳本中從新定義

6)  若是但願永久生效放在用戶環境變量文件或者全局環境變量文件裏

 

8、普通變量的定義

1)普通變量定義

變量名=value

變量名=‘value’

變量名=「value」

2)變量名通常由字母,數字,下劃線組成,能夠字母或者下劃線開頭

3)把一個命令的結果做爲變量的定義方法

變量名= `ls`  這裏是反引號

變量名=$(ls)

[root@backup-41 ~]# CMD=$(pwd)

[root@backup-41 ~]# echo $CMD

/root

如按天打包文件

tar -zcvf etc_$(date +%F).tar.gz /etc/

 

普通變量定義小節:

1)  連續的數字或者字符串能夠不加引號

2)  變量內容不少,還虛妄解析變量,加雙引號

3)  但願原樣輸出就用單引號

4)  但願變量內容是命令結果的定義:反引號 如a=`ls`或者$()如a=$(ls)

變量的輸出

1)  在變量名前面加上$能夠取得此變量的值,使用echo或者printf命令能夠顯示變量的值,$A和${A}的寫法不一樣可是功能是同樣的

2)  echo輸出的時候也有單引號雙引號、反引號的形式,用法和前面的總結一致

3)  ${WEEK}day若是變量後面有其餘字符鏈接的時候,必須給變量加上大括號{}

4)  要養成將全部字符串變量用雙引號括起來的習慣,將會減小不少編程時遇到的問題

 

習題:下面的會輸出什麼樣的記過

[root@backup-41 ~]# a=192.168

[root@backup-41 ~]# b="192.168"

[root@backup-41 ~]# b="192.168"

[root@backup-41 ~]# c="192.168"

[root@backup-41 ~]# echo "a=$a"

a=192.168

[root@backup-41 ~]# echo "b=$b"

b=192.168

[root@backup-41 ~]# echo "c=$c"

c=192.168

1)$變量名錶示輸出變量,能夠用$c和${c}兩種用法

 

環境變量小結

1)  一個等號是賦值,兩個等號是比較

2)  打印變量,變量名前接上$符號,變量名後面接着字符的時候要用大括號將變量單獨括起來

3)  打印輸出或者變量時,通常用雙引號或者不加引號,若是是字符串變量最好加上雙引號,若是原樣輸出,用單引號

4)  但願變量的內容是執行命令,要用反引號或者$()把變量括起來

 

9、shll 的特殊重要變量

1)位置參數

$0獲取當前執行腳的shell腳本文件名,若是執行腳本帶路徑那麼就包括腳本路徑

$n 獲取當前執行的shell腳本的第n個參數值,若是n=1..9,但n爲0的時候表示腳本的文件名,若是n大於9,用大括號括起來${10},參數以空格隔開

$#獲取當前執行的shell 腳本後面接的參數的總個數

dirname  直接取腳本路徑 

basename  直接取腳本名字

 

 

 

 

案例二、/etc/init.d/rpcbind start

上述腳本中的start參數會傳給腳本里的$1進行判斷

case 「$1」 in

  start>

      start

案例三

在n.sh中寫入echo $0而後執行下面的

[root@nfs01 scripts]# sh n.sh oldboy

n.sh

 

案例四

在t.sh中寫入判斷

#!/bin/sh

if [ $# -ne 2 ]

  then

    echo "USAGE $0 arg1 arg2"

    exit 1

fi

echo $1 $2

[root@backup-41 scripts]# sh t.sh aa

USAGE t.sh arg1 arg2

[root@backup-41 scripts]# sh t.sh aa bb

aa bb

 

 

 

 

2)進程狀態變量

$$ 獲取當前shell 腳本的進程號(PID)

$! 執行上一次指令的PID

$? 獲取執行上一個指令的返回值(0爲成功,非零爲失敗)  #這個變量很經常使用

相關文章
相關標籤/搜索