日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

Linux命令

發(fā)布時間:2024/1/3 综合教程 28 生活家
生活随笔 收集整理的這篇文章主要介紹了 Linux命令 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、日常命令

命令后--help,可以查出該命令的用法以及參數(shù)。
pwd:查看當(dāng)前所在目錄的路徑

date:查看當(dāng)前時間

date +%Y-%m-%d

date -s “2018-1-1”設(shè)置日期為2018-1-1

這個命令其實不用記,不會的話,直接date --help,查看幫助,就知道各個參數(shù)啥意思,關(guān)鍵在于,得知道是date +……


who
  可以顯示當(dāng)前登錄的用戶以及登錄形式


關(guān)機(jī)/重啟(必須是root用戶)

shutdown -h now ##立刻關(guān)機(jī)
shutdown -h +10 ##10min以后關(guān)機(jī)
shutdown -h 12:00:00 #12點整的時候關(guān)機(jī)
halt ##等于立刻關(guān)機(jī)


重啟

shutdown -r now
reboot #等于立刻重啟


清屏
  clear ##或者快捷鍵 ctrl+l

退出當(dāng)前進(jìn)程
  ctrl+c 或者用q

掛起當(dāng)前流程

ctrl+z ##進(jìn)程hi掛起在后臺
bg jonid ##讓進(jìn)程在后臺繼續(xù)執(zhí)行(jobid為運行程序的id)
fg jonid ##讓進(jìn)程回到前臺(jobid為運行程序的id)


echo
  相當(dāng)于打印內(nèi)容到屏幕上

  Linux定義變量,直接變量=參數(shù)即可,比如:a=1
  打印參數(shù)前需要加上$符號才能顯示其內(nèi)容,假設(shè)直接不加,還是會顯示參數(shù)名

二、目錄操作

1、查看目錄信息

ls / 查看根目錄下的子節(jié)點(文件夾和文件)信息
ls . 查看當(dāng)前目錄下信息
ls ../ 查看上一級的目錄信息
ls -l . 列出當(dāng)前目錄下文件的詳細(xì)信息
ls -l 列出當(dāng)前目錄下文件的詳細(xì)信息
ls -al -a是顯示隱藏文件 -l是以更詳細(xì)的列表形式顯示
ls -l -h 列出的文件大小會以K顯示,而不是字節(jié)

總結(jié)(ls --help可以查看參數(shù)的寫法):

ls . 和 ls其實一樣

ls就是顯示文件夾和可顯示的文件名稱

ls -l 會顯示文件夾以及可顯示文件的大小以及權(quán)限等

ls -al 就是在上一步之上加了一個顯示隱藏的文件

ls -alh 就是在上一步的基礎(chǔ)之上,將文件大小以Kb形式顯示,更加直觀

注:
d:directory:代表一個目錄;-代表文件;l代表鏈接,是快捷方式
root root 文件屬于root,屬于用戶組root

ls -l -h或者寫成ls -lh參數(shù)可以放在一起寫,-h是顯示文件大小以Kb的形式


ls -lha上一步的基礎(chǔ)上,再顯示隱藏文件,前面帶點的就是隱藏的



2、切換工作目錄

cd /home/gzw   ## 切換到用戶的主目錄(/home/用戶名)
cd ~   ## 切換到用戶主目錄(/home/用戶名)
cd   ## 切換到用戶的主目錄(/home/用戶名)
cd -   ## 切換到上一步的目錄


3、創(chuàng)建文件夾

mkdir /aaa ## 這是絕對路徑的寫法的寫法,在根目錄下建立一個aaa
mkdir /aaa/bbb ## 這是在aaa文件夾內(nèi)新建一個bbb文件夾

mkdir aaa ## 這是相對路徑的寫法
mkdir -p aaa/bb/ccc ##假設(shè)aaa,bbb都不存在,就去建立ccc,前面加-p,會同時將aaa,bbb,ccc建立起來,遵循剛剛寫的結(jié)構(gòu)


4、刪除文件夾

rmdir aaa ## 只能刪除空白的目錄
rm -r aaa ## 可以將aaa整個文件夾和子節(jié)點全部刪除,包括aaa
rm -rf aaa ## 強(qiáng)制刪除 aaa


5、移動或修改文件夾

mv aaa angelababy ##將aaa文件夾移動到 angelababy文件夾內(nèi)
mv 本質(zhì)上是移動
mv install.log aaa/ ## 將當(dāng)前目錄下的install.log 移動到aaa文件夾中去
mv install.log aaa/ notinstall.log ## 將instal.log移動到aaa下,且改名為notinstall.log
mv a b/c ##將文件夾a移動到文件夾b內(nèi)并且將文件夾a的名字改為c
mv mubby/ mybaby ## 將mubaby改名為mybany



rename
  可以用來批量更改文件名字

  比如很多文件,用 rename .txt .txt.bak 意思是將.txt結(jié)尾的文件改為.txt.bak *

三、文件操作

一、創(chuàng)建文件

1、
  touch somefile.1 ##創(chuàng)建一個新的空文件,大小為0(但是未見后綴跟文件的類型無關(guān),盡管是avi格式,也可以放文本)


  另一種方式:利用“>”重定向的功能,將一條指令的輸出結(jié)果寫入到一個文件內(nèi),會覆蓋源文件內(nèi)容,如果指定的文件不存在,則會創(chuàng)建出來
例如:echo "I love you !" > 1.txt ## 將I love you ! 重定向到1.txt文件內(nèi)

  那么特殊情況:ll > 2.txt ##這樣會把ll這個命令的輸出內(nèi)容放到2.txt內(nèi)

  追加:echo "you love me" >> 1.txt ##在內(nèi)容的原有基礎(chǔ)之上追加這些文本

二、vi文本編輯器

  (相當(dāng)于window的文本編輯器,notepad++)
  vi 1.txt ##修改1.txt(如果1.txt不存在的話,則會先創(chuàng)建一個空的1.txt進(jìn)行編輯)

首先會進(jìn)入“一般模式”,此模式只接受各種命令快捷鍵,不能編輯文件內(nèi)容
首先按“i”鍵,就會從一般模式進(jìn)入編輯模式,此模式下,敲入的都是文件內(nèi)容(這里按i鍵,可以在光標(biāo)定位的位置輸入,進(jìn)行插入;按a,會在光標(biāo)所在位置的后一個字符善后進(jìn)行操作;按o,會在光標(biāo)所在位置下面重新插入一個新的空白行,且光標(biāo)在該行的第一個上)
編輯完成之后,按Esc退出編輯模式,回到一般模式
再按:進(jìn)入的“底行命令模式”,輸入wq命令,回車即可,這樣是保存且退出;按w,就是保存;但是還是在一般模式下,還可以按i進(jìn)行編輯


常用快捷鍵
(用在一般模式下)

a 在光標(biāo)的最后一位插入
A 在該行的最后插入
I 在該行的最前面插入
gg 直接跳到文件的首行
G 直接跳到文件的末行
dd 刪除一行
3dd 刪除3行
YY 復(fù)制一行
3YY 復(fù)制3行
p 粘貼
u undo回退

三、查找并替換

(在底行命令模式中輸入)
1、顯示行號
  :set nu
2、不顯示行號
  :set nonu
3、查找關(guān)鍵字
  :/you ##效果:查找文件中出現(xiàn)的you,并定位到第一個找到的地方,按n可以定位到下一個匹配的位置(按N定位到上一個)
4、替換操作
  :s/sad/bbb ##將sad替換成bbb(這種情況只能替換光標(biāo)所在那一行的第一個sad為bbb)
  :%s/sad/bbb ##全局替換(實際操作是會替換每一行的最前面的那個sad)

四、拷貝、刪除、移動

cp somefile.1 /home/gzw ##復(fù)制一個文件到指定的目錄下
cp somefile.2 /home/gzw/somefile2.1 ##復(fù)制一個文件到gzw下,并且命名為somefile2.1
rm /home/gzw/somefile.1 ##刪除somfile.1(會提示確定刪除,要輸入y)
fm -f/home/gzw/somefile.1
mv /home/gzw/somefile.1 ../

五、查看文件內(nèi)容

