shell學習1

第一章  SHELL 簡介

cat /etc/shells 查看系統中所有的shell
echo $SHELL 查看當前用戶運行的shell
程序在shell中運行,shell中可運行子shell

文件類型:
d 目錄。
l 鏈接文件(指向另一個文件),類似於WINDOWS快捷方式。
s 套接字文件。
b 塊設備文件。
c 字符設備文件。
p 命名管道文件。
- 普通文件,或者更準確地說,不屬於以上幾種類型的文件

查看名用法:main chmod或者info chmod
改變文件權限:root用戶和文件的擁有者才能夠改變文件權限
命令:chmod
chmod u+x,g-r,o+x a
chmod 722 a

chown 改變文件的擁有者
chown 用戶名 文件名
chown -R 用戶名 文件夾名  可以改變文件夾下所有文件的擁有者
chgrp 改變文件的組
chgrp 組名 文件名
chown root.root 文件夾 -R
 
umask
設置創建文件或文件夾的默認權限
默認爲022,可以通過umask 222設置默認權限

鏈接
硬連接和軟連接
ln [-s] source_path target_path
ln a a_ln   硬鏈接
ln -s a a_ln   軟鏈接

SHELL
#!/bin/bash
#hello world
printchar="hello world"
echo $printchar

chmod u+x hello.sh
./hello.sh


別名
alias
alias ll='ls -alh'
別名  $HOME/.bashrc文件中


命名替換
myfile的內容
parm
findfile

ls `cat myfile` -al  顯示parm findfile文件的信息
把cat myfile命令的結果傳遞給ls命令


後臺處理
nohup command &
nohup tar -czf parm.tar.gz parm &
tar -czf parm.tar.gz parm壓縮文件


管道 (|)
把一個命令的輸出連接到另一個命令的輸入
ls|sort  排序

重定向(< >)
與管道相關,他可以改變程序運行的輸入來源和輸入來源
sort <myfile.txt   對myfile.txt文件中的內容排序
sort <myfile.txt > myfile_sort.txt 把myfile.txt文件中的內容排序的結果輸入到myfile_sort.txt文件中

模式匹配
顯示以txt爲擴展名的文件或顯示以a開頭的文件,這種能力就稱模式匹配
正則表達式

