首頁 > 軟體

Linux Shell 認識與學習

2020-06-16 17:50:23

Linux的終端機執行命令的方式,是通過bash環境來處理的。bash包括變數的設定與使用,、bash操作環境的構建、資料流重定向的功能。下面的知識,對主機的維護與管理有重要的幫助。

管理整個計算機硬體的其實是作業系統的核心,這個核心被保護,一般使用者只能通過shell來和核心通訊(shell將輸入的命令與核心通訊,核心可以控制硬體來正確無誤地工作)。man、chmod、chown、vi、mkfs等命令,都是獨立的應用程式,我們可以通過shell(即命令列模式)來操作這些應用程式,讓這些應用程式呼叫核心來執行所需的工作。

bash shell 的內建命令:type

type命令找出可執行檔案,而不是一般檔名。
linuxidc@Ubuntu:~/Desktop/linux_study$ type ls  # 未加任何引數的時候,列出ls的最主要使用情況
ls is aliased to `ls --color=auto'
linuxidc@ubuntu:~/Desktop/linux_study$ type -t ls # 新增引數-t列出ls執行時的依據
alias
linuxidc@ubuntu:~/Desktop/linux_study$ type -a ls # 新增引數-a會從PATH變數定義中,將所有含有 ls 的命令都列出來,包含alias
ls is aliased to `ls --color=auto'
ls is /bin/ls
linuxidc@ubuntu:~/Desktop/linux_study$ type cd
cd is a shell builtin                            # cd是shell內建命令

命令的執行

很多時候輸入命令過長,會在換行之前加入,這樣做的目的是為了將換行符[enter]轉移過來。成功轉移過後,下一行最前面就會出現>的符號,可以繼續輸入命令。

shell 變數功能

變數就是用一個特定字串代表不固定的內容。在linux中要將變數的內容顯示出來,可以使用echo這個命令來顯示變數,但是變數在被顯示時,必須加上$.
linuxidc@ubuntu:~/Desktop/linux_study$ echo $variable

linuxidc@ubuntu:~/Desktop/linux_study$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

設定變數
linuxidc@ubuntu:~/Desktop/linux_study$ echo $myname

linuxidc@ubuntu:~/Desktop/linux_study$ myname=flora
linuxidc@ubuntu:~/Desktop/linux_study$ echo $myname
flora

保留原先變數,然後進行設定
linuxidc@ubuntu:~/Desktop/linux_study$ myname="$myname lin"
linuxidc@ubuntu:~/Desktop/linux_study$ echo $myname
flora lin