cat somefile.1 ## 一次性將文件內(nèi)容全部輸出(輸出在控制臺)

分頁查看命令:

more somefile.1 ## 將somefile.1輸出在控制臺,但是可以翻頁查看,下一頁按空格鍵,上一頁按b(代表back),退出按(q)
less somefile.1 ## 將somefile.1輸出在控制臺,但是可以翻頁查看,下一頁按空格鍵,上一頁按b(代表back),上翻一行(↑),下翻一行(↓),且可以搜索關(guān)鍵字(/搜索內(nèi)容)

跳到文件末尾:G

跳到文件首行:gg

退出less:q

六、查看日志

tail -10 install.log ##查看文件尾部的10行
tail +10 install.log ##查看文件第10-->最后一行
tail -f install.log ##實時看日志的輸出,追蹤日志文件的信息(f追蹤的是文件的唯一標(biāo)識,就算文件被改了名字,也可以被追蹤并輸出,也就是說,將install.log改為install2.log,用這么命令依舊可以追蹤到內(nèi)容ll -i可以看文件的唯一標(biāo)識,在文件的最前面那串)
tail -F install.log ##實時看日志的輸出,追蹤日志文件的信息(F追蹤的是文件名,改了就追蹤不了)
head -10 install.log ##查看文件的頭10行

七、打包壓縮

1、gzip 壓縮
  gzip a.txt ##壓縮后會變成a.txt.gz,體積會縮小

2、解壓
  gzip -d a.txt.gz ##解壓a.txt.gz成為a.txt

3、打包:將制定文件或文件夾(一堆文件變一個文件)
  tar -cvf bak.tar ./aaa ##將./aaa內(nèi)的內(nèi)容打包成一個名字叫bak.tar的文件
  tar -cvf bak.tar 1.txt 2.txt aaa/ ##將aaa文件夾內(nèi)的1.txt和2.txt打包成為bak.tar,打完后的bak.tar也在aaa內(nèi)
  (c是創(chuàng)建一個包,v是顯示整個打包的進(jìn)度,f是要創(chuàng)建的那個包的名稱)

tar -xvf bak.tar ##將打好的包解壓
x是抽取,v顯示進(jìn)度,f文件名

一般來講,tar打包之后還不夠,這只是說將其打包,并未壓縮,用的多的是打包成一個壓縮文件,可以在上一步的基礎(chǔ)上再用 gzip bak.tar 變成bak.tar.gz文件,那么怎么一步完成呢???

tar -zcvf bak.tar.gz 1.txt 2.txt aaa/ ##將aaa文件夾下的1.txt和2.txt打包壓縮成一個bak.tar.gz文件
tar -zxvf bak.tar,gz ##將bak.tar.gz解壓并且不打包,也就會變成1.txt和2.txt

解壓到指定文件夾下:
tar -zxvf bak.tar.gz -C /usr ##將bak.tar.gz解壓到usr文件夾內(nèi)

四、查找命令

一、常用查找命令的使用

1、查找可執(zhí)行的命令所在路徑:

  which ls


2、查找可執(zhí)行的命令和幫助的位置

  whereis ls(where和is中間無空格)


3、從某個文件夾開始查找文件

  find /-name "gzw*"(“/”是搜索的路徑;-name是按照什么搜,可以按照 -user按 所屬用戶搜 -perm按權(quán)限搜;“gzw*”搜的內(nèi)容,*為通配符,代表以gzw為開頭的文件或者文件夾)



4、查找并刪除

  find / -name "gzw*" -ok rm {};
  find / -name "gzw*" -exec rm {};


5、顯示歷史命令
  history ##顯示之前的所有命令
  或者直接按↑鍵

二、grep命令(搜索文件的內(nèi)容)

1、基本使用-查詢包含gzw的行(不用打開文件)
  grep gzw /etc/passwd ##在/etc/passwd內(nèi)查找有g(shù)zw的行

