一、 查看當前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、書寫腳本方法以下:
l 腳本開頭(第一行)指明解釋器
#!/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
#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爲成功,非零爲失敗) #這個變量很經常使用