1. 程式人生 > >Linux中的指令碼程式設計總結

Linux中的指令碼程式設計總結

使用者管理

新增使用者

useradd sxt01

所有的系統賬戶都是在home目錄下的

drwx------ 2 sxt01 sxt01 4096 Dec 10 06:38 sxt01

可以去home目錄下去進行查詢

對於兩個賬戶共享同樣的東西,可以通過建立組的形式,讓兩個賬戶共享相同的東西,具有這樣的許可權

新增組的命令

groupadd sxtshare

一個使用者可以同屬於多個組的

[[email protected] /]# id sxt01

uid=502(sxt01) gid=502(sxt01) groups=502(sxt01)

[[email protected]

/]# usermod -a -G sxtshare sxt01

[[email protected] /]# id sxt01

uid=502(sxt01) gid=502(sxt01) groups=502(sxt01),504(sxtshare)

[[email protected] /]#

或者:

[[email protected] /]# id sxt01

uid=502(sxt01) gid=502(sxt01) groups=502(sxt01),504(sxtshare)

[[email protected] /]# id sxt02

uid=503(sxt02) gid=503(sxt02) groups=503(sxt02)

[[email protected] /]# usermod -a -G sxtshare sxt01

[[email protected] /]# id sxt01

uid=502(sxt01) gid=502(sxt01) groups=502(sxt01),504(sxtshare)

[[email protected] /]# usermod -a -G sxtshare sxt02

[[email protected] /]# id sxt02

uid=503(sxt02) gid=503(sxt02) groups=503(sxt02),504(sxtshare)

[

[email protected] /]#

讓哪一個使用者:

給使用者賦予許可權,並讓其歸屬於哪一個組:

chown sxt01:sxtshare share

修改許可權,通過加或者減許可權,前邊的chmod是指修改許可權。

chmod u/g/o/a +/- rwx

組加上寫的許可權

chmod g+w share/

修改之後:

drwxr-xr-x   2 root  sxtshare  4096 Dec 10 19:40 test

Root持有test這個目錄,sxtshare持有test這個目錄

這兩個的區別是什麼:chmod的區別和chown的區別是什麼?

[[email protected] /]# chmod g+w test/

在實際開發過程中,修改許可權之後,需要將使用者退出,修改完許可權之後再進入。

修改許可權的方式:

chown :sxtshare sxt01.txt

登入一個使用者:

ssh [email protected]

Chmod:修改許可權:

Chmod修改許可權的方式有兩種:

字元修改的方式和數值的修改方式

字元修改許可權的方式:

字元修改又分為對user的許可權修改,對other的許可權修改,對group的許可權修改,對all的許可權修改。

其中在操作的時候,可以對一個使用者修改多個許可權,但是不能對多個使用者修改多個許可權。

比如可以同時對sxt01.txt新增許可權:

Chmod u+xrw sxt01.txt

但是不能使用:

Chmod u+xrw g+xrw sxt01.txt

在Linux系統中:

Chmod是修改許可權的使用方式

Chown是修改屬性的方式,也就是這個檔案或者這個目錄屬於哪個使用者哪個組的。

在修改許可權的時候:

111—>rwx—>7

是這樣的,從右到左依次是:111—>xrw—>7

在進行計算的時候,從左往右依次是:user使用者,group組,other許可權,最後邊是all組。

在進行計算的時候,如果只是user許可權,並且是user許可權的write,read,executive,那麼就是7,如果只是read,那麼就是5,如果只是executive,那麼就是1

修改許可權的時候:最前邊是持有者所具有的許可權,中間是組裡的其他使用者的許可權,最後邊是其他使用者可以擁有的許可權。
目錄一般會給的許可權有:

755是目錄的預設許可權

給檔案給許可權的時候,

755是目錄的預設許可權

644是檔案的預設許可權

Su命令式切換使用者

Root使用者切換任何使用者是免密的。

新增使用者使用:

Useradd sxt01

Useradd sxt02

然後在後邊輸入密碼

修改使用者許可權:

Chmod 770 檔名

新增組使用:

Groupadd  sxtswap

Linux系統和Windows系統的區別是:

Linux系統全部是命令列的形式