gzw:x:500:500:gzw:/home/gzw:/bin/bash
  x是密碼的占位符,500為用戶id,500所屬的組的id,gzw是這個用戶的全名,也就是描述名稱,/home/gzw是用戶gzw的家目錄,/bin/bash表示gzw用戶所用的shell是bashshell(id從500開始才是真的用戶,root除外)
  grep aaa ./*.txt ##在當(dāng)前目錄下,所有.txt結(jié)尾的文件內(nèi)找包含aaa的行

2、cut截取以:分割保留第七段
  grep gzw /etc/passwd | cut -d:-f7

3、查詢不包含gzw的行
  grep -v gzw /etc/passwd ##-v是反選

五、文件權(quán)限操作

1、Linux文件權(quán)限的描述格式解讀

  r:可讀;w:可寫;x:可執(zhí)行
drwxr-xr-x可以用二進(jìn)制表示為:111 101 101 ==> 755

d:標(biāo)志節(jié)點類型(d:文件夾 -:文件 l:鏈接)
r:可讀;w:可寫;x:可執(zhí)行
第一組:rwx ##表示這個文件的擁有者對它的權(quán)限:可讀可寫可執(zhí)行
第二組:r-x ##表示這個文件的所屬組用戶對它的權(quán)限:可讀不可寫可執(zhí)行
第三組:r-x ##表示這個文件的其他的用戶對它的權(quán)限:可讀不可寫可執(zhí)行

2、修改文件權(quán)限

chmod 777 1.txt ##將1.txt變?yōu)閞wxrwxrwx
chmod +x 1.txt ##擁有者、所屬用戶、其他用戶都加一個x權(quán)限
chmod u+rx 1.txt ##擁有者加rx權(quán)限,其他的用戶不變
chmod g+rx 1.txt ##所屬用戶組加rx權(quán)限,其他的用戶不變
chmod o+rx 1.txt ##其他用戶加rx權(quán)限,其他的用戶不變
chmod -x 1.txt ##所有人減去一個x權(quán)限


但是注意,改的只是這個文件/文件夾的權(quán)限,假設(shè)文件夾還有文件,沃特娘的想一次性全部給改了,咋個辦???
chmod -R 777 aaa ##將aaa文件夾以及文件夾內(nèi)的全部文件全部改成777

那么r、w、x三個權(quán)限各是什么意思?
r對文件來說,是可讀取內(nèi)容;多文件夾來說是可以ls;
w對于文件來講,是改文件的內(nèi)容 ;對于目錄來講,是可以在目錄內(nèi)增刪子節(jié)點
x對文件來說,是能否運行這個文件;對文件夾來說是能否cd進(jìn)入這個目錄;

那么,假設(shè)我想要一個目錄或者文件直接轉(zhuǎn)個組或者轉(zhuǎn)給一個用戶怎么辦?
這個命令只能在root用戶做:
chown root:root a.sh
就是說這個文件之前的所有者以及所有組多這個文件沒了權(quán)限,文件的權(quán)限轉(zhuǎn)給了root組內(nèi)的root用戶

六、用戶管理

需要掌握的:

添加一個用戶:

useradd spark
passwd spark  根據(jù)提示設(shè)置密碼即可

刪除一個用戶:

userdel -r spark  加一個-r就表示將用戶的主目錄都刪除

1、添加用戶

  添加一個tom用戶,設(shè)置其屬于 user 組,并添加注釋信息:

分步完成過程如下:

  useradd tom

  usermod -g user tom

  usermod -c "hr tom" tom

一步完成:

  useradd -g user -c "hr tom" tom

設(shè)置tom密碼:

  passwd tom

2、修改用戶

修改tom用戶的登錄名字為tomcat

  usermod -l tomcat tom

將tomcat添加到sys和root組中

  usermod -G sys,root tomcat

查看tomcat 的組信息

  groups tomcat

3、用戶組操作

添加一個叫america的組

  groupadd america

將 jerry 添加到 america 組中

  usermod -g america jerry

將tomcat用戶從root組和sys組刪除

  gpasswd -d tomcat root

  gpasswd -d tomcat sys

將 america 組名修改成 am

  groupmod -n am america

4、為用戶配置 sudo 權(quán)限

這是為了個普通用戶一個管理員的權(quán)限

用 root 編輯 vi/etc/sudoers

在文件的如下位置,為 gzw 添加一行即可:

rooot  ALL=(ALL)  ALL

gzw  ALL=(ALL)  ALL

然后,gzw用戶就可以用 sudo 來執(zhí)行系統(tǒng)級別的命令

比如: sudo usersdd mayun

這行命令執(zhí)行完,下一行如果不用sudo,還是依舊本身的權(quán)限

七、系統(tǒng)管理操作

一、掛載外部存儲設(shè)備

  比如說插入一個光盤,光盤里面有一個Oracle,或者說是一個鏡像,我們在Linux里面是顯示為一個設(shè)備,而不是文件;那我們?nèi)绻L問里面的文件,就要把它映射到文件目錄,就叫做掛載

  可以掛載什么呢?光盤、硬盤、磁帶、光盤鏡像文件等

1、掛載光驅(qū)

  mkdir  /mnt/cdrom    創(chuàng)建一個目錄,用來掛載

  mont -t iso9660 -o ro/dev/cdrom/mnt/cdrom/  將設(shè)備/dev/cdrom掛載到掛載點:/mnt/cdrom 中

2、掛載光盤鏡像文件(.iso文件)

  mont -t iso9660 -o loop /home/gzw/Centos-6.7.DVD.iso /mnt/centos

 注:掛載的資源在重啟后即失效,需要重新掛載。想要自動掛載,可以將掛載信息設(shè)置到 /etc/fstab 配置文件中:

  /dev/cdrom  /mnt/cdrom  iso9660 defaults  00

  /root/CentOS-6.7-x86_64-bin-DVD1.iso  /mnt/centos  iso9660 defaults,ro,loop  00

3、卸載 umont

  umont /mnt/cdrom

4、存儲空間查看

  df -h

二、統(tǒng)計文件以及文件夾的大小

1、du -sh /mnt/cdrom/packages  

  統(tǒng)計指定路徑下的所有子目錄和文件的大小

2、df -h

  查看磁盤的空間

三、系統(tǒng)服務(wù)管理

service --status-all  ##查看系統(tǒng)所有的后臺服務(wù)進(jìn)程

  后面可以接管道:

  service --status-all | grep httpd

servoce sshd status  ##查看指定的后臺服務(wù)進(jìn)程的狀態(tài)

service sshd stop

service sshd start

service sshd restart

配置后臺服務(wù)進(jìn)程的開機(jī)自啟

chkconfig httpd on  ##讓httpd 服務(wù)開機(jī)自啟

chkconfig httpd off  ##讓httpd 服務(wù)開機(jī)不要自啟

查看開機(jī)自啟服務(wù)的命令:

chkconfig --list | grep httpd

截圖:

那么這幾個你姐是什么意思呢?往下看

四、系統(tǒng)啟動級別管理

  vi /etc/inittab

可以看到有以下幾個級別

# Default runlevel. The runlevels used are:
# 0 - halt (Do NOT set initdefault to this)  ##關(guān)機(jī),級別如果設(shè)置這個,那么一啟動就會關(guān)機(jī)
# 1 - Single user mode  ##單用戶模式
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)  ##多用戶系統(tǒng),不支持網(wǎng)絡(luò)文件系統(tǒng)
# 3 - Full multiuser mode  ##全功能的多用戶模式
# 4 - unused  
# 5 - X11  ##帶圖形界面的全功能模式,比3多了個圖形界面
# 6 - reboot (Do NOT set initdefault to this)  ##重啟

究竟要哪個級別,在這里填id就好了:一般來講設(shè)置為3就ok

那么如果一個服務(wù):

  chkconfig httpd off

那么這個服務(wù)0-6都會被關(guān)閉

  chkconfig --level35 httpd on

意味著,我這個服務(wù)在3,5的開機(jī)情況下可以自啟

五、進(jìn)程管理

  top

  相當(dāng)于Windows的任務(wù)管理器,是動態(tài)變化的:

  

  free

  顯示內(nèi)存的使用量,你發(fā)送的的那一瞬間的內(nèi)存量

  

  ps -ef | grep ssh  查看現(xiàn)在運行的跟ssh有關(guān)的進(jìn)程

     進(jìn)程號  父進(jìn)程號          啟動的命令,哪個程序啟動的

那如果我要把進(jìn)程給殺掉,怎么做?

  kill -9 1532 (1532為進(jìn)程號,例如上邊的第一個進(jìn)程)

八、SSH免密登陸配置

一、SSH工作機(jī)制

  1、相關(guān)概念

  SSH為 Secure Shell(安全外殼協(xié)議)的縮寫,是一種協(xié)議。網(wǎng)絡(luò)遠(yuǎn)程訪問Linux,敲Shell命令,提供安全協(xié)議,提供協(xié)議,本質(zhì)上是為了會話內(nèi)容加密和身份驗證。

  SSH的具體實現(xiàn)是由客戶端服務(wù)器的軟件組成

  服務(wù)端是一個守護(hù)進(jìn)程(sshd),他在后臺運行并響應(yīng)來自客戶端的連接請求;客戶端包含ssh程序以及像scp(遠(yuǎn)程拷貝)、slogin(遠(yuǎn)程登錄)、sftp(安全文件傳輸)等其他的應(yīng)用程序。

  2、認(rèn)證機(jī)制

  從客戶端來看,SSH提供兩種級別的安全驗證

(一)基于口令的安全驗證

  只要你知道自己的賬號和口令,就可以登錄到遠(yuǎn)程主機(jī)(就像用xshll登錄)

(二)基于密鑰的安全驗證(一臺Linux登錄另一臺Linux,因為Linux上沒有XShell)

  需要依靠密鑰,也就是你必須自己創(chuàng)建一堆密鑰,并且把公用密鑰放在需要訪問的服務(wù)器上

假如A要登錄B,

九、網(wǎng)絡(luò)管理

一、主機(jī)名配置

1、查看主機(jī)名

  hostname

2、改主機(jī)名

  hostname gzw01  ##將主機(jī)名改成gzw01,重啟后失效(重新登錄可以查看)

3、永久改主機(jī)名

  vi /etc/sysconfig/network  找到HOSTNAME,改掉值,就ok了

二、IP地址配置

1、setup(并不是所有的版本可用)

  用root輸入setup命令,進(jìn)入交互修改界面

2、修改配置文件(重啟后永久生效)

  vi /etc/sysconfig/network-scripts/ifconfig-eth0

改完之后,要重啟網(wǎng)絡(luò)服務(wù):

  service network restart

3、ifconfig 命令(重啟后無效)

  ifconfig eth0 192.168.10.42

三、域名映射

etc/hosts 文件(域名映射表)  用于在通過主機(jī)名訪問時做ip解析之用。所以,你想訪問一個什么樣的主機(jī)名,就需要把這個主機(jī)名和它對應(yīng)的ip地址配置在 etc/hosts 文件中

四、網(wǎng)絡(luò)服務(wù)管理

1、后臺服務(wù)管理

service network status  ##查看指定服務(wù)的狀態(tài)
service network stop  ##停止指定服務(wù)
service network start  ##啟動指定服務(wù)
service network restart  ##重啟指定服務(wù)
service --status-all  ##查看系統(tǒng)中所有的后臺服務(wù)

2、設(shè)置后臺服務(wù)的自啟配置

chconfig  ##查看所有服務(wù)器自啟配置
chkconfig iptables off  ##關(guān)掉指定服務(wù)的自啟動
chkconfig iptables on  ##開啟指定服務(wù)的自啟動

3、系統(tǒng)中網(wǎng)絡(luò)進(jìn)程的端口監(jiān)聽情況:

  netstat -nltp

十、Linux上常用軟件安裝

一、Linux軟件安裝方式

  常用以下幾種方式:

  1、二進(jìn)制發(fā)布包

  軟件已經(jīng)針對具體平臺編譯打包,只要解壓,修改配置即可

  2、RPM發(fā)布包(Redhat Package Mangement)

  軟件已經(jīng)按照rehat的包管理工具規(guī)范RPM進(jìn)行打包發(fā)布,需要獲取到相應(yīng)的軟件RPM發(fā)布包,然后用RPM命令安裝

  

  3、Yum在線安裝

  軟件已經(jīng)以RPM規(guī)范打包,但已經(jīng)發(fā)布在了網(wǎng)絡(luò)上的一些服務(wù)器上,可用 yum 在線安裝服務(wù)器上存在的 rpm 軟件,并且會自動解決軟件安裝過程中的庫依賴問題(類似maven

  4、源碼編譯安裝

  軟件以源碼工程的形式發(fā)布,需要獲取到源碼工程后用相應(yīng)的人開發(fā)工具進(jìn)行編譯打包部署

二、JAVA軟件安裝——JDK安裝

  1、上傳jdk壓縮包

通過sftp工具上傳即可

  2、解壓jdk壓縮包

tar -zxvf jdk-XXX.gz -C /usr/local/

  3、修改環(huán)境變量PATH 

vi /etc/profile

在文件最末尾(按G)加兩行:

export JAVA_HOME=/usr/local/jdk1.7

export PATH=$PATH:$JAVA_HOME/bin

  4、讓環(huán)境變量生效

source /etc/profile

  即可

三、JAVA軟件安裝——Tomcat安裝

tar -zxvf /soft/apache-tomcat-7.0.47.tar.gz -C /usr/local/

cd /usr/local/apache-tomcat-7.0.47/bin/

./starttup.sh

四、使用rpm軟件安裝方式

1、安裝Mysql服務(wù)端:

  可以用 yum 來安裝,這里我們用 rpm 包來演示:

2、安裝Mysql客戶端:

五、使用yum方式安裝

六、使用源碼方式安裝

十一、防火墻的規(guī)則配置

一、防火墻配置

  防火墻配置文件為

/etc/sysconfig/iptables

來控制本機(jī)的出、入網(wǎng)絡(luò)訪問行為

二、防火墻配置 

查看防火墻狀態(tài)

  service iptables status

關(guān)閉防火墻

  service iptables stop

啟動防火墻

  service iptables start

禁止防火墻自啟

  chkconfig iptables off

保存配置

  service iptables save

禁止ssh登錄

  iptables -A INPUT -p tcp --dport 22 -j DROP

加入一條 INPUT 規(guī)則開放 80端口

  iptables -I INPUT -p tcp --dport 80 -j ACCEPT

十二、高級文本處理命令(無需打開文本進(jìn)行編輯)

cut

概念:cut 命令可以從一個文本文件或者文本流中提取文本列

語法:

cut -d '分隔字符' -f fields  ##用于有特定分隔字符
cut -c 字符區(qū)間  ##用于排列整齊的信息

選項和參數(shù):

-d:后面接分隔符。與 -f 一起使用;
-f :依據(jù) -d 的分隔字符將一段信息分割成數(shù)段,用 -f 取出第幾段的意思;
-c : 以字符 (characters) 的單位取出固定字符區(qū)間

實例:

PATH變量如下:

# echo $PATH
/usr/lib/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/jdk1.8.0_131/bin:/usr/local/jdk1.8.0_131/jre/bin:/usr/local/apache-jmeter-5.0/bin/:/root/bin

這里我們可以發(fā)現(xiàn),各個路徑之間是用 : 分隔路徑的,那么我們可以利用 cut 命令去將其分隔開,假如我想提取第 2 個路徑,那么應(yīng)該輸入如下:

# echo $PATH
/usr/lib/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/jdk1.8.0_131/bin:/usr/local/jdk1.8.0_131/jre/bin:/usr/local/apache-jmeter-5.0/bin/:/root/bin
# echo $PATH | cut -d ':' -f 2   ##提取第 2 個路徑 /usr/local/sbin
# echo $PATH | cut -d ':' -f 2,4  ##提取第 2 和第 4 個路徑
/usr/local/sbin:/sbin
# echo $PATH | cut -d ':' -f 2-   ##提取第 2 個,直至最后一個路徑
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/jdk1.8.0_131/bin:/usr/local/jdk1.8.0_131/jre/bin:/usr/local/apache-jmeter-5.0/bin/:/root/bin
# echo $PATH | cut -d ':' -f -2   ##提取第 1 到第 2 個
/usr/lib/qt-3.3/bin:/usr/local/sbin
# echo $PATH | cut -d ':' -f 1-3,5 ##提取 1-3 以及第 5 個
/usr/lib/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/bin

以上,就是 cut 的常用方法,可以理解并掌握一下

sed(并不會保存文本,需要保存自行重定向)

用法:先新建一個 文本文件 ,隨便編輯些內(nèi)容進(jìn)去

# cat example 
1: fjpqejfpjewjfwejvjqwjev
2: djoiqjdowjodfwejocpf,vf,vf v]qfkv]qwefkqwjfe vqfjvnqwojnfqwjnc[f
3:mowedfwelfw    ff]    f]jf]
4:cnioecewcw owe ioqwe hfoqweh foweh fiupqw huipq ui uipqe ui ruipq
5:fwecv iefvqw 

刪除:d 命令 (delete)

# sed '2d' example     ##刪除 example 文件的第 2 行
1: fjpqejfpjewjfwejvjqwjev
3:mowedfwelfw    ff]    f]jf]
4:cnioecewcw owe ioqwe hfoqweh foweh fiupqw huipq ui uipqe ui ruipq
5:fwecv iefvqw

# sed '2,$d' example    ##刪除 example 文件的第 2 行到末尾的所有行(保留第 1 行)
1: fjpqejfpjewjfwejvjqwjev

# sed '$d' example     ##刪除 example 文件的最后一行
1: fjpqejfpjewjfwejvjqwjev
2: djoiqjdowjodfwejocpf,vf,vf v]qfkv]qwefkqwjfe vqfjvnqwojnfqwjnc[f
3:mowedfwelfw ff] f]jf]
4:cnioecewcw owe ioqwe hfoqweh foweh fiupqw huipq ui uipqe ui ruipq

# sed '/4/'d example   ##刪除 example 文件所有包含 ‘4’ 的行
1: fjpqejfpjewjfwejvjqwjev
2: djoiqjdowjodfwejocpf,vf,vf v]qfkv]qwefkqwjfe vqfjvnqwojnfqwjnc[f
3:mowedfwelfw ff] f]jf]
5:fwecv iefvqw

替換:s 命令(substitution)

# sed 's/2/change2/g' example     ##在整行范圍內(nèi)將 ‘2’ 替換成 ‘change2’ 。如果無 g 標(biāo)記,則只有每行第一個匹配的 ‘2’ 被替換
1: fjpqejfpjewjfwejvjqwjev
change2: djoiqjdowjodfwejocpf,vf,vf v]qfkv]qwefkqwjfe vqfjvnqwojnfqwjnc[f
3:mowedfwelfw    ff]    f]jf]
4:cnioecewcw owe ioqwe hfoqweh foweh fiupqw huipq ui uipqe ui ruipq
5:fwecv iefvqw

# sed -n 's/^2/change2/p' example   ##(-n)選項和 p 標(biāo)志一起使用表示只打印那些發(fā)生替換的行。也就是以 ‘2’ 為開頭的行,被替換成 ‘change2’,并打印這一行
change2: djoiqjdowjodfwejocpf,vf,vf v]qfkv]qwefkqwjfe vqfjvnqwojnfqwjnc[f

# sed 's/^1/&number one/' example   ## & 符號表示在找到的字符串后追加一個字符串,比如在所有的以 ‘1’ 為首的字符串中,在 ‘1’ 后追加 ‘number one’ ,變成 ‘1number one’
1number one: fjpqejfpjewjfwejvjqwjev
2: djoiqjdowjodfwejocpf,vf,vf v]qfkv]qwefkqwjfe vqfjvnqwojnfqwjnc[f
3:mowedfwelfw ff] f]jf]
4:cnioecewcw owe ioqwe hfoqweh foweh fiupqw huipq ui uipqe ui ruipq
5:fwecv iefvqw

# sed -n 's/(fwe)cv/1changechange/p' example   ##將文本中的 ‘fwe’ 標(biāo)記為 1 ,并將所有的 ‘fwecv’ 替換成‘fwechangechange’,并且被替換的行被打印出來
5:fwechangechange iefvqw
……

awk

說明:awk 是一個強(qiáng)大的文本你分析工具,相對于 grep 的查找,sed 的編輯,awk 在其對數(shù)據(jù)分析并生成報告時,顯得尤為強(qiáng)大。簡單來講 awk 就是把文件逐行地讀入,以空格為分隔符將每行切片,切開的那部分再進(jìn)行各種分析處理

工作流程:讀入有 ‘
’ 換行符分割的一條記錄,然后將記錄按照指定的域分隔符劃分域,填充域,$0 則表示所有域,$1 表示第一個域,$n表示第 n 個域。默認(rèn)域分割符是 ‘空白鍵’ 或者 ‘[tab]鍵’ ,所以 $1 表示登錄用戶,$3 則表示用戶 ip ,以此類推

# last -n 5  ##最近登錄的 5 個賬戶的信息
root     pts/2        192.168.66.1     Sat Dec 29 21:58   still logged in   
root     pts/1        192.168.66.1     Sat Dec 29 18:28   still logged in   
root     pts/0        192.168.66.1     Sat Dec 29 18:28   still logged in   
reboot   system boot  2.6.32-358.el6.i Sat Dec 29 18:11 - 23:32  (05:21)    
root     pts/1        192.168.66.1     Sat Dec 29 14:29 - down   (03:41)

# last -n 5 | awk '{print $1}'  ##只顯示最近登錄的 5 個賬號,不需要要其他信息
root
root
root
reboot
root

# cat /etc/passwd|awk -F ':' '{print $1}'  ##如果只顯示 /etc/passwd/ 的賬戶;這里用 -F ‘:’ 表示將 ‘:’ 作為分隔符,然后取第一個域
root
bin
daemon
adm
lp
sync
……

# cat /etc/passwd|awk -F ':' '{print $1" "$7}'  ##顯示 /etc/passwd 的賬戶和對應(yīng)的 shell,而賬戶與 shell 之間用 tab 鍵分隔
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
sync /bin/sync
……

# cat /etc/passwd|awk -F ':' '{print $1"==="$7}'  ##或者自己指定分隔符
root===/bin/bash
bin===/sbin/nologin
daemon===/sbin/nologin
adm===/sbin/nologin
lp===/sbin/nologin
sync===/bin/sync
……

# cat /etc/passwd|awk -F ':' 'BEGIN {print "name,shell"} {print $1","$7} END {print"blue,/bin/nosh"}'  ##顯示 /etc/passwd 的賬戶以及對應(yīng)的shell,用‘,’分隔,第一行加‘name,shell’,最后一行加‘blue,/bin/nosh’
name,shell
root,/bin/bash
bin,/sbin/nologin
daemon,/sbin/nologin
adm,/sbin/nologin
lp,/sbin/nologin
sync,/bin/sync
……
blue,/bin/nosh

十三、crontab配置

功能:通過 crontab 功能,可以在固定的間隔時間執(zhí)行指定的系統(tǒng)指令或 shell script 腳本。時間間隔的單位可以是分鐘、小時、日、月、周、及以上的任意組合。這個命令非常適合周期性的日志分析或者數(shù)據(jù)備份等工作。定時調(diào)度器

安裝:

yum install crontabs

服務(wù)操作說明:

service crond start  ##啟動服務(wù)
service crond stop  ##關(guān)閉服務(wù)
service crond restart  ##重啟服務(wù)
service crond reload  ##重新載入配置
service crond status  ##查看 crontab 服務(wù)狀態(tài)
chkconfig --level 35 crond on  ##加入開機(jī)自啟動

命令格式:

  crontab [-u user] file

  crontab [-u user] [-e | -l -r]

  參數(shù)說明:

-u user :用來設(shè)定某個用戶的 crontab 服務(wù),例如:“ -u gzw ” 表示設(shè)定 gzw 用戶 的 crontab 服務(wù),此參數(shù)一般由 root 用戶來運行,-u 如果不指定,默認(rèn)就是幫本用戶指定任務(wù);
file :file 是指命令文件的名字,表示將 file 作為 crontab 的任務(wù)列表文件并載入 crontab;
-e :編輯某個用戶的 crontab 文件內(nèi)容,如果不指定用戶,則表示編輯當(dāng)前用戶的 crontab 文件內(nèi)容;
-l : 顯示某個用戶的 crontab 文件內(nèi)容,如果不指定用戶,則表示顯示當(dāng)前用戶的 crontab文件內(nèi)容;
-r : 刪除定時任務(wù)配置,從 /var/spool/cron 目錄中刪除某個用戶的 crontab 文件,如果不指定用戶,則默認(rèn)刪除當(dāng)前用戶的 crontab 文件;
-i : 在刪除用戶的 crontab 文件時給確認(rèn)提示

命令實例:

  crotab file [-u user]  ##用指定的文件替代目前的 crontab

必須掌握:

crontab -l [-u user]  ##列出用戶目前的 crontab
crontab -e[-u user]  ##編輯用戶目前的 crontab

# crontab -l  ##看當(dāng)前用戶有沒有定時任務(wù)
no crontab for root

# crontab -e  ##增加個定時任務(wù),里面填入以下內(nèi)容,保存
* * * * * date >> /root/date.txt

# crontab -l  ##保存完之后,可進(jìn)行查看
* * * * * date >> /root/date.txt

# cat date.txt  ##可以看到結(jié)果,每分鐘,文件內(nèi)被追加寫了一行 date
Sun Dec 30 00:47:01 CST 2018
Sun Dec 30 00:48:01 CST 2018
Sun Dec 30 00:48:01 CST 2018
Sun Dec 30 00:49:01 CST 2018
Sun Dec 30 00:49:01 CST 2018

調(diào)度配置  

  說明

  格式如下:

   *   *   *    *   *   command

  分  時  日  月  周  命令

  第 1 列表示分鐘 1-59 每分鐘用 * 或者 */1 表示

  第 2 列表示小時 0-23 (0表示 0點)7-9表示:8點到10點之間

  第 3 列表示日期 1-31

  第 4 列表示月份 1-12

  第 5 列表示星期 0-6(0表示星期天)

  第 6 列表示要運行的命令

