歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> SHELL編程

Linux下shell編程基礎知識

1、history    記錄歷史命令;
預設記錄1000條命令,存儲在用戶家目錄 .bash_history 文件中;
!!    執行上一條命令
!n    n為數字,history裡面顯示的指令數字
!cat    執行最近一次以cat開頭的命令
!$    上一條命令的最後一個參數

man builtin    可以查詢系統內置的所有命令;

2、指令和文件名補全
Tab鍵    連續按2次列出所有的指令或文件名;

3、別名alias
自定義別名,把很長的經常使用的命令別名一個簡單的命令
[root@linuxidc ~]# alias yong="cat /etc/sysconfig/network-scripts/ifcfg-eth0"
[root@linuxidc ~]# yong
DEVICE=eth0
HWADDR=00:0C:29:43:3D:32
TYPE=Ethernet
UUID=0b1f4512-cefa-4a9e-ae85-adb2ac2a9903
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=192.168.20.20
NETMASK=255.255.255.0
GATEWAY=192.168.20.2

unalias    解除別名
別名永久生效的話,把命令寫入到當前用戶家目錄 .bashrc裡面;只對當前用戶生效。


4、通配符
*    代表零個或多個任意字符
?    代表1個任意字符


5、輸入輸出重定向
輸出重定向 >
把前面的輸出不顯示在當前屏幕上,輸出到指定文件裡面;
追加重定向 >> 把內容追加到文件裡面;
輸入重定向 <    把後面的文件作為前面命令的輸入;
2>        錯誤重定向(寫腳本的時候會用到)
2>>    錯誤追加重定向
[root@localhost ~]# ls -l /dev/stdin 
lrwxrwxrwx. 1 root root 15 4月  6 11:04 /dev/stdin -> /proc/self/fd/0
[root@localhost ~]# ls -l /dev/stdout 
lrwxrwxrwx. 1 root root 15 4月  6 11:04 /dev/stdout -> /proc/self/fd/1
[root@localhost ~]# ls -l /dev/stderr 
lrwxrwxrwx. 1 root root 15 4月  6 11:04 /dev/stderr -> /proc/self/fd/2

標准輸入設備stdin用0表示;鍵盤;

標准輸出設備 stdout用1表示,顯示器顯示;
標准輸出錯誤 stderr用2表示,顯示器顯示;


示例:直接ls 會在當前屏幕顯示出來,正確和錯誤的信息;
[root@localhost ~]# ls /etc/passwd /etc/passwd1
ls: 無法訪問/etc/passwd1: 沒有那個文件或目錄
/etc/passwd
[root@localhost ~]# ls /etc/passwd /etc/passwd1 >1.log 2>&1
[root@localhost ~]# cat 1.log
 ls: 無法訪問/etc/passwd1: 沒有那個文件或目錄
 /etc/passwd

正確輸出1默認可以不用寫,直接重定向到1.log裡面,2代表錯誤輸出,重定向到&1代表前面的1.log;有時候也可以>>追加到日志;

 

[root@localhost ~]# ls /etc/passwd /etc/passwd1 
&>all.log
[root@localhost ~]# cat all.log 
ls: 無法訪問/etc/passwd1: 沒有那個文件或目錄
/etc/passwd

&表示所有,包括正確輸出1和錯誤輸出2,輸出重定向到all.log裡面;

 

6、管道符 |
把前面命令的輸出結果作為後面命令的輸入
[root@linuxidc ~]# cat /etc/passwd | wc -l
25

 

7、作業控制
當運行一個進程時,你可以使它暫停(按Ctrl+z),然後使用fg命令恢復它,利用bg命令使他到後台運行,你也可以使它終止(按Ctrl+c)
jobs    可以查看被暫停或在後台運行的任務
[root@linuxidc ~]# vmstat 1 > /tmp/1.log 
^Z
[1]-  Stopped                vi file
[2]+  Stopped                vmstat 1 > /tmp/1.log
[root@linuxidc ~]# jobs
[1]-  Stopped                vi file
[2]+  Stopped                vmstat 1 > /tmp/1.log
[root@linuxidc ~]# bg 2
[2]+ vmstat 1 > /tmp/1.log &
[root@linuxidc ~]# jobs
[1]+  Stopped                vi file
[2]-  Running                vmstat 1 > /tmp/1.log &