Windows系統是圖形化介面

Linux系統中軟體的安裝

編譯型語言,解釋型語言

編譯安裝有:

rpm安裝

Yum安裝

程式系統的執行需要呼叫核心

JDK的下載與安裝:

蘋果系統是Unix系統核心

Redhat的安裝:使用rpm包

 

安裝的過程就是複製黏貼的過程

包的安裝沒有解決依賴的問題

程式的安裝,基於包的安裝

yum是基於倉庫的安裝

安裝的三種方式:

編譯安裝

包的安裝

通過rpm包的查詢安裝

還有一種是綠色的,解壓就可以使用

Maven是一個倉庫,將包放在某一個資料夾中

Make編譯

使用yum安裝的命令:

yum install gcc

以上是編譯安裝

包的安裝

rpm包的安裝

rpm -i jdk-7u67-linux-x64.rpm

rpm包的查詢與過濾

rpm -qa | grep jdk

查詢一個檔案在哪裡?

whereis route

查詢並且去計算

ls -l | wc -l

Yum:是一種C/S架構

Yum的使用

指令碼程式設計:

Bash的使用:

Bash:是一個 啟動器,直譯器

直譯器:使用者互動輸入

source test.txt

source:就是讓命令去執行

Source和.的區別:

[[email protected] ~]# type "."

. is a shell builtin

[[email protected] ~]# type "source"

source is a shell builtin

[[email protected] ~]#

其實兩個的用法,作用等都是相同的。

ps是程序狀態

[[email protected] ~]# pstree

init─┬─auditd───{auditd}

     ├─crond

     ├─master─┬─pickup

     │        └─qmgr

     ├─6*[mingetty]

     ├─nginx───nginx

     ├─rsyslogd───3*[{rsyslogd}]

     ├─sshd─┬─sshd───bash

     │      └─sshd───bash───bash───pstree

     └─udevd───2*[udevd]

[[email protected] ~]#

要讓一個指令碼檔案去執行,需要加上/bin/bash,使得這個檔案可執行。

為什麼能夠執行,是因為有/bin/bash

#是幾個註釋,對於bash而言是一個註釋,但是對於核心直譯器而言,#!一個命令

以上就是指令碼

以下是函式和方法

這個命令:echo $$;是列印當前的程序號

文字流,重定向

重定向的不是程式,而重定向的是I/O

[[email protected] ~]# cd /proc/7351/fd

[[email protected] fd]# ll

total 0

lrwx------ 1 root root 64 Dec  9 20:53 0 -> /dev/pts/0

lrwx------ 1 root root 64 Dec  9 20:53 1 -> /dev/pts/0

lrwx------ 1 root root 64 Dec  9 20:53 2 -> /dev/pts/0

lrwx------ 1 root root 64 Dec  9 20:53 255 -> /dev/pts/0

lr-x------ 1 root root 64 Dec  9 20:53 3 -> /test

[[email protected] fd]# 

ps:是用來列印當前Linux程序的

查詢程序並且過濾:

ps -fe | grep nginx

重定向:

TCP連線是雙向的,有兩個I/O,有輸入和輸出

查詢程序,使用grep進行過濾

ps -fe  | grep nginx

重定向:

[[email protected] fd]# exec 1>& 8

-bash: 8: Bad file descriptor

[[email protected] fd]# exec 8>& 1

[[email protected] fd]# exec 1>& /dev/pts/1

或者:

將重定向正確輸出:

[[email protected] fd]# exec 1>& /dev/pts/0

重定向:

將錯誤重定向輸出:

[[email protected] ~]# ls -l /god 2> ls1.out

分別將正確的和錯誤的輸出:

[[email protected] ~]# ls -l / /god 1> ls2.out 2> ls3.out

將正確輸出和錯誤輸出追加到同一個檔案中:

[[email protected] ~]# ls -l / /god  1>ls9.out 2>&1

預設情況下就是將正確輸出和錯誤輸出重定向到一個檔案中:

[[email protected] ~]# ls -l / /god   >&ll0.out

總之:

輸出流有標準輸出和錯誤輸出

標準輸出為1

錯誤輸出為2