配置實例

30 21 * * * /usr/local/etc/rc.d/httpd restart  ## 表示每晚的 21:30 自動重啟 apache

45 4 1,10,22 * * /usr/local/etc/rc.d/httpd restart  ## 表示每月 1、10、22 日的 4:45 重啟 apache

10 1 * * 6,0 /usr/local/etc/rc.d/httpd restart  ## 表示每周六、日的 1:10 重啟 apache

0,30 18-23 * * * /usr/local/etc/rc.d/httpd restart  ## 表示在每天 18:00 至 23:00 之間每隔 30 分鐘重啟 apache

0 23 * * 6 /usr/local/etc/rc.d/httpd restart  ## 表示每周六的 11:00 pm 重啟 apache

* */1 * * * /usr/local/etc/rc.d/httpd restart  ## 表示每 1 小時重啟 apache

* 23-7/1 * * * /usr/local/etc/rc.d/httpd restart  ## 表示晚上 11 點 到早上 7 點之間,每隔 1 小時重啟 apache

0 4 1 jan * /usr/local/etc/rc.d/httpd restart  ## 表示一月一號的 4 點重啟 apache

shell編程

  shell 是用戶與內(nèi)核進(jìn)行交互的一種接口,目前最流行的 shell 稱為 bash shell

  shell 也是一門編程語言<解釋型的編程語言>,即 shell 腳本,就是在用 linux 的 shell 命令編程

  一個系統(tǒng)可以存在多個 shell ,可以通過 cat/etc/shell 命令查看系統(tǒng)中安裝的 shell ,不同的 shell 可能支持的命令語法是不同的

