標籤:應用程式 linux 使用者 種類
shell指令碼(1)
Shell指令碼是一個特殊的應用程式,負責接收使用者輸入的操作命令並進行解釋,將需要執行的操作傳遞給核心執行,並輸出執行結果。可以在/etc/shells檔案查看當前系統所支援的shell種類。
[[email protected]~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/tcsh
/bin/csh
/bin/ksh
其中/bin/bash是目前大多數linux版本採用的預設shell,全稱為Bourne AgainShell
指令碼的二種執行方法
一、./first.sh 這種執行方法需要給first.sh指令碼一個執行許可權:chomod+x first.sh
二、sh /first.sh 這種執行方法不需要給first.sh指令碼執行許可權,也可通過Source“.”執行
. first.sh 或者source/first.sh (中間都是有空格的)
重新導向與管道操作
標準輸入(STDIN):預設:鍵盤 檔案編號為0
標準輸出(STDOUT):預設:顯示器 檔案編號為1
標準錯誤(STDERR):預設:顯示器 檔案編號為2
重新導向輸出>和>>分別是覆蓋和追加重新導向
重新導向輸入<
重新導向輸入可用於給使用者建立密碼
[[email protected]~]#vim shelltest/useradd
123456
:x
[[email protected]~]# passwd --stdin jerry <shelltest/useradd
Changingpassword for user jerry.
passwd:all authentication tokens updated successfully.
這樣可以省去建立密碼時多次輸入密碼。
錯誤重新導向2>和2>>是覆蓋和追加重新導向
當一個命令即包括錯誤輸出和標準輸出時可以用&>把標準和錯誤輸出到一個檔案裡
如自動編譯安裝httpd時要把make make install操作全部指向/dev/null
[[email protected]~]# vim httpd.sh
#!/bin/bash
#httpdshell install
cd/var/ftp/pub/httpd-2.2.17/
./config--prefix=/usr/local/httpd --enable-so &>/dev/null
make&>/dev/null
makeinstall $>/dev/null
.....以下省略
執行這個指令碼後編譯安裝時會把輸出的檔案全部指向/dev/null下。
管道符“ | ”位於管道符左側的命令輸出的結果,將作為右側命令的輸入。
如查看用“/bin/bash”作為shell的使用者名稱稱時可以用awk命令進一步過濾,只顯示使用者名稱和登入shell列
過濾前會顯示整行內容
[[email protected]~]# grep "/bin/bash$" /etc/passwd
root:x:0:0:root:/root:/bin/bash
jerry:x:500:500::/home/jerry:/bin/bash
過濾後只顯示使用者名稱和登入shell
[[email protected]~]# grep "/bin/bash$" /etc/passwd | awk -F: ‘{print$1,$7}‘
root/bin/bash
jerry/bin/bash
上列中awk的作用是以:為分隔字元輸出第1列和第7列內容,-F是指定分隔字元,可為文檔中的任一字元,預設以空格或定位字元分隔(大括弧裡的內容要用單引號)。
使用shell變數
常用的shell變數包括:自訂變數、環境變數、預定義變數、位置變數。
自訂變數是由系統使用者自己定義的變數,只在使用者自己的shell環境中有效,所以又稱做本地變數。
定義變數的基本格式為“變數名=變數值”,等號兩邊沒有空格。變數名稱需要以字母或底線開頭,名稱中不要包含特殊字元。
自訂變數如下:
[[email protected] ~]# system=centos
[[email protected] ~]# version=6.5
查看時用echo回顯,變數名前要加上$符號
[[email protected] ~]# echo $system
centos
[[email protected] ~]# echo $system $version
centos 6.5
回顯變數名時如果後邊有其它字元需要添加大括弧“{}”將其包圍起來,否則將無法確定正確的變數名稱。未定義的變數,將顯示為空白值。
[[email protected] ~]# echo $system6.5 #因未定義$system6所以只顯示.5變數值為空白
.5
[[email protected] ~]# echo ${system}6.5
centos6.5
變數賦值的特殊操作
在等號後邊直接指定變數內容是為變數賦值的最基本方法,除此以外還有一些特殊的賦值操作,可以靈活地賦值變數,以便適用於複雜的管理工作。
1.雙引號(“”)
比如我們在賦值一個內容裡包含空格時,必須用雙引號括起來,如下
[[email protected] ~]# Centos=Centos6.5 錯誤的賦值提示沒有這個命令
-bash: 6.5: command not found
[[email protected] ~]#Centos="Centos 6.5"
[[email protected] ~]# echo $Centos
Centos 6.5
2.($)符號
在雙引號範圍內,使用“$”符號可以引用其它變數的值,如下
[[email protected] ~]# redhat="red hat$version"
[[email protected] ~]# echo $redhat
red hat 6.5
3.單引號(’)
當要賦值的內容中包含$、“、\等具有特殊含義的字元時,應使用單引號括起來,經單引號的範圍內,將無法引用其他變數值,任何字元當做一般字元看待,但賦值的內容中包含單引號時,需要用“\”符號進行轉義,以免衝突。如下
[[email protected] ~]# redhat=‘red hat $version‘
[[email protected] ~]# echo $redhat
red hat $version
4.反撇號(`)
反撇號主要用於命令替換,允許將執行某個命令的螢幕輸出結果賦值給變數,反撇號括起來的範圍內必須是能夠執行的命令列,否則會出錯。如下
[[email protected] ~]# ls -ld `which service`
-rwxr-xr-x 1 root root 1744 2009-07-13/sbin/service
如上述命令相當於先執行which service然後查看檔案屬性相當於連續執行了兩條命令。
但是使用反撇號不能在一行命令中實現嵌套命令替換操作,這時可以用“$()”來代替反撇號,以解決嵌套問題,如查看useradd命令程式的軟體包安裝的設定檔在什麼位置,如下
[[email protected] ~]# rpm -qc $(rpm -qf $(whichuseradd))
/etc/default/useradd
/etc/login.defs
5.read命令
Read命令是用來提示使用者輸入資訊,從而實現簡單的互動過程,將使用者輸入的內容賦值給指定的變數,多餘的內容賦值給最後一個變數,若指定的變數只有一個,則將整行內容賦值給此變數。如下操作會等待使用者輸入,並將使用者輸入內容賦值給變數
[[email protected] ~]# read dir
/opt/backup
[[email protected] ~]# echo $dir
/opt/backup
Read命令還可以結合”-p”選項來設定提示資訊,如下
[[email protected] ~]# read -p "請指定備份的存放目錄:" dir
請指定備份的存放目錄:/opt/backup/
[[email protected] ~]# echo $dir
/opt/backup/
之前說過自訂變數都只能在自己的shell裡才能用稱為局部變數,其實我們可以把局部變數變為全域變數。如下。
[[email protected] ~]# echo "$system$version"
centos 6.5
[[email protected] ~]# export system version #設定為全域變數
[[email protected] ~]# bash #進入子shell環境
[[email protected] ~]# echo "$system$version"
centos 6.5
export也可以在建立變數時直接建立為全域變數如下
[[email protected] ~]# exportfqnd="www.baidu.com"
[[email protected] ~]# bash
[[email protected] ~]# echo $fqnd
www.baidu.com
5.數值變數運算
Expr用於shell裡簡單的整數運算
運算子與變數之間至少要有一個空格。
expr 變數1 運算子 變數2 [運算子 變數3]……
運算子包括以下幾種
+:加法 -:減法 \*:乘法 /:除法 %:取餘運算
如x=5 y=3
[[email protected] ~]# x=5
[[email protected] ~]# y=3
[[email protected] ~]# expr $x % $y
2
特殊變數之環境變數
環境變數指的是出於運行需要由linux系統提前建立的一類變數,主要用於設定使用者的工作環境,如宿主目錄,命令尋找路徑,使用者目前的目錄等。使用env可以查看當前工作環境下的環境變數。
[[email protected] ~]# env |more
HOSTNAME=localhost.localdomain
version=6.5
TERM=linux
SHELL=/bin/bash
HISTSIZE=200
KDE_NO_IPV6=1
……………..省略
PATH是用於設定可執行程式的預設搜尋路徑。如first.sh在/root/下可用PATH添加,如下
[[email protected] ~]#PATH="$PATH:/root"
[[email protected] ~]# echo $PATH
/usr/lib/qt-3.3/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/root
在Linux中環境變數的全域設定檔在/etc/profile,在此檔案中定義的變數作用於所有使用者,而每個使用者還有自己獨立的設定檔(~/.bash_profile),如變更曆史命令由1000改為20,
[[email protected] ~]#vim /etc/profile
……//省略
HISTSIZE=20
[[email protected] ~]# source /etc/profile 使其配置生效
[[email protected] ~]# history |wc –l
20
特殊變數之位置變數
位置變數當執行命令指令碼時,第一個欄位表示命令名或指令碼名,其餘字串參數從左至右的順序依次賦值給位置變數,如下
[[email protected] ~]# vi export.sh
#!/bin/bash
########位置變數運算指令碼#######
SUM=`expr $1 \* $2`
echo "$1 \* $2 = $SUM"
[[email protected] ~]# sh expr.sh 5 6
5 \* 6 = 30
特殊變數之預定義變數
預定義變數是程式以經定義好的變數,使用者不能手動建立也不能直接賦值給預定義變數
常見預定義變數
$#:表示命令列中位置參數的個數
$*:表示所有位置參數的內容
$?:表示上一條命令執行後的狀態,返回0為正確其它值均為異常
$0:表示當前執行的指令碼或程式名稱
本文出自 “癮” 部落格,請務必保留此出處http://luoyuxiangnian.blog.51cto.com/6214813/1550510
linux--shell指令碼筆記之一。