一個>是覆蓋,兩個>是追加

Echo是指輸出:

[[email protected] ~]# echo "hello linux"

hello linux

[[email protected] ~]# echo $$

16177

[[email protected] ~]# read sxt

asdfghjkl

[[email protected] ~]# echo $sxt

asdfghjkl

[[email protected] ~]#

Read是指readline

輸入重定向操作

<<<會重定向將一個輸入放到一個流裡邊去

[[email protected] ~]# read sdf 0<<<"hello sxt"

[[email protected] ~]# echo sdf

sdf

[[email protected] ~]# echo $sdf

hello sxt

[[email protected] ~]#

重定向第二種:

[[email protected] ~]# read sxt 0<<ooxx

> sdfsflkjdsls

> sldkjfls

> sjkdlfsdkf

> \sjkdfds

> \jsjdfs

> ooxx

[[email protected] ~]# echo $sxt

sdfsflkjdsls

[[email protected] ~]#

這種情況是首位呼應的

<<<是指將一行字串放到一個流中,列印輸出

<<是指將多行字串放到一個流中,列印輸出

[[email protected] ~]# cat test.sh

cat 0<<ooxx

jflksjdfsld

jlkgjdslkfjs

jalkjflkdsjf9088432098583094

jofajdsflksd

ooxx

[[email protected] ~]# . test.sh

jflksjdfsld

jlkgjdslkfjs

jalkjflkdsjf9088432098583094

jofajdsflksd

[[email protected] ~]#

變數和作用域

在定義變數和函式的時候,當函授執行只有,變數才會生效

[[email protected] ~]# ooss(){

> sxt1=100

> sxt2=200

> echo $sxt1

> echo $sxt2

> }

[[email protected] ~]# echo $sxt1

 

[[email protected] ~]# echo $sxt2

 

[[email protected] ~]# ooss

100

200

[[email protected] ~]# echo $sxt1

100

[[email protected] ~]# echo $sxt2

200

[[email protected] ~]# ooss

100

200

[[email protected] ~]#

指令碼的書寫與傳參:

[[email protected] ~]# ./sxt1.sh a b c d e f g h i j k l m n

a

b

c

d

e

a1

14

a b c d e f g h i j k l m n

a b c d e f g h i j k l m n

[[email protected] ~]# cat sxt1.sh

#!/bin/bash

 

echo $1

echo $2

echo $3

echo $4

echo $5

 

echo $11

echo $#

echo $*

echo [email protected]

[[email protected] ~]#

列印程序id

Echo $$

管道接more是為了顯示的

[[email protected] ~]# echo $BASHPID | more

16532

[[email protected] ~]#

賦值

[[email protected] ~]# vi sxt02.sh

[[email protected] ~]# cat sxt02.sh

echo $sxt02

[[email protected] ~]# sxt02=good

[[email protected] ~]# echo $sxt02

good

[[email protected] ~]# source sxt02.sh

good

[[email protected] ~]# /bin/bash sxt02.sh

 

[[email protected] ~]# export sxt02

[[email protected] ~]# /bin/bash sxt02.sh

good

[[email protected] ~]#

父程序與子程序

檢查程式上次退出是的狀態,是正確的退出還是錯誤的退出。

echo $?

讀取第8行的內容

[[email protected] ~]# head -8 /etc/profile | tail -1

# /etc/profile.d/ to make custom changes to your environment, as this

[[email protected] ~]#

Linux系統中輸出,計算,以及重定向

[[email protected] ~]# echo $?

2

[[email protected] ~]# y=$((8+7))

[[email protected] ~]# echo $y

15

[[email protected] ~]# a=1

[[email protected] ~]# b=2

[[email protected] ~]# echo $(a+b)

-bash: a+b: command not found

 

[[email protected] ~]# echo $a

1

[[email protected] ~]# echo $b

2

[[email protected] ~]# test 3 -gt 2

[[email protected] ~]# echo $?

0

[[email protected] ~]# test 3 -gt 8

[[email protected] ~]# echo $?

1

[[email protected] ~]# test 3 -gt 8 && echo ok

[[email protected] ~]# test 3 -gt 2 && echo ok

ok