一、基本格式

  代碼寫在普通文本文件中,通常以 .sh 為后綴名

  vi hello.sh

#!/bin/bash  ##表示用哪一種 shell 解析器解析執(zhí)行我們的這個腳本程序
echo "hello world"

  執(zhí)行腳本

  sh hello.sh  為什么這里加 sh 不加路徑可以運行?因為 sh 在環(huán)境變量內(nèi),不加路徑就默認(rèn)當(dāng)前路徑

  或者給腳本添加 x 權(quán)限,直接執(zhí)行

  chmod 755 hello.sh

# ./hello.sh   ##這里為啥要加 ./ ? 運行程序,系統(tǒng)都是從環(huán)境變量里面去找,很顯然這個腳本的路徑并不在環(huán)境變量內(nèi) ./ 已經(jīng)指定在當(dāng)前路徑下
hello world

  

二、基本語法

系統(tǒng)變量

Linux shell 中的變量分為“系統(tǒng)變量”和“用戶自定義變量”,可通過 set 命令查看系統(tǒng)變量

# set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="1" [2]="2" [3]="2" [4]="release" [5]="x86_64-redhat-linux-gnu")
BASH_VERSION='4.1.2(2)-release'
COLORS=/etc/DIR_COLORS
……

系統(tǒng)變量:$BASH、$HOME、$PWD、$SHELL、$USER 等等

