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] /]# 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)
[
讓哪一個使用者:
給使用者賦予許可權,並讓其歸屬於哪一個組:
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
登入一個使用者:
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