想要讓進程在後台運行的話加 &,中間有空格,進程就在後台運行了。

vmstat 1    用來觀察系統狀態的一個命令。
fg 2 讓後台運行的進程回到當前運行,ctrl+c 可以終止進程。
+號顯示的為優先級最高。


另一種情況,關閉當前shell,重新打開另一個shell,使用jobs並不會顯示在後台運行的進程。想要停止進程的話,需要知道pid,然後使用kill命令殺死進程。如遇到殺不死的進程,使用 kill -9 pid
[root@linuxidc ~]# ps aux | grep vmstat
root      1909  0.0  0.1  2016  548 pts/0    S    15:03  0:00 vmstat 1
root      1941  0.0  0.1  4356  732 pts/0    S+  15:08  0:00 grep vmstat
[root@linuxidc ~]# kill 1909

 

8、變量,就是使用一個較簡單的字符串來替代某些具有特殊意義的設定以及數據。

通常shell預設的變量名為大寫。可以使用echo查看變量;
常用變量有:PATH、HOME、LANG、PWD、LOGNAME、HOSTNAME
[root@linuxidc ~]# echo $PATH
/usr/lib/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@linuxidc ~]# echo $HOME
/root
[root@linuxidc ~]# echo $PWD
/root
[root@linuxidc ~]# echo $LOGNAME
root
[root@linuxidc ~]# echo $HOSTNAME
linuxidc.com

env  可以查看系統預設的所有環境變量;

set    可以列出系統預設的全部變量,包括用戶自己設定的變量;


自定義變量    變量名=變量內容   
自定義變量只在當前shell下生效;bash命令打開一個新的shell,變量就不會生效,退出新shell後,回到當前shell,變量繼續生效;
 [root@linuxidc ~]# ABC=CentOS
[root@linuxidc ~]# echo $ABC
centos
[root@linuxidc ~]# bash
[root@linuxidc ~]# echo $ABC
[root@linuxidc ~]# exit
exit
[root@linuxidc ~]# echo $ABC
centos

變量永久生效的方法:
1)系統下所有用戶登錄都可以使用該變量
在/etc/profile 配置文件中最後一行,添加"export myname=linuxidc",然後執行source /etc/profile 生效;source命令的作用是,將目前設定的配置刷新,即不用注銷再登錄也能生效。
[root@linuxidc ~]# echo "export myname=linuxidc" >> /etc/profile
[root@linuxidc ~]# source /etc/profile
[root@linuxidc ~]# su - user1
[user1@linuxidc ~]$ echo $myname 
linuxidc

 

2)只在當前用戶下使用變量
在用戶的家目錄下 .bashrc 配置文件,添加"export myname=linuxidc",然後執行source .bashrc 生效;
[user1@linuxidc ~]$ pwd/home/user1
[user1@linuxidc ~]$ echo "export myname=linuxidc" >> .bashrc
[user1@linuxidc ~]$ source .bashrc
[user1@linuxidc ~]$ echo $myname
linuxidc

自定義變量的規則
1、設定變量的格式“變量名=變量內容”等號兩邊不能有空格
2、變量名只能由英文、數字及下劃線組成,而且不能以數字開頭;
3、當變量內容帶有特殊字符(空格 $),需要加單引號;
[root@linuxidc ~]# ABC='linux centos'
[root@linuxidc ~]# echo $ABC
linux centos

如變量內容中本身有單引號,需要加雙引號;

[root@linuxidc ~]# ABC="Linux'"
[root@linuxidc ~]# echo $ABC
Linux'

4、如果變量內容需要引用其他運行結果,需要使用反引號

[root@linuxidc ~]# ABC=`pwd`
[root@linuxidc ~]# echo $ABC
/root