[[email protected] ~]# [3 -gt 2 ] && echo ok

-bash: [3: command not found

[[email protected] ~]# [ 3 -gt 2 ] && echo ok

ok

[[email protected] ~]#

檢視一個使用者是否新增成功了:

①推出去登入

②檢視這個使用者的元資料

[[email protected] ~]# chmod +x userAdd.sh

[[email protected] ~]# ./userAdd.sh ooxx

user add ok...

[[email protected] ~]# echo $?

0

[[email protected] ~]# id ooxx

uid=502(ooxx) gid=504(ooxx) groups=504(ooxx)

[[email protected] ~]# cat userAdd.sh

#!/bin/bash

 

useradd $1

echo $1 | passwd --stdin $1 >& /dev/null

echo "user add ok..."

[[email protected] ~]#

重新修改之後:

[[email protected] ~]# vi userAdd.sh

[[email protected] ~]# ./userAdd.sh ooxx

[[email protected] ~]# echo $?

0

[[email protected] ~]# id ooxx

uid=502(ooxx) gid=504(ooxx) groups=504(ooxx)

[[email protected] ~]# vi userAdd.sh

[[email protected] ~]# ./userAdd.sh oxox

[[email protected] ~]# echo $?

1

[[email protected] ~]# ./userAdd.sh

args ...error...

[[email protected] ~]# cat userAdd.sh

#!/bin/bash

[ $# -eq 1 ] || echo "args ...error..." && exit 1

useradd $1

echo $1 | passwd --stdin $1 >& /dev/null

echo "user add ok..."

[[email protected] ~]#

新增使用者等指令碼程式設計中,能儘量使用&&的時候就儘量使用&&,避免使用||

[[email protected] ~]# cat userAdd.sh

#!/bin/bash

[ ! $# -eq 1 ] && echo "args ...error..." && exit 1

useradd $1

echo $1 | passwd --stdin $1 >& /dev/null

echo "user add ok..."

[[email protected] ~]# ./userAdd.sh ooxx

useradd: user 'ooxx' already exists

user add ok...

[[email protected] ~]# echo $?

0

[[email protected] ~]# id ooxx

uid=502(ooxx) gid=504(ooxx) groups=504(ooxx)

[[email protected] ~]#

這個例子是為了避免在執行指令碼的時候會傳進去好幾個引數的案例

以下的例子是為了避免在傳參進行建立使用者的時候,這個使用者存在

[[email protected] ~]# cat userAdd.sh

#!/bin/bash

 

[ ! $# -eq 1 ] && echo "args ...error..." && exit 1

id $1 >& /dev/null && echo "user exist..." && exit 2

useradd $1

echo $1 | passwd --stdin $1 >& /dev/null

echo "user add ok..."

[[email protected] ~]# ./userAdd.sh ooox

user add ok...

[[email protected] ~]# echo $?

0

[[email protected] ~]# ./userAdd.sh ooox

user exist...

[[email protected] ~]# echo $?

2

[[email protected] ~]#

驗證是否有許可權新增新的使用者

[[email protected] ~]# cat userAdd.sh

#!/bin/bash

 

[ ! $# -eq 1 ] && echo "args ...error..." && exit 1

id $1 >& /dev/null && echo "user exist..." && exit 2

useradd $1 && echo $1 | passwd --stdin $1 >& /dev/null && echo "user add ok..."

 && exit 0echo "wo ye bu zhi dao ..." && exit 8

[[email protected] ~]# cp userAdd.sh /tmp

[[email protected] ~]# ll /home/

total 16

drwx------ 3 ooox  ooox  4096 Dec 11 12:00 ooox

drwx------ 3 oxox  oxox  4096 Dec 11 11:58 oxox

drwx------ 2 sxt01 sxt01 4096 Dec  9 08:06 sxt01

drwx------ 2 sxt02 sxt02 4096 Dec  9 08:06 sxt02

[[email protected] ~]# su ooox

[[email protected] root]$ cd /tmp

[[email protected] tmp]$ ll

total 8

drwxr-xr-x  2 root root 4096 Dec 11 07:11 hsperfdata_root

-rwxr-xr-x  1 root root  246 Dec 11 12:07 userAdd.sh

-rw-------. 1 root root    0 Nov  4 04:11 yum.log

[[email protected] tmp]$ ./userAdd.sh oooo

./userAdd.sh: line 5: /usr/sbin/useradd: Permission denied

wo ye bu zhi dao ...

[[email protected] tmp]$

使用if進行命令列的形式寫指令碼:

[[email protected] ~]# if ls -l / >& /dev/null;then echo "ok" ; else echo "no ok" ; f

I

ok

[[email protected] ~]# if [ 3 -gt 2 ]; then echo ok;fi

ok

[[email protected] ~]#

使用while進行命令列寫指令碼:

[[email protected] ~]# mkdir /god

[[email protected] ~]# while ls -l /god ; do echo ok; rm -fr /god ;done

total 0

ok

ls: cannot access /god: No such file or directory

[[email protected] ~]#

For迴圈語句在指令碼中的使用:

[[email protected] ~]# help for

for: for NAME [in WORDS ... ] ; do COMMANDS; done

    Execute commands for each member in a list.

    

    The `for' loop executes a sequence of commands for each member in a

    list of items.  If `in WORDS ...;' is not present, then `in "[email protected]"' is

    assumed.  For each element in WORDS, NAME is set to that element, and

    the COMMANDS are executed.

    

    Exit Status:

    Returns the status of the last command executed.

for ((: for (( exp1; exp2; exp3 )); do COMMANDS; done

    Arithmetic for loop.

    

    Equivalent to

     (( EXP1 ))

     while (( EXP2 )); do

     COMMANDS

     (( EXP3 ))

     done

    EXP1, EXP2, and EXP3 are arithmetic expressions.  If any expression is

    omitted, it behaves as if it evaluates to 1.

    

    Exit Status:

    Returns the status of the last command executed.

[[email protected] ~]# for ((i=0;i<4;i++)); do echo $i ; done

0

1

2

3

[[email protected] ~]#

算數表示式中使用(()),這時候不需要在寫之前加上$取值

[[email protected] ~]# for i in bjsxt tysxt szsxt shsxt gssxt; do echo $i ; done

bjsxt

tysxt

szsxt

shsxt

gssxt

[[email protected] ~]# for i in bjsxt tysxt szsxt [shsxt gssxt]; do echo $i ; done

bjsxt

tysxt

szsxt

[shsxt

gssxt]

[[email protected] ~]# for i in bjsxt tysxt szsxt {shsxt gssxt}; do echo $i ; done

bjsxt

tysxt

szsxt

{shsxt

gssxt}

[[email protected] ~]#

反引號的級別高於for的級別

[[email protected] ~]# for i in ls ; do echo $i ;done

ls

[[email protected] ~]# for i in ` ls ` ; do echo $i ; done

}

$

anaconda-ks.cfg

echo

httpd-2.2.15-59.el6.centos.x86_64.rpm

install.log

install.log.syslog

ll0.out

ls1.out

ls2.out

ls3.out

ls3.out[[email protected]

ls5.out

ls6.out

ls9.out

ls.out

sh01.sh

soft

sxt02.sh

sxt1=100

sxt1.sh

sxt2=200

sxt.txt

test.sh

test.txt

userAdd.sh

[[email protected] ~]#

案例練習:

Df:檢視磁碟的分配情況

du -s:求和

du -a:統計給出的目錄下所有檔案以及所有目錄的大小

du -sh ./:檢視指定目錄下檔案的大小

[[email protected] ~]# du -sh ./

164M ./

[[email protected] ~]#

找出一行中的最大的檔案

[[email protected] ~]# cat findMax.sh

#!/bin/bash

 

oldIFS=$IFS

IFS=$'\n'

for i in `du -a $1 | sort -rn`;do

echo $i

fileName=$(echo $i | awk '{print $2}')

if [ -f $fileName ];then

echo $fileName

exit 0

fi

done

 

IFS=$oldIFS

echo " n f "

exit 1

[[email protected] ~]# ./findMax.sh ./

167716 ./

166776 ./soft

123884 ./soft/jdk-7u67-linux-x64.rpm

./soft/jdk-7u67-linux-x64.rpm

[[email protected] ~]#

求最大的值

[[email protected] ~]# ./test.sh

a 1

b 2

c 3

num:3

[[email protected] ~]# cat readFile.txt

a 1

b 2

c 3

[[email protected] ~]# cat test.sh

#!/bin/bash

#這個是對詞做切分

oldIFS=$IFS

IFS=$'\n'

num=0

for i in `cat readFile.txt`  ;do

echo $i

((num++))

done

echo num:$num

#用完了之後需要恢復

IFS=$oldIF

[[email protected] ~]# ./test.sh

a 1

b 2

c 3

num:3

[[email protected] ~]#

統計檔案的行數:

[[email protected] ~]# wc -l /etc/profile

82 /etc/profile

[[email protected] ~]# cat /etc/profile | wc -l

82

[[email protected] ~]#

在迴圈語句中for的第二種使用方法:

[[email protected] ~]# cat readFile.txt

a 1

b 2

c 3

[[email protected] ~]# cat test.sh

#!/bin/bash

#這個是對詞做切分

oldIFS=$IFS

IFS=$'\n'

num=0

for i in `cat readFile.txt`  ;do

echo $i

((num++))

done

echo num:$num

#用完了之後需要恢復

IFS=$oldIF

 

echo "---------------------------------"

 

#使用步進的方式進行書寫

num=0

lines=`cat readFile.txt | wc -l`

for ((i=1;i<=lines ; i++));do

line=`head -$i readFile.txt | tail -1`

echo $line

((num++))

done

echo num:$num

 

[[email protected] ~]# ./test.sh

a 1

b 2

c 3

num:3

---------------------------------

a 1

b 2

c 3

num:3

[[email protected] ~]#

通過改變流的指向的方式進行改變流的輸入

[[email protected] ~]# cat readFile.txt

a 1

b 2

c 3

[[email protected] ~]# cat haha.sh

#!/bin/bash

 

#在這裡只是改變了一個指向

exec 0< readFile.txt

read line

echo $line

read line

echo $line

read line

echo $line

[[email protected] ~]# ./haha.sh

a 1

b 2

c 3

[[email protected] ~]#

Shell指令碼程式設計中的總結:

1,花括號  mkdir  -p sdfsdf/{a,b,c}sdfsdf

2,波浪線 cd ~god

3,變數&引數  $  $$  ${}(.....)

4,命令替換 ls -l `echo $path`

5,算術擴充套件  num=$((3+4))

6,word拆分,$IFS

7,路徑  *(零到多個任意字元)?

8,引用刪除   echo "hello"

*,重定向  >  

 

man bash

[email protected]和$*的區別:

[[email protected] ~]# cat readFile.txt

a 1

b 2

c 3

[[email protected] ~]# cat test.sh

#!/bin/bash

#這個是對詞做切分

oldIFS=$IFS

IFS=$'\n'

num=0

for i in `cat readFile.txt`  ;do

echo $i

((num++))

done

echo num:$num

#用完了之後需要恢復

IFS=$oldIF

 

echo "---------------------------------"

 

#使用步進的方式進行書寫

num=0

lines=`cat readFile.txt | wc -l`

for ((i=1;i<=lines ; i++));do

line=`head -$i readFile.txt | tail -1`

echo $line

((num++))

done

echo num:$num

#以下是while迴圈語句

echo "++++++++++++++++++++++++++"

num=0

while read line ;do

echo $line

((num++))

done < readFile.txt

echo "=================================="

num=0

exec 0< readFile.txt

while read line;do

echo $line

done

echo num:$num

echo "*************************************"

export num=0

#管道後邊的內容是在子程序中的

cat readFile.txt | while read line ;do

echo $line

((num++))

done

echo num:$num

 

echo "##################################"

 

echo [email protected]

echo $*

 

echo "@"

for i in "[email protected]";do

echo $i

done

echo "*"

for i in "$*";do

echo $i

done

[[email protected] ~]# ./test.sh a b c d e f

a 1

b 2

c 3

num:3

---------------------------------

a 1

b 2

c 3

num:3

++++++++++++++++++++++++++

a 1

b 2

c 3

==================================

a 1

b 2