自定義變量

  自定義的變量只能在當(dāng)前進(jìn)程生效,不能跨進(jìn)程傳遞自定義變量

  1、語法

變量=值 (例如 STR=abc)

等號兩側(cè)不能有空格

變量名稱一般習(xí)慣大寫

使用變量: $arg

雙引號和單引號有區(qū)別,雙引號僅僅將空格脫意,單引號會將變量引用也脫意

# mygirl1=angela baby  ##中間有空格,linux 會認(rèn)為是兩個參數(shù),所以要加引號    
-bash: baby: command not found

# mygirl1='angela baby'
# echo $mygirl1
angela baby

# mygirl2="she is $mygirl1"  ##將里面的變量也打印出其值
# echo $mygirl2
she is angela baby

# mygirl2='she is $mygirl1'  ##里面的變量,只會按原樣打印出來
# echo $mygirl2
she is $mygirl1

  2、示例

STR="hello world"

A=9

echo $A

echo $STR

如果想打印 hello worlds is greate 怎么辦?

echo $STR is greate 行么?

不行!正確的寫法是:

echo ${STR}s is greate

# mycount=2000
# echo $mycount 
2000

##如果想打印 2000 is mycount 要這樣寫:
# echo $mycount is mycount
2000 is mycount
或者:
# echo ${mycount} is mycount
2000 is mycoun

##如果要打印 2000s is mycount 怎么寫?
# echo $mycounts is mycount
is mycount
這樣寫,linux會認(rèn)為 mycounts 是一個變量,但這個變量并沒有定義,所以為空,正確的寫法如下:
# echo ${mycount}s is mycount 2000s is mycount

unset A 撤銷變量 A

redonly B=2 聲明靜態(tài)的變量 B=2 ,不能 unset

export A 將變量提升為當(dāng)前 shell 進(jìn)程中的全局環(huán)境變量,可供其他子 shell 程序使用

注意理解 export:

#vi a.sh
#!/bin/bash A=aaaa echo "in a.sh---"$A sh b.sh

#vi b.sh
#!/bin/bash
echo "in b.sh---"$A

上面的意思:我們在 a.sh 定義了一個變量 A ,并且打印 A,執(zhí)行 b.sh;在 b.sh 里面是打印變量 A 的值 ,我們先把 a.sh 和 b.sh 賦予可執(zhí)行權(quán)限,再分別執(zhí)行下,看能不能得到正確結(jié)果:

# chmod +x a.sh b.sh

# ./a.sh   ## b.sh 沒有結(jié)果
in a.sh---aaaa
in b.sh---

# ./b.sh   ## b.sh 沒有結(jié)果
in b.sh---

# echo $A  ## 沒有結(jié)果