5、變量內容可以累加其他變量的內容,需要加雙引號。

[root@linuxidc ~]# AA="Angle"
[root@linuxidc ~]# echo $AA
Angle
[root@linuxidc ~]# AB="$AA"BB
[root@linuxidc ~]# echo $AB
AngleBB

 

單引號和雙引號的區別,用雙引號時不會取消掉裡面出現的特殊字符的本身作用(這裡的$),而使用單引號則裡面的特殊字符全部失去它本身的作用。

9、pstree    以樹狀圖顯示當前系統的進程
當前shell下運行bash命令後,會進入一個新的shell,新shell為之前shell的子shell;
[root@linuxidc ~]# pstree | grep bash
    |-login---bash
    |-sshd---sshd---bash-+-grep
[root@linuxidc ~]# bash
[root@linuxidc ~]# pstree | grep bash
    |-login---bash
    |-sshd---sshd---bash---bash-+-grep

 

在父shell中設定一個變量後,進入子shell後變量不會生效;需要在子shell中生效要用exprot指令;export 聲明全局變量,讓該shell的子shell也知道;如果export後面不加任何變量名,則它會聲明所有的變量。
[root@linuxidc ~]# echo $AA
Angle
[root@linuxidc ~]# bash
[root@linuxidc ~]# echo $AA
[root@linuxidc ~]# exit
exit
[root@linuxidc ~]# export AA
[root@linuxidc ~]# bash
[root@linuxidc ~]# echo $AA
Angle

 

10、取消變量    unset 變量名
[root@linuxidc ~]# AB="Angle BB"
[root@linuxidc ~]# echo $AB
Angle BB
[root@linuxidc ~]# unset AB
[root@linuxidc ~]# echo $AB

系統環境變量與個人環境變量的配置文件
/etc/profile  系統預設的幾個重要的變量,例如PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL
/etc/bashrc    預設umask以及PS1等變量。PS1就是我們登錄linux 命令行最前面顯示的字符;
\u  用戶users
\h  主機名hostname
\W  當前目錄pwd
\$  系統用戶為#,普通用戶顯示$


[root@linuxidc ~]# echo $PS1[\u@\h \W]\$
[root@localhost ~]# PS1='[\h@\u \W]\$'
[localhost@root ~]#

更改PS1的顯示;

每個用戶的主目錄下還有幾個這樣的隱藏文件:
.bash_profile :定義了用戶的個人化路徑與環境變量的文件名稱。每個用戶都可使用該文件輸入專用於自己使用的shell信息,當用戶登錄時,該文件僅僅執行一次。
.bashrc :該文件包含專用於你的shell的bash信息,當登錄時以及每次打開新的shell時,該該文件被讀取。例如你可以將用戶自定義的alias或者自定義變量寫到這個文件中。
.bash_history :記錄命令歷史用的。
.bash_logout :當退出shell時,會執行該文件。可以把一些清理的工作放到這個文件中。


Linux shell中的特殊字符
*    代表零個或多個任意字符
?    代表一個任意字符
#    代表注釋說明的��思,#號後面的內容忽略掉;
\    脫意字符,將後面的特殊字符(* $)還原為普通字符;
|    管道符,講前面命令執行的結果作為後面命令的輸入;
$    引用變量
;    分隔2個命令,2個命令都執行,不管前面命令是否錯誤 ls a.txt ; cat a.txt
&    把命令放到後台運行
&&    命令的連接符,第一個執行成功才會執行第二個;
||    分隔命令,只有前面命令運行不成功,才會執行後面的命令;


cut    截取某一個字段、字符
-d    指定分隔符,分割字符用單引號 ' ' 括起來
-f    指定第哪個區間
-c    指定第幾個字符;指定多個字符 -c 1,5 ;可以指定一個區間 -c 1-4 ;


列出以:號分隔列出第7列的內容,只顯示前3行;
[root@localhost ~]# cut -d: -f 7 passwd | head -3 
/bin/bash
/sbin/nologin
/sbin/nologin
[root@linuxidc ~]# head -3 passwd |cut -c 1-4
root
bin:
daem

 