特殊符號
雙引號("):用來使Shell無法認出空格、製表符和其他大多數特殊字符,這樣"David Medinets"
 表示一個值,而不是2個同樣"David < Medinets"表示一個值
單引號('):用來使shell無法認出所有特殊字符
反引號(`):用來替換命令
反斜槓(\):用來使shell無法認出氣候的特殊字符,使其後的支付失去了特殊的含義,如David\Medinets
touch David\ Medinets
ls David\ Medinets

分號(;):允許在一行上放多個命令
& :命令後臺執行
括號():創建成組的命令
大括號{}:創建命令塊
豎槓(|):管道表示符
<>&:表示重定向
*?[]! :表示模式匹配
$:變量名的開頭
#:表示註釋(第一行除外)
空格、製表符、換行符:當作空白

                            第二章    變量和運算符 
                            
2.1變量
2.1.1本地變量
本地變量在用戶現在的shell生命期的腳本中使用
variable_name=vale
set 顯示本地所有的變量
readonly variable_name 只讀變量
[root@localhost shell]# LOCALTEST="test"  #設置本地變量
[root@localhost shell]# echo ${LOCALTEST} #查看本地變量
test
[root@localhost shell]# readonly LOCALTEST  #設置本地變量爲只讀
[root@localhost shell]# LOCALTEST="TEST1"  #設置只讀的本地變量,提示變量爲只讀
-bash: LOCALTEST: readonly variable
[root@localhost shell]# readonly  #查看當前shell只讀的本地變量

2.1.2環境變量
環境變量用於所有用戶進程(經常稱爲子進程)。登錄進程爲父進程。shell中執行的用戶
進程均稱爲子進程。不像本地變量(只用於現在的shell),環境變量可用於所有子進程,
這包括編輯器、腳本和應用
cat /etc/profile(對所有用戶進行設置)或cat $HOME/.bash_profile(對當前用戶設置)
export  設置環境變量或者查看環境變量  export user_path="beij"或export
env  查看環境變量  env | grep user_path

2.1.3變量替換
用變量的值替換它的名字
echo
在變量名前加$,使用echo命令可以顯示單個變量取值
[root@localhost ~]# testvar="this is a test"
[root@localhost ~]# echo $testvar
this is a test

替換變量
testvar="hxy"
${testvar}  顯示實際值
${testvar:+"test"} 如果設置了testvar 則顯示其值,否則,爲空
${testvar:?"errmsg"} 如果未設置testvar 顯示用戶定義錯誤信息errmsg
${testvar:-"test"} 如果未設置testvar 則顯示其值test
${testvar :=value} 如果未設置testvar 設置其值,並顯示

2.1.4變量清除
unset,readonly 不能unset
unset varable_name
[root@localhost ~]# testvar="this is a test"
[root@localhost ~]# echo $testvar
this is a test
[root@localhost ~]# unset testvar
[root@localhost ~]# echo $testvar

[root@localhost ~]

2.1.5位置變量
位置變量表$0,$1...$9
$0    $1 $2 $3 $4 $5 $6 $7 $8 $9
腳本名稱 A  B  C  D  E  F
向腳本中使用位置參數

parm文件內容如下:
echo "這個腳本的名稱:$0"
echo "這是腳本的第1個位置參數:$1"
echo "這是腳本的第2位置參數:$2"
echo "這是腳本的第3個位置參數:$3"
echo "這是腳本的第4個位置參數:$4"
echo "這是腳本的第5個位置參數:$5"
echo "這是腳本的第6個位置參數:$6"
echo "這是腳本的第7個位置參數:$7"
echo "這是腳本的第8個位置參數:$8"
echo "這是腳本的第9個位置參數:$9"
chmod u+x parm
[root@localhost hxy]# ./parm A B C D E
這個腳本的名稱:./parm
這是腳本的第1個位置參數:A
這是腳本的第2位置參數:B
這是腳本的第3個位置參數:C
這是腳本的第4個位置參數:D
這是腳本的第5個位置參數:E
這是腳本的第6個位置參數:
這是腳本的第7個位置參數:
這是腳本的第8個位置參數:
這是腳本的第9個位置參數:

向系統命令傳遞參數
parm.sh 內容如下:
#!/bin/bash
#parm.sh
find /root/shell -name $1 -print

[root@localhost shell]# chmod u+x parm.sh
[root@localhost shell]# ./parm.sh parm
/root/shell/parm

2.1.6標準變量
bash默認建立了一些標準環境變量,可在/etc/profile中定義
set | grep "TERM"或者echo $TERM
EXINIT: 初始化vi的參數
HOME: 主目錄
IFS: linux默認的域,字符與字符之間的間隔
LOGNAME: 登錄用戶名  也可以用set |grep "LOG"命令查看
MAIL: 當前用戶郵箱的路徑
MAILCHECK: 當前用戶有多個郵箱時
TERM:終端的類型 
PATH:可執行文件尋找的路徑
TZ:表示時區
PS1:登錄系統的提示符  [root@localhost shell]#
PS2:
PWD:當前的目錄
SHELL:當前用戶運行的shell
MANPATH:幫助文檔存放的路徑
TERMINFO:終端類型配置信息的路徑

2.1.7特殊變量
$#(傳遞到腳本的參數個數)
$*(以一個單字符串表示所有向腳本傳遞的參數,與位置變量不同,此選項參數可超過9個)
$$(腳本運行的當前進程ID號)
$!(後臺運行的最後一個進程的進程ID號)
$@(與$*相同,但是使用時加引號,並在引號中返回每個參數)
$-(表示shell使用的當前選項,與set命令功能相同)
$?(顯示最後命令的退出狀態,0表示沒有錯誤,其他值表面有錯誤)

[root@localhost shell]# vi parm

echo "這個腳本的名稱:$0"
echo "這是腳本的第1個位置參數:$1"
echo "這是腳本的第2位置參數:$2"
echo "這是腳本的第3個位置參數:$3"
echo "這是腳本的第4個位置參數:$4"
echo "這是腳本的第5個位置參數:$5"
echo "這是腳本的第6個位置參數:$6"
echo "這是腳本的第7個位置參數:$7"
echo "這是腳本的第8個位置參數:$8"
echo "這是腳本的第9個位置參數:$9"
echo "顯示參數個數:$#"
echo "顯示腳本全部參數:$*"
echo "顯示進程ID:$$"
echo "顯示前一命令運行後狀態:$?"

[root@localhost shell]# ./parm A B C D E
這個腳本的名稱:./parm
這是腳本的第1個位置參數:A
這是腳本的第2位置參數:B
這是腳本的第3個位置參數:C
這是腳本的第4個位置參數:D
這是腳本的第5個位置參數:E
這是腳本的第6個位置參數:
這是腳本的第7個位置參數:
這是腳本的第8個位置參數:
這是腳本的第9個位置參數:
顯示參數個數:5
顯示腳本全部參數:A B C D E
顯示進程ID:2776
顯示前一命令運行後狀態:0

2.1.8影響變量的命名
declare
- 設置或顯示變量
- -f只顯示函數名
- -r創建只讀變量(declare和typeset)
- -x創建轉出變量
- -i創建整數變量
- 使用+替代-,可以顛倒選項的含義

export
用於創建傳給子shell的變量
- --表明選項結束,所有後續參數都是實參
- -f表明在“名-值”對中的名字是函數名
- -n把全局變量轉換成局部變量。換句話說,命令的變量不再傳給shell
- -p顯示全局變量列表

readonly
- 用於顯示或設置只讀變量
- --表明選項結束
- -f創建只讀變量

set
- 設置或重設各種shell

unset
- 用於取消變量的定義
- --表明選項結束
- -f刪除只讀變量,但不能取消從shell環境中刪除指定的變量和函數。
  如PATH,PS1,PS2,PPID,UID,EUID等的設置
  
shift[n] n移動的個數
- 用於移動位置變量,調整位置變量,使$3的值賦予$2,使$2的值賦予$1

typeset
- 用於顯示或設置變量
- 是declare的同義詞

2.2引號
2.2.1引號的必要性
變量和替換操作,在腳本中執行變量替換時最容易犯的一個錯誤就是引用錯誤

2.2.2雙引號
使用雙引號可引用除字符$、`、\外的任意字符或字符串
ehco -e "ert,$SHELL '\n*china`echo itlab` "
ert,/bin/bash
*chinaitlab

2.2.3單引號
單引號與雙引號類型,不同的是shell會忽略任何引用值。換句話說,如果屏蔽了
其特殊含義,會將引號裏的所以字符,包括引號都作爲一個字符串
ehco -e 'ert,$SHELL '\n*china`echo itlab` '
ert,$SHELL '\n*china`echo itlab`

2.2.4
反引號
反引號用於設置系統命令的輸出到變量。shell將反引號中的內容作用一個系統命令,
並執行其結果
[root@localhost shell]# echo "* china`echo itlab`"
* chinaitlab

2.2.5
反斜槓
如果一個字符有特殊含義,反斜槓防止shell誤解其含義,即屏蔽其特殊含義
下面字符包含有特殊意義,& * + ^ $ ` " | ?
[root@localhost shell]# echo *
David Medinets hello.sh myfile myfile.txt parm parm.sh sort
You have new mail in /var/spool/mail/root
[root@localhost shell]# echo \*
*

2.3運算符
運算符是對計算機發的指令
運算對象:數字、字符(字面值);變量;表達式
表達式:運算符和運算對象的組合體

2.3.1運算符類型
按位運算
~,<<,>>,$,|,^
$[ ]表示形式告訴shell對方括號中的表達式求值
$[2+8]

 運算符                           說明
  ~op1         反運算符,把op1中所有的二進制爲1的變爲0,0變爲1
op1<<op2     左移運算符,把op1中的二進制位向左移動op2位,忽略最左端移出的各位
               ,最右段的各位補上0值,每做一處按位左移就實現op1乘以2
op1>>op2     右移運算符,把op1中的二進制位向右移動op2位,忽略最右端移出的各位
               ,最左段的各位補上0值,每做一處按位右移就實現op1除以2
op1&op2     與比較運算符,op1和op2對應位,對於每個二進制位來說,如果二者該位
        都是1,則結果爲1,否則結果爲0
op1^op2     異或運算符,比較op1和op2對應位,對於每個二進制位來說,如果二者該位
        互補,則結果爲1,否則結果爲0
op1|op2     或運算符,op1和op2對應位,對於每個二進制位來說,如果二者該位
        有一個1或者都是1,則結果爲1,否則結果爲0
        
邏輯運算符
  運算符                         說明
  &&            與運算符
  ||            或運算符
>,==,<,!=              大於,等於,小於,不等於運算符

賦值運算符
=,+=,-=,*=,/=,%=,$=,^=,|=,<<=,>>=
let count=$count+$change
let count+=$change
 
2.3.2表達式替換
$[]和$(())
習慣使用$[],所有shell的求值都是用整數完成
$[]可以接受不同基數的數字
[base#n] n表示基數從2到36的任何基數,表示進制
echo $[10#8+1]
9
             

運算符的優先級(用括號來改變運算順序)
級別         運算符            說明
13           -,+              正,負
12      !,~             邏輯或,按位取反或補碼
11      *,/,%            乘,除,取摸
10           +,-,            加,減
9        <<,>>            按位左移,按位右移
8      <=,>=,<,>        小於等於,大於等於,小於,大於
7       ==,!=          等於,不等於
6         &              按位與
5        ^              按位異或
4        |              按位或
3       &&             按位與
2       ||              按位或
1      =,+=,-=,*=,/=,%=,      賦值,運算且賦值
       &=,^=,|=,<<=,>>=
較高運算級別的運算符先於低級別的運算符進行求值運算

發佈了71 篇原創文章 · 獲贊 27 · 訪問量 100萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章