這是為什么呢?我們畫個簡單的圖來理解一下:我們登錄會話有一個進(jìn)程,里面我們?nèi)フ{(diào)用個 a.sh 子進(jìn)程,a.sh 進(jìn)程里面去調(diào)用個 b.sh 子進(jìn)程,這三個進(jìn)程內(nèi)的變量是不共用的,所以,我們在 登錄會話中直接

打印 $A 的值,是不會出現(xiàn)的;同樣的,我們在 b.sh 里面想去 echo $A 也是無法打印出來的

那么,怎么才能解決呢?答案是把 A 這個變量作為全局變量就 ok ,那么在當(dāng)前進(jìn)程 ,以及其子進(jìn)程 ,就能用這個變量了,

#vi a.sh
#!/bin/bash
exoprt A=aaaa
echo "in a.sh---"$A
sh b.sh

b.sh 就不用管,我們再打印下:這里可以發(fā)現(xiàn),b.sh 已經(jīng)取到了 a.sh 內(nèi)的變量

# ./a.sh 
in a.sh---aaaa
in b.sh---aaaa

另一種方式:source

#!/bin/bash
A=aaaa
echo "in a.sh---"$A
source /root/b.sh  ##這里改成 b.sh 的絕對路徑

看一下,a.sh 的結(jié)果:之前我們改過 /etc/profile 里面的環(huán)境變量 ,我們要 source 一下 profile ,source 是干嘛的?source 的功能在調(diào)用腳本,可以將 b.sh 在 a.sh 的進(jìn)程空間內(nèi)運行,而不是另外開一個進(jìn)程

# ./a.sh 
in a.sh---aaaa
in b.sh---aaaa

另一種方式:用 '.' 代表source ,后面的 '.' 代表本地,可以改成:. /root/b.sh

#!/bin/bash
A=aaaa
echo "in a.sh---"$A
. ./b.sh

結(jié)果:

# ./a.sh 
in a.sh---aaaa
in b.sh---aaaa

總結(jié):

a.sh 中直接調(diào)用 b.sh ,會讓 b.sh 在 a 所在的 bash 進(jìn)程的“子進(jìn)程”空間中執(zhí)行;
而子進(jìn)程空間只能訪問父進(jìn)程中用 export 定義的變量;
一個 shell 進(jìn)程無法將自己定義的變量提升到父進(jìn)程空間中去;
"."號執(zhí)行腳本時,會讓腳本在調(diào)用者所在的 shell 進(jìn)程空間中執(zhí)行

  3、反引號賦值

A=`ls -la`  ## 反引號,運行里面的命令,并將結(jié)果返回給變量 A(在esc下面那個鍵,在英文狀態(tài)下輸入)

A=$(ls -la)  ## 等價于反引號

# a=`ls -la`
# echo $a
total 844 drwxr-xr-x 2 root root 4096 Jan 3 20:51 . drwxr-xr-x 9 root root 4096 Jan 3 14:37 .. -rw-r--r-- 1 root root 28857 Nov 9 19:09 bootstrap.jar -rw-r--r-- 1 root root 14867 Nov 9 19:09 catalina.bat -rwxr-xr-x 1 root root 22785 Jan 3 20:51 catalina.sh -rw-r--r-- 1 root root 1647 Nov 9 19:09 catalina-tasks.xml -rw-r--r-- 1 root root 25145 Nov 9 19:09 commons-daemon.jar -rw-r--r-- 1 root root 207125 Nov 9 19:09 commons-daemon-native.tar.gz -rw-r--r-- 1 root root 2040 Nov 9 19:09 configtest.bat -rwxr-xr-x 1 root root 1922 Nov 9 19:09 configtest.sh -rwxr-xr-x 1 root root 8508 Nov 9 19:09 daemon.sh -rw-r--r-- 1 root root 2091 Nov 9 19:09 digest.bat -rwxr-xr-x 1 root root 1965 Nov 9 19:09 digest.sh -rw-r--r-- 1 root root 3460 Nov 9 19:09 setclasspath.bat -rwxr-xr-x 1 root root 3680 Nov 9 19:09 setclasspath.sh -rw-r--r-- 1 root root 2020 Nov 9 19:09 shutdown.bat -rwxr-xr-x 1 root root 1902 Nov 9 19:09 shutdown.sh -rw-r--r-- 1 root root 2022 Nov 9 19:09 startup.bat -rwxr-xr-x 1 root root 1904 Nov 9 19:09 startup.sh -rw-r--r-- 1 root root 45466 Nov 9 19:09 tomcat-juli.jar -rw-r--r-- 1 root root 411789 Nov 9 19:09 tomcat-native.tar.gz -rw-r--r-- 1 root root 4550 Nov 9 19:09 tool-wrapper.bat -rwxr-xr-x 1 root root 5458 Nov 9 19:09 tool-wrapper.sh -rw-r--r-- 1 root root 2026 Nov 9 19:09 version.bat -rwxr-xr-x 1 root root 1908 Nov 9 19:09 version.sh

# a=`date +%Y-%m-%d`
# echo $a
2019-01-03

  4、特殊變量

$?  ## 表示上一個命令退出的狀態(tài)

$$  ## 表示當(dāng)前進(jìn)程編號

$0  ##表示當(dāng)前腳本名稱

$n  ##表示 n 位置的輸入?yún)?shù)( n 代表數(shù)字,n >= 1)-----相當(dāng)于傳參

$#  ##表示參數(shù)的個數(shù),常用于循環(huán)

$* 和 $@  ##都表示參數(shù)列表

注:$* 和 $@ 的區(qū)別:

  $* 和 $@ 都表示傳遞給函數(shù)或腳本的所有參數(shù)

不被雙引號 " " 包含時

  $* 和 $@ 都以 $1 $2……$n 的形式組成參數(shù)列表

當(dāng)它們被雙引號 " " 包含時

  "$*" 會將所有的參數(shù)作為一個整體,以"$1 $2 …… $n" 的形式輸出所有參數(shù);

  "$@" 會將各個參數(shù)分開,以 "$1" "$2"……"$n" 的形式輸出所有參數(shù)

# echo $$
14689
# echo $?
0

編輯 a.sh
#vi a.sh
#!/bin/bash
echo they are:
echo $1 $2 $3
結(jié)果:
# sh a.sh
they are:

#我們輸入?yún)?shù)看看:
# sh a.sh liuyifei yangyin reba
they are:
liuyifei yangyin reba

三、運算符

一、算數(shù)運算

  1、用 expr

格式: expr m + n 或 $((m+n)) 注意 expr 運算符間要有空格

例如:計算 (2+3)*4 的值

1、分步計算

  S=`expr 2 + 3`  ## expr是接收運算符用的 ,` 是取出表達(dá)式的運算結(jié)果

  expr $S * 4  ## * 號需要轉(zhuǎn)義

2、一步計算完成

  expr `expr 2 + 3` * 4

  echo `expr \`expr 2 + 3\` * 4`

#分步計算
# S=`expr 2 + 3`
# expr $S * 4
20

#一步計算完成
# expr `expr 2 + 3` * 4
20

# echo `expr \`expr 2 + 3\` * 4`
20

  2、用(())——要取出運算結(jié)果

要取值需加 $ 符號,否則會報錯;運算符間無需加空格

# a=$((1+2))
# echo $a
3

# a=$(((2+3)*4))
# echo $a
20

# count=1
# ((count++))
# echo $count
2

  

  3、用[]

# a=$[1+2]
# echo $a
3

四、流程控制

if 語法

1、語法格式

  if [ condition A ]

  then

    [結(jié)果A]

  elif [ condition B ]

    then [結(jié)果 B]

  else

    [結(jié)果 C ]

  fi

2、實例

#vi hello.sh  ## 編輯腳本

#!/bin/bash
read -p "Please input yourname :" NAME  ## 讀取從控制臺輸入的變量,存為參數(shù) NAME

if [ $NAME = root ]    ## 注意,這里的[]是有空格的,[]是命令,命令之間,就有空格
        then
                echo "Hello ${NAME}, welcome !"
        elif [ $NAME = gzw ]
                then
                        echo "Hello ${NAME}, welcome !"
        else
                echo "DSB,get out !"
fi

#輸入值為 gzw
# sh ./hello.sh 
Please input yourname :gzw
Hello gzw, welcome !

#輸入值為 root # sh ./hello.sh Please input yourname :root Hello root, welcome !

#輸入值為 特殊值 # sh ./hello.sh Please input yourname :hhh DSB,get out !

3、判斷條件

  1、判斷條件基本語法

  [ condition ]  ## 注意,條件的前后,是有空格的  

  # 條件非空,返回 true ,可用 $? 驗證 (0 為 true ,> 1 為 false)

  [ itcast ]

  # 空返回 false

#vi if.sh

#!/bin/bash
if [ a=b ]  ##等號左右沒有加空格,就不會作為判斷,而作為一個字符串,[]內(nèi)字符為非空,就為 true 的結(jié)果
        then
                echo ok
        else
                echo notok
fi

結(jié)果:
# sh ./if.sh 
ok

#!/bin/bash 
if [ a = b ]  ##等號左右有加空格,會作為判斷,等號會變成命令,因為隔開了
        then
                echo ok
        else
                echo notok
fi

結(jié)果:
# sh ./if.sh 
notok

#!/bin/bash 
if [  ]  ##左右只有倆空格,沒有任何東西,或者里面只有三空格,會執(zhí)行 false
        then
                echo ok
        else
                echo notok
fi

結(jié)果:
# sh ./if.sh 
notok

  2、條件判斷組合

  [ condition ] && echo ok || echo notok  ## condition 成立 ,執(zhí)行 echo ok ,不成立執(zhí)行 echo notok ,可以理解為三元運算符

    條件滿足,執(zhí)行后面的 && ,不滿足執(zhí)行 ||

  注意:[ ] 和 [[ ]] 的區(qū)別:[[ ]] 中邏輯組合可以使用 && || 符號

  而 [ ] 里面邏輯組合可以用 -a -o ## -a 是and關(guān)系,or 是或的關(guān)系

#vi if2.sh

#!/bin/bash
if [ a = b && b = c ]
        then
                echo ok
        else
                echo notok
fi

結(jié)果:
# sh ./if2.sh 
./if2.sh: line 2: [: missing `]'
notok


#!/bin/bash
if [[ a = b && b = c ]]  ##這里是 倆 [[ ]] ,單括號不支持與或非符號的
then
echo ok
else
echo notok
fi
結(jié)果:
# sh ./if2.sh
notok

#!/bin/bash
if [ a = b -a b = c ]
then
echo ok
else
echo notok
fi
結(jié)果:
# sh ./if2.sh
notok

#!/bin/bash
if [ a = b -o b = b ]
then
echo ok
else
echo notok
fi
結(jié)果:
# sh ./if2.sh
ok

  3、常用判斷運算符

  字符串比較: =   !=  -z  -n  (=就是相等;!=就是不相等;-z是指字符串長度為0,返回 true;-n是字符串長度不為0,返回 true)

  整數(shù)比較:

  -lt  小于
  -le  小于等于
  -eq  等于
  -gt  大于
  -ge  大于等于
  -ne  不等于

  文件判斷:

  -d 是否為目錄
  -f   是否為文件
  -e  是否存在

while 語法

1、方式1

  while expression

  do

  command

  ...

  done

2、方式2

  i=1

  while ((i<=3))

  do

    echo $i

    let i++

  done

cese 語法

  case $1 in

  start)

    echo "starting"

    ;;

  stop)

    echo "stoping"

    ;;

  *)

    echo "Usage:{start|stop}"

  esac

for 語法

1、方式1
  for N in 1 2 3
  do
    echo $N
  done
  或者
  for N in 1 2 3;do echo $N;done
  或者
  for N in {1..3};do echo $N;done

2、方式2
  for ((i = 0;i <= 5;i++))
  do
    echo "welcome $i times"
  done
  或者
  for ((i = 0;i <= 5;i++));doecho "welcome $i times"; done

五、函數(shù)使用

1、函數(shù)定義

#!/bin/sh
# func1.sh
hello()
{
        echo "Hello there today's date is `date +%Y-%m-%d`"
        # return 2
}
hello
# echo $?
echo "now going to the function hello"
echo "back from the function"

執(zhí)行結(jié)果:
# sh ./func1.sh 
Hello there today's date is 2019-01-06
now going to the function hello
back from the function

函數(shù)調(diào)用:

fuction hello() 或者 function hello 或者 hello

注意:

必須在調(diào)用函數(shù)之前,先聲明函數(shù),shell 腳本是逐行運行。不會像其他語言一樣預(yù)先編譯
函數(shù)返回值,只能通過 $? 系統(tǒng)變量或的,可以顯示加 : return 返回,如果不加,將以最后一條命令運行結(jié)果,作為返回值。 return 后跟數(shù)值 n(0-255)

腳本調(diào)試:(基本不用)

sh -vx helloWorld.sh 或者在腳本中增加 set -x

2、函數(shù)參數(shù)

#!/bin/bash
#func2.sh
funcWithParam(){
        echo "第一個參數(shù)為 $1 !"
        echo "第二個參數(shù)為 $2 !"
        echo "第十個參數(shù)為 $10 !"
        echo "第十個參數(shù)為 ${10} !"
        echo "第十一個參數(shù)為 ${11} !"
        echo "參數(shù)總數(shù)有 $# 個 !"
        echo "作為一個字符串輸出所有參數(shù) $* !"
}
funcWithParam 1 2 3 4 5 6 7 8 9 34 73


執(zhí)行結(jié)果:
# sh ./func2.sh 
第一個參數(shù)為 1 !
第二個參數(shù)為 2 !
第十個參數(shù)為 10 !
第十個參數(shù)為 34 !
第十一個參數(shù)為 73 !
參數(shù)總數(shù)有 11 個 !
作為一個字符串輸出所有參數(shù) 1 2 3 4 5 6 7 8 9 34 73 !

注意:$10 不能獲取第 10 個參數(shù),獲取第 10 個參數(shù)需要 ${10} 。當(dāng) n >= 10 時,需要使用 ${n} 來獲取參數(shù)。

3、函數(shù)返回值

#!/bin/bash
#func3.sh
funcWithReturn(){
        echo "這個函數(shù)會對輸入的兩個數(shù)字進(jìn)行相加運算..."
        echo "輸入第一個數(shù)字:"
        read aNum
        echo "輸入第二個數(shù)字:"
        read anotherNum
        echo "兩個數(shù)字分別為 $aNum 和 $anotherNum !"
        return $(($aNum+$anotherNum))
}
funcWithReturn
echo "輸入的兩個數(shù)字之和為:$? !"


結(jié)果:

# sh ./func3.sh 
這個函數(shù)會對輸入的兩個數(shù)字進(jìn)行相加運算...
輸入第一個數(shù)字:
8 
輸入第二個數(shù)字:
5
兩個數(shù)字分別為 8 和 5 !
輸入的兩個數(shù)字之和為:13 !

返回值的范圍是 0-255之間

4、跨腳本調(diào)用函數(shù)

  假如上述腳本的文件 fun2.sh 保存在路徑:/root/fun2.sh

  則可在腳本 fun_other.sh 中調(diào)用腳本 fun_other 中的函數(shù)

#!/bin/bash
#func_other.sh
. /root/func2.sh        ##注:. 和 / 之間要有空格  為啥要有空格?因為 /root/func2.sh 是在一個子進(jìn)程內(nèi)加載,而我的當(dāng)前進(jìn)程腳本進(jìn)程沒有那個函數(shù),所以要 source 一下,或者 . 一下
#或者 source /root/func2.sh
funcWithParam 11 22 33 44 55 66 77 88 99 100 101


結(jié)果:
# sh ./func_other.sh
第一個參數(shù)為 11 !
第二個參數(shù)為 22 !
第十個參數(shù)為 110 !
第十個參數(shù)為 100 !
第十一個參數(shù)為 101 !
參數(shù)總數(shù)有 11 個 !
作為一個字符串輸出所有參數(shù) 11 22 33 44 55 66 77 88 99 100 101 !

shell 編程綜合練習(xí)

  自動化軟件部署腳本

一、需求

  1、描述:公司內(nèi)部有一 N 個節(jié)點集群,需要統(tǒng)一安裝一些軟件,例如;jdk,開發(fā)一個腳本,實現(xiàn)對局域網(wǎng)中的 N 臺節(jié)點批量自動下載,并且安裝 jdk

思路

  1、編寫一個啟動腳本,用來發(fā)送一個軟件安裝腳本到每一臺機(jī)器

  2、然后啟動每臺機(jī)器上的軟件安裝腳本來執(zhí)行軟件下載和安裝

具體實現(xiàn)方式:我們可以用一臺服務(wù)器配置成基服務(wù)器,上面搭建好一個 web 容器,比如 apache ,把 jdk 的包放在 var/www/html/software 下面,總之是個路徑,讓其他的服務(wù)器能夠通過一個網(wǎng)頁打開的方式,獲取到這個 jdk 的安裝包,而不是全部去 wget 下載,這樣太慢了。

  那么,我們可以寫兩個腳本 ,第一個腳本是 bootstrap.sh 作用是將第二個 install.sh 發(fā)送到每一個節(jié)點上。真正的安裝軟件的過程,是在 install.sh 上面。這樣,每一臺都有自己的 install.sh 。install.sh 內(nèi)寫啥呢?先從基服務(wù)器上下載安裝包,下載后解壓,解壓后配置環(huán)境變量

  

  細(xì)節(jié):那么我們公共服務(wù)器怎么將 install.sh 發(fā)送到各節(jié)點呢?用 scp install.sh node :/root 做循環(huán),但是要 scp 就要配置免密登錄,否則就得驗證指紋啥的,腳本太復(fù)雜了。我們看免密登錄怎么弄?人機(jī)交互expect 可以解決

expect的使用

  痛點:使用 scp 命令遠(yuǎn)程拷貝文件時,會有人機(jī)交互的過程,如何讓腳本完成人機(jī)交互?

  妙藥: expect

  用法實例:

    先觀察 ssh localhost 的過程

    再看 expect 的功能

# vi exp_test.sh

#!/bin/bash/expect ## exp_test.sh set timeout -1; spawn ssh localhost; expect { "(yes/no)" {send "yes";exp_continue;} "password:" {send "123456";exp_continue;} eof {exit 0;} }

執(zhí)行:  expect -f exp_test.sh

腳本搞好了之后,可以在 /etc/hosts 內(nèi),以 ip 子機(jī)名 的形式 ,搞好 hosts 文件,ping 一下看是否可以 ping 通,可以寫進(jìn) boot.sh 的 SERVERS 內(nèi)

三、腳本開發(fā)

1、vi boot.sh

SERVERS="gzw1 gzw2"   #要安裝的服務(wù)器名稱
PASSWORD=123456         #服務(wù)器上的password
BASE_SERVER=47.107.183.88            #公共服務(wù)器的 ip

## 實現(xiàn)免密登錄配置的函數(shù)
auto_ssh_copy_id(){
        expect -c"set timeout -1;
                spawn ssh-copy-id $1;
                expect {
                        *(yes/no)*{send --yes;exp_continue;}
                        *assword:*{send --$2;exp_continue;}
                        eof     {exit0;}
                }";
}

ssh_copy_id_to_all(){
        for SERVER in $SERVERS
        do
                auto_ssh_copy_id $SERVER $PASSWORD
        done
}

## 調(diào)用免密登錄配置函數(shù),實現(xiàn)母機(jī)到個子機(jī)的免密登陸配置

ssh_copy_id_to_all

##完成分發(fā) install.sh 到各子機(jī)的操作
##并讓子機(jī)啟動 install.sh

for SERVER in $SERVERS
do
        scp insatll.sh root@$SERVER:/root
        ssh root@$SERVER /root/install.sh  ##一臺機(jī)器,執(zhí)行另一臺機(jī)器的 install.sh
done

2、安裝執(zhí)行腳本

vi install.sh

#!/bin/bash

BASE_SERVER=47.107.183.88  ##母機(jī)的 ip

## 為本機(jī)安裝 wget 命令
yum install -y wget

## 使用 wget 從母機(jī)的 web 服務(wù)器上下載 jdk 壓縮包
wget $BASE_SERVER/software/jdk-XXX

## 將下載的壓縮包解壓到一個相同路徑下
tar -zxvf jdk-XXX -C /usr/local

## 修改 profile 配置文件 
cat >> /etc/profile << EOF  ##往 /etc/profile 內(nèi)追加兩行,如果修改很復(fù)雜,就要用 awk ,這里,cat 將 EOF 之間的內(nèi)容重定向到 /etc/profile 內(nèi)
export JAVA_HOME=/usr/local/jdk-XXX
export PATH=$PATH:$JAVA_HOME/bin
EOF

最后,在母機(jī)上 運行 boot.sh 就 ok

總結(jié)

以上是生活随笔為你收集整理的Linux命令的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。