sort    排序輸出    默認按首字母升序的順序排列;
-t    指定分隔符
-k    指定以哪個區間進行排序
-r    逆序排列
-u    刪除重復的
-n    按照數字大小排序
-f    忽略大小寫
按:號分隔,按第3列uid排序;
[root@localhost ~]# sort -t: -n -k 3 passwd |head -3
root:x:0:0:root:/root:/bin/bash
ROOT:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

 

wc    統計行數、單詞數、字節數
wc -l      統計行數
wc -w    統計單詞數
wc -c    統計字符數(wc -m 一樣的功能)
[root@linuxidc ~]# wc -l /etc/passwd
24 /etc/passwd
[root@linuxidc ~]# wc -w /etc/passwd
32 /etc/passwd
[root@linuxidc ~]# wc -c /etc/passwd
1041 /etc/passwd
[root@linuxidc ~]# wc /etc/passwd
  24  32 1041 /etc/passwd

 

uniq    去除重復的行
針對數字的話,需要先進行sort排序,再去除重復的行。
-c    統計重復的行數,並寫在最前面;
[root@linuxidc tmp]# uniq 1.txt 
111
222
111
333
[root@linuxidc tmp]# sort 1.txt | uniq -c
      2 111
      1 222
      1 333
[root@linuxidc tmp]# sort test.txt |uniq -c
      2 12345     
      1 67899     
      2 abc     
      1 helloworld

 

tee    重定向文件,並且同時還在屏幕上顯示;
類似與重定向 “>”, 但是比重定向多了一個功能,在把文件寫入後面所跟的文件中的同時,還顯示在屏幕上。
12 [root@linuxidc ~]# echo 'abcdefg' | tee test.txt
abcdefg

tr    替換字符
常用來處理文檔中出現的特殊符號,如DOS文檔中出現的^M符號;
-d    刪除某個字符

把小寫字母變成大寫字母
123 [root@linuxidc ~]# head -2 passwd | tr '[a-z]' '[A-Z]'
ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH
BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN

替換一個字符
[root@linuxidc ~]# head -2 passwd | tr 'r' 'R'
Root:x:0:0:Root:/Root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

 split    切割文檔

-b    依據大小來分割文檔,單位為byte
-l    依據行數來分割文檔。

示例一,按b大小分割
[root@linuxidc ~]# ls -lb passwd
 -rw-r--r--. 1 root root 1076 Apr  9 15:14 passwd
[root@linuxidc ~]# split -b 500 passwd
[root@linuxidc ~]# ls -l
-rw-r--r--. 1 root root  500 Apr  9 15:17 xaa
-rw-r--r--. 1 root root  500 Apr  9 15:17 xab
-rw-r--r--. 1 root root  76 Apr  9 15:17 xac

示例二,按l行數分割

[root@linuxidc ~]# cat passwd |wc -l
24
[root@linuxidc ~]# split -l 8 passwd 
[root@linuxidc ~]# wc -l xa*
  8 xaa   
  8 xab   
  8 xac 
  24 total

cat命令利用Linux重定向合並文件 http://www.linuxidc.com/Linux/2015-01/112122.htm

Shell編程淺析 http://www.linuxidc.com/Linux/2014-08/105379.htm 

Linux Shell參數替換 http://www.linuxidc.com/Linux/2013-06/85356.htm

Shell for參數 http://www.linuxidc.com/Linux/2013-07/87335.htm

Linux/Unix Shell 參數傳遞到SQL腳本 http://www.linuxidc.com/Linux/2013-03/80568.htm

Shell腳本中參數傳遞方法介紹 http://www.linuxidc.com/Linux/2012-08/69155.htm

Shell腳本傳遞命令行參數 http://www.linuxidc.com/Linux/2012-01/52192.htm

Linux Shell 通配符、轉義字符、元字符、特殊字符 http://www.linuxidc.com/Linux/2014-10/108111.htm 

Copyright © Linux教程網 All Rights Reserved