2012/08/26

Linux - Bash Shell


bash shell快捷命令

shell的種類

  • 一般常見的shell有底下這幾種,只要在命令列下指令即可改變你的shell。
  1. The Bourne shell (/bin/sh)
  2. The Bourne again shell (/bin/bash)
  3. The Korn-Shell (/bin/ksh)
  4. The C-Shell (/bin/tcsh)
  5. The TC-Shell (/bin/tcsh)
mtchang@centos:~> tcsh
centos /home/mtchang> sh
mtchang@centos:~> exit
centos /home/mtchang> exit
exit
mtchang@centos:~>

File Globbing(檔名展開字元)

  • Globbing wildcard expansion:
  1. * 符合 zero or more 字元任何長度的字串包括 0 字元 (except“.” at the beginning of a file name and “/”).
  2.  ? 符合 any single 字元(except “/”)
  3. [0-9] 符合一段範圍的數字
  4. [abc] 符合清單內的任意的字元
  5. [^abc] 符合去除所有清單內的任意的字元
  6. [a-z] 此段範圍的任意字元 (here: lowercase letters from a to z).
  7. [a-ek-s] 任意字元從這段 a-e 及 k-s.
  • Globbing(檔名展開字元) 和 regular express(正規表示式)不一樣。
  • Globbing範例:
  • 先建立幾各範例檔案,以方便做練習。但在作下列練習前,請先建立一個test目錄並且切換成 student 這個使用者。
[root@server1 ~]# su - student
[student@server1 ~]$ mkdir test
[student@server1 ~]$ cd test/
[student@server1 test]$ 
  • 練習建立 File Globbing 練習用檔案
[student@server1 test]$ 
touch 
{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z}_{0,1,2,3,4,5,6,7,8,9}
  • 建立完成後,會產生很多的檔案
[student@server1 test]$ ls
a_0  c_6  f_2  h_8  k_4  n_0  p_6  s_2  u_8  x_4
a_1  c_7  f_3  h_9  k_5  n_1  p_7  s_3  u_9  x_5
a_2  c_8  f_4  i_0  k_6  n_2  p_8  s_4  v_0  x_6
a_3  c_9  f_5  i_1  k_7  n_3  p_9  s_5  v_1  x_7
a_4  d_0  f_6  i_2  k_8  n_4  q_0  s_6  v_2  x_8
a_5  d_1  f_7  i_3  k_9  n_5  q_1  s_7  v_3  x_9
a_6  d_2  f_8  i_4  l_0  n_6  q_2  s_8  v_4  y_0
a_7  d_3  f_9  i_5  l_1  n_7  q_3  s_9  v_5  y_1
a_8  d_4  g_0  i_6  l_2  n_8  q_4  t_0  v_6  y_2
a_9  d_5  g_1  i_7  l_3  n_9  q_5  t_1  v_7  y_3
b_0  d_6  g_2  i_8  l_4  o_0  q_6  t_2  v_8  y_4
b_1  d_7  g_3  i_9  l_5  o_1  q_7  t_3  v_9  y_5
b_2  d_8  g_4  j_0  l_6  o_2  q_8  t_4  w_0  y_6
b_3  d_9  g_5  j_1  l_7  o_3  q_9  t_5  w_1  y_7
b_4  e_0  g_6  j_2  l_8  o_4  r_0  t_6  w_2  y_8
b_5  e_1  g_7  j_3  l_9  o_5  r_1  t_7  w_3  y_9
b_6  e_2  g_8  j_4  m_0  o_6  r_2  t_8  w_4  z_0
b_7  e_3  g_9  j_5  m_1  o_7  r_3  t_9  w_5  z_1
b_8  e_4  h_0  j_6  m_2  o_8  r_4  u_0  w_6  z_2
b_9  e_5  h_1  j_7  m_3  o_9  r_5  u_1  w_7  z_3
c_0  e_6  h_2  j_8  m_4  p_0  r_6  u_2  w_8  z_4
c_1  e_7  h_3  j_9  m_5  p_1  r_7  u_3  w_9  z_5
c_2  e_8  h_4  k_0  m_6  p_2  r_8  u_4  x_0  z_6
c_3  e_9  h_5  k_1  m_7  p_3  r_9  u_5  x_1  z_7
c_4  f_0  h_6  k_2  m_8  p_4  s_0  u_6  x_2  z_8
c_5  f_1  h_7  k_3  m_9  p_5  s_1  u_7  x_3  z_9
  • 練習範例:
[mtchang@mt test]$ ls a_[0-9]
a_0  a_1  a_2  a_3  a_4  a_5  a_6  a_7  a_8  a_9
[mtchang@mt test]$ ls [abc]_[0-9]
a_0  a_2  a_4  a_6  a_8  b_0  b_2  b_4  b_6  b_8  
c_0  c_2  c_4  c_6  c_8  a_1  a_3  a_5  a_7  a_9  
b_1  b_3  b_5  b_7  b_9  c_1  c_3  c_5  c_7  c_9
[mtchang@mt test]$ ls [^abc]_[^1-9]
d_0  f_0  h_0  j_0  l_0  n_0  p_0  r_0  t_0  v_0  x_0  z_0
e_0  g_0  i_0  k_0  m_0  o_0  q_0  s_0  u_0  w_0  y_0
[mtchang@mt test]$ ls [a-cx-z]_[^1-9]
a_0  b_0  c_0  x_0  y_0  z_0
  • 練習:
  • 請先建立一個 test 目錄並建立下列範例檔案。
[student@server1 test]$
touch {a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z}_{0,1,2,3,4,5,6,7,8,9}
  • 請使用 rm 指令,配合 File Globbing 字元快速的刪除檔案到剩下下列給各檔案。
[lccnet@server1 test]$ ls
i_0  l_0  n_0  u_0  x_0
  • 請問你的答案是?(每個人的答案都會不同)

檔案及命令補齊功能

  • tab及ctrl+i可以補齊命令或是檔案
  1. 指令補齊功能
  2. 檔案名稱補齊功能
mtchang@centos:~/test> rm test
# 按下tab or ctrl+i
test$_  kk  test.txt
mtchang@centos:~/test> rm test\$_\ \ kk

history指令歷史

  • History
  1. 可以使用上下鍵or PageDown PageUp 觀看上一次及下一次的命令
  2. 可以執行history 觀看所有下過的命令
  3. 可以使用ctrl+r搜尋曾下過的命令
  4. 可以使用Esc 放棄指令
  5. 可以使用Alt- 選取指令
  6. 可以用「!行號」來執行命令
  7. 可以使用兩個「!!」來執行上一個指令
  8. 可以使用「!字元」來找到起始於此字元的命令
  9. 可以使用「!$」執行最後一個正確的命令
  • 使用 「^新字串^舊字串」來取代上一個執行成功的命令
[mtchang@mt test]$ ls a_?
a_0  a_1  a_2  a_3  a_4  a_5  a_6  a_7  a_8  a_9
[mtchang@mt test]$ ^a^z
ls z_?
z_0  z_1  z_2  z_3  z_4  z_5  z_6  z_7  z_8  z_9

命令列延伸

Tilde(~)

  • 符號 ~
  • 參考 user home 目錄 (~)
# 參考他人的
[root@localhost ~]# ls ~lcc09/ -l
總計 8
drwxr-xr-x 5 lcc09 users 4096  5月 21 00:38 Projects
# 參考自己的
[root@localhost ~]# ls ~/.bash_profile
/root/.bash_profile

Bash 變數

  • Variables are named values
  • 使用於儲存資料或是命令的輸出
  • 設定變數用 VARIABLE=VALUE
  • ex: t='123'
  • 參考使用變數用 $VARIABLE
  • ex: echo $t
[lcc09@localhost ~]$ echo "this system's name is $(hostname)"
this system's name is localhost.localdomain
[lcc09@localhost ~]$ h="$(date +%Y%m%d)"
[lcc09@localhost ~]$ echo $h
20070525
  • Prevent the Shell from Interpreting Special Characters

命令與括號變數輸出設定

  • 命令解釋: $() or ``
  • $(command)符號 : 將$()中command的結果以引數的方式輸出
  • `` 功能同 $()
[mtchang@mt test]$ hostname 
mt.cm.nsysu.edu.tw
[mtchang@mt test]$ echo "This system's name is $hostname "
This system's name is  
[mtchang@mt test]$ echo "This system's name is $(hostname) "
This system's name is mt.cm.nsysu.edu.tw 
[mtchang@mt test]$ echo "This system's name is `hostname` "
This system's name is mt.cm.nsysu.edu.tw 
  • 變數的應用在命令列的操作上