在執行過程中, 反單引號(`) ,之內的命令會被先執行,而執行出來的結果將作為外部的輸入資訊。locate命令可以列出所有的相關檔名,但是如果我們想知道每個crontab相關檔名的許可權:
linuxidc@ubuntu:~/Desktop/linux_study$ ls -l `locate crontab`
-rw-r--r-- 1 root root      401 Feb 19  2014 /etc/anacrontab
-rw-r--r-- 1 root root      722 Feb  8  2013 /etc/crontab
-rwxr-sr-x 1 root crontab 34824 Feb  8  2013 /usr/bin/crontab
-rw-r--r-- 1 root root    1184 Apr  7  2014 /usr/share/bash-completion/completions/crontab
-rw-r--r-- 1 root root    27684 Feb  8  2013 /usr/share/doc/cron/examples/crontab2english.pl
-rw-r--r-- 1 root root    2521 Feb  8  2013 /usr/share/man/man1/crontab.1.gz
-rw-r--r-- 1 root root      892 Feb 19  2014 /usr/share/man/man5/anacrontab.5.gz
-rw-r--r-- 1 root root    5687 Feb  8  2013 /usr/share/man/man5/crontab.5.gz

先以locate將檔名資料列出來,然後使用ls命令來處理。

環境變數的功能

環境變數能夠幫我們達到很多功能,包括主資料夾的變換,提示符的顯示,執行檔案查詢的路徑等。

檢視預設的環境變數:
linuxidc@ubuntu:~/Desktop/linux_study$ env
#......
_=/usr/bin/env                # 上一次使用的命令的最後一個引數(或命令本身)

亂數

RANDOM變數的內容介於0~32767之間,所以要進行數值計算才能獲取一個一位數。
linuxidc@ubuntu:~/Desktop/linux_study$ declare -i number=$RANDOM*10/32768;echo $number
1
linuxidc@ubuntu:~/Desktop/linux_study$ declare -i number=$RANDOM*10/32768;echo $number
4
linuxidc@ubuntu:~/Desktop/linux_study$ declare -i number=$RANDOM*10/32768;echo $number
5

set檢視所有變數(含環境變數與自定義變數)

bash不只有環境變數,還有一些比較重要的引數,以及使用者自己定義的變數。
linuxidc@ubuntu:~/Desktop/linux_study$ set

PS1命令提示字元

每當我們按下確認鍵去執行某個命令後,最後要再次出現提示符,會去主動讀取這個變數值。
linuxidc@ubuntu:~/Desktop/linux_study$ cd /home
linuxidc@ubuntu:/home$ PS1='[u@h w A ##]$'
[linuxidc@ubuntu /home 08:48 #46]$ls
linuxidc
[linuxidc@ubuntu /home 08:51 #47]$

w 代表完整的工作目錄名稱,由更目錄寫起來的目錄名稱。但是主資料夾將會用~替代。

A 顯示時間,二十四小時格式“HH:MM”。

# 執行第幾個命令。

$ 提示符,如果是root時,提示符為#,否則為$。

變數鍵盤讀取、陣列與宣告:read、array、declare

read讀取來自鍵盤輸入的變數
[linuxidc@ubuntu /home 09:12 #54]$read atest
This is a test
[linuxidc@ubuntu /home 09:12 #55]$read -p "Please keyin your name: " -t 30 named
Please keyin your name: linuxidc
[linuxidc@ubuntu /home 09:13 #56]$echo $named
linuxidc

30秒沒有任何操作時,該命令會自動略過。

declare或typeset,宣告變數的型別

如果使用declare後面沒有接任何引數,bash就會主動將變數名稱數出來。
[linuxidc@ubuntu /home 09:21 #59]$sum=100+300+50
[linuxidc@ubuntu /home 09:22 #60]$declare -i sum=100+300+50
[linuxidc@ubuntu /home 09:22 #61]$echo $sum
450

變數型別預設為字串,所以不能制定變數型別,則1+2為一個字串而不是計算式,因此執行第一條命令會直接輸出100+300+50.。

將sum變成環境變數:
[linuxidc@ubuntu /home 09:13 #57]$declare -x sum
[linuxidc@ubuntu /home 09:21 #58]$export | grep sum
declare -x sum

將sum變成唯讀屬性,不可修改:
[linuxidc@ubuntu /home 09:25 #62]$declare -r sum
[linuxidc@ubuntu /home 09:29 #63]$sum=testgting
bash: sum: readonly variable

讓sum變成非環境變數的自定義變數:
[linuxidc@ubuntu /home 09:29 #64]$declare +x sum
[linuxidc@ubuntu /home 09:30 #65]$declare -p sum
declare -ir sum="450"

陣列變數型別
[linuxidc@ubuntu /home 09:30 #66]$var[1]="small min"
[linuxidc@ubuntu /home 09:32 #67]$var[2]="big min"
[linuxidc@ubuntu /home 09:32 #68]$var[3]="nice min"
[linuxidc@ubuntu /home 09:32 #69]$echo "${var[1]},${var[2]},${var[3]}"
small min,big min,nice min

與檔案系統及程式的限制關係ulimit

列出你目前身份的所有限制資料數值:
[linuxidc@ubuntu /home 09:33 #70]$ulimit -a

限制使用者僅能建立10MB一下的容量檔案:
[linuxidc@ubuntu /home 09:38 #74]$ulimit -f 10240
[linuxidc@ubuntu /home 09:38 #75]$ulimit -a

嘗試建立20M的檔案:
[linuxidc@ubuntu ~/Desktop/linux_study 09:41 #81]$sudo dd if=~/Desktop/linux_study/ of=123 bs=1M count=20

 [linuxidc@ubuntu ~/Desktop/linux_study 09:41 #82]$ll
 total 8
 drwxrwxr-x 2 linuxidc linuxidc 4096 Oct 30 09:41 ./
 drwxr-xr-x 3 linuxidc linuxidc 4096 Oct 30 07:43 ../
 -rw-r--r-- 1 root    root        0 Oct 30 09:41 123

變數內容的刪除、替換與替代

變數內容的刪除與替換

將local這兩個目錄刪除掉:
[linuxidc@ubuntu ~/Desktop/linux_study 09:47 #85]$echo $path
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
  [linuxidc@ubuntu ~/Desktop/linux_study 09:49 #89]$echo ${path#/*local/bin:}
  /usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

將sbin替換為SBIN:
linuxidc@ubuntu ~/Desktop/linux_study 13:06 #95]$echo ${path/sbin/SBIN}
/usr/local/SBIN:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
[linuxidc@ubuntu ~/Desktop/linux_study 13:06 #96]$echo ${path//sbin/SBIN}
/usr/local/SBIN:/usr/local/bin:/usr/SBIN:/usr/bin:/SBIN:/bin:/usr/games:/usr/local/games

變數的測試與內容替換:
[linuxidc@ubuntu ~/Desktop/linux_study 13:07 #97]$echo $username
  # username可能不存在或者為空字串
[linuxidc@ubuntu ~/Desktop/linux_study 13:09 #98]$username=${username-root}
[linuxidc@ubuntu ~/Desktop/linux_study 13:10 #99]$echo $username
root                                              # 沒有設定,所以主動給予名為root的內容
[linuxidc@ubuntu ~/Desktop/linux_study 13:10 #100]$username="linuxidc"
[linuxidc@ubuntu ~/Desktop/linux_study 13:10 #101]$username=${username-root}
[linuxidc@ubuntu ~/Desktop/linux_study 13:10 #102]$echo $username
linuxidc


username-root 就得變數,被測試的選項 ; username- root 變數的內容,在本範例中,這個部分是在給予未設定變數的內容。當然 username:-root則是在變數內容為空或者是未設定,都能夠以後面的內容替換。

如果舊變數不存在,我們就以新變數內容替換;但是若舊變數存在,則新變數內容以舊變數替換。
[linuxidc@ubuntu ~/Desktop/linux_study 13:10 #103]$unset str; var=${str-newvar}
[linuxidc@ubuntu ~/Desktop/linux_study 13:18 #104]$echo var="$var",str="$str"
var=newvar,str=                                        # 因為str不存在,所以var為newvar
[linuxidc@ubuntu ~/Desktop/linux_study 13:19 #105]$str="oldvar";var=${str-newvar}
[linuxidc@ubuntu ~/Desktop/linux_study 13:20 #106]$echo var="$var",str="$str"
var=oldvar,str=oldvar                                    # 因為str存在,所以var等於str的內容

關於減號是不會影響舊變數的,如果想要舊變數內容也一起替換掉的話,就需要使用等號=:
[linuxidc@ubuntu ~/Desktop/linux_study 13:20 #107]$unset str; var=${str=newvar}
[linuxidc@ubuntu ~/Desktop/linux_study 13:25 #108]$echo var="$var",str="$str"
var=newvar,str=newvar
[linuxidc@ubuntu ~/Desktop/linux_study 13:25 #111]$str="oldvar";var=${str=newvar}
[linuxidc@ubuntu ~/Desktop/linux_study 13:25 #112]$echo var="$var",str="$str"
var=oldvar,str=oldvar

命令別名和歷史命令

命令別名設定alias和unalias

命令別名可以使常用的但是特別長的???令修改成比較簡潔的命令,還有增設預設的選項在一些慣用的命令上面,可以預防一些不小心誤刪檔案的情況發生。例如,查詢隱藏檔案,並且需要長的列出與一頁一頁翻看,那麼需要執行“ls -l | more”,可以使用以下命令將其簡化為lm:
[linuxidc@ubuntu ~ 13:35 #120]$alias lm="ls -l | more"

另外,命名別名的設定還可以替代既有的命令,例如,當以root登入,使用rm命令可以刪除所有檔案,因此要特別小心,rm提供一個引數讓我們確認是否刪除該檔案-i:
[linuxidc@ubuntu ~ 13:35 #123]$alias rm="rm -i"
[linuxidc@ubuntu ~/Desktop/linux_study 13:39 #127]$rm 123
rm: remove write-protected regular empty file ‘123’? y

去掉剛才的命名別名:
[linuxidc@ubuntu ~/Desktop/linux_study 13:39 #128]$unalias rm

歷史命令 history

查詢曾經執行過的命令,最近4條:
[linuxidc@ubuntu ~/Desktop/linux_study 13:42 #131]$history 4

Bash Shell的操作環境

路徑與命令查詢順序

設定echo的別名為echo-n,然後再檢視echo執行的順序:
[linuxidc@ubuntu ~/Desktop/linux_study 13:45 #132]$alias echo="echo -n"
[linuxidc@ubuntu ~/Desktop/linux_study 13:47 #134]$type -a echo
echo is aliased to `echo -n'
echo is a shell builtin
echo is /bin/echo

bash的登入與歡迎資訊:/etc/issue,/etc/motd

終端環境設定:stty.set

如何查閱目前的一些按鍵內容呢?可以利用stty(setting tty終端機),stty可以幫助設定終端機的輸入按鈕代表意義。我們可以利用stty-a來列出目前環境中的所有按鍵列表。
linuxidc@ubuntu:~$ stty -a
speed 38400 baud; rows 37; columns 80; line = 0;
intr = ^C; quit = ^; erase = ^?; kill = ^U; eof = ^D; eol = M-^?; eol2 = M-^?;
swtch = M-^?; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W;
lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 hupcl -cstopb cread -clocal -crtscts
-ignbrk brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff
-iuclc ixany imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke

如果想要stty進行相關的字元刪除:
linuxidc@ubuntu:~$ stty erase ^h

除了stty之外,其實我們bash還有自己的一些終端機設定值set。

Linux Shell指令碼 多執行緒  http://www.linuxidc.com/Linux/2015-10/123993.htm

Linux Shell在while中用read從鍵盤輸入  http://www.linuxidc.com/Linux/2015-06/118831.htm

Linux Shell 程式偵錯  http://www.linuxidc.com/Linux/2015-07/119880.htm

Linux Shell指令碼面試25問  http://www.linuxidc.com/Linux/2015-04/116474.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 

本文永久更新連結地址http://www.linuxidc.com/Linux/2015-11/124753.htm


IT145.com E-mail:sddin#qq.com