# 輸出目前日期
[student@server1 ~]$ echo $(date +%Y%m%d%s)
200903211237614976
# 輸出日期內容到變數 t 
[student@server1 ~]$ t=$(date +%Y%m%d%s)
# 輸出日期內容到變數 tt , `` 功能同 $() 
[student@server1 ~]$ tt=`date +%Y%m%d%s`
# 顯示變數 $t
[student@server1 ~]$ echo $t
200903211237614981
# 顯示變數 $tt
[student@server1 ~]$ echo $tt
200903211237614986
# 運用變數的結果於命列上面
[student@server1 ~]$ mkdir $t $tt
# 驗證
[student@server1 ~]$ ls -l
drwxrwxr-x 2 student student 4096  3月 21 13:56 200903211237614981
drwxrwxr-x 2 student student 4096  3月 21 13:56 200903211237614986
  • 重複延伸擴大符號: { }
  • 產生重複的字串並且套變數
[lcc09@localhost ~]$ touch file{1,3,5}
[lcc09@localhost ~]$ ls file* -l
-rw-r--r-- 1 lcc09 users 0  5月 21 03:50 file1
-rw-r--r-- 1 lcc09 users 0  5月 21 03:50 file3
-rw-r--r-- 1 lcc09 users 0  5月 21 03:50 file5
[lcc09@localhost ~]$ rm -f file{1,3,5}
[lcc09@localhost ~]$ ls file* -l
ls: file*: 沒有此一檔案或目錄

雙引號、單引號及脫逸字元

  1. \:脫逸字元保護特殊字元不被shell解釋掉
  2. "...": 雙引號
  3. '...' 單引號
mtchang@centos:~/test> mkdir new \ directory
mtchang@centos:~/test> echo "$HOME"
/home/mtchang
mtchang@centos:~/test> echo '$HOME'
$HOME
mtchang@centos:~/test> echo "$HOME'test'"
/home/mtchang'test'

shell

命令修改

  • Ctrl-a 移動到命令的前面
  • Ctrl-e 移動到命令的最後
  • Ctrl-u 從頭開始刪除
  • Ctrl-k 刪除到尾部
  • Ctrl-arrow 左右移動

gnome-terminal

  • Applications->Accessories->Terminal
  • 在終端機畫面中,可以使用的hot key
  1. Ctrl-Shift-t 建立一個新的終端機分頁
  2. Ctrl-PgUp/PgDn 上一個或下一個終端機分頁
  3. Ctrl-Shift-c 拷貝
  4. Ctrl-Shift-v 貼上
  • Ctrl + PgUp 單個分頁向上翻頁
  • Ctrl + PgDown 單個分頁向下翻頁

script 基礎

  • Shell scripts 是個文字檔案,且存放順序被執行的敘述(指令)。
  • Shell scripts 通常使用在:
  1. 自動執行經常被使用的命令。
  2. 執行系統管理和除錯
  3. 簡單的應用程式
  4. 操作文字或檔案

shell script

step 1

  • shell script第一行一定為直譯程式的路徑
  1. #!/bin/bash
  • 在shell script裡面要加註解,需使用「#」
  • 經常在使用shell程式
  1.  !/bin/bash - 大多數的 linux 作業系統
  2.  !/bin/sh 常用的 unix-like 作業系統
  3.  !/bin/csh 常用於 BSD 作業系統
  4.  !/usr/bin/perl 進階的Perl程式語言,完整的語言
  5.  !/usr/bin/python 更進階的 python scripts 物件導向的語言
  6.  !/bin/php 目前當紅的php也可以當成script

step 2

  • 必須賦予程式可執行權限
chmod  u+x  myscript.sh
  • To execute the new script:
  1. Place the script file in a directory in the executable path -OR-
  2. Specify the absolute or relative path to the script on the command line

簡單的shell script範例(use bash shell)

[root@server1 ~]# nano hello.sh
#!/bin/bash
# This script displays date and time
echo " The date and time are $(date)"
echo " hello linux !! "
[root@server1 ~]# chmod +x hello.sh 
[root@server1 ~]# ls hello.sh -l
-rwxr-xr-x 1 root root 111 Dec 19 23:26 hello.sh
[root@server1 ~]# ./hello.sh 
 The date and time are Wed Dec 19 23:26:30 CST 2007
 hello linux !! 

簡單的shell script範例(use php-cli)

[student@server1 sh]$ vim h.php
#!/usr/bin/php

[student@server1 sh]$ chmod +x h.php
[student@server1 sh]$ ./h.php 
The date and time are Mon, 07 Dec 2009 19:41:08 CST
hello linux !! 

沒有留言: