程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> C語言入門知識 >> Shell基本知識

Shell基本知識

編輯:C語言入門知識

Shell是什麼

Shell是一個命令行解釋器,它為用戶提供了一個向Linux內核發送請求以便運行程序的界面系統級程序,用戶可以使用Shell來啟動、掛起、停止甚至編寫一些程序。 Shell還是一個功能相當強大的編程語言,易編寫,易調試,靈活性較強。Shell是解釋執行的腳本語言,在Shell中可以直接調用Linux系統命令。

Shell的分類

Shell的梁總主要語法類型有Bourne和C,這兩種語法彼此不兼容。Bourne家族主要包括sh、ksh、Bash、psh、zsh;C家族主要包括:csh、tcsh。
Bourne Shell
從1979起Unix就開始使用Bourne Shell,Bourne Shell的主文件名為sh,非常古老,功能簡單的shell。 C Shell
C Shell主要在BSD版的Unix系統中使用,其語法和C語言相類似而得名。

Bash
Bash 與 sh兼容,現在使用的Linux就是使用Bash作為用戶的基本Shell。

Linux中Shell

使用 echo $SHELL查看當前shell。 使用 vim /etc/shells查看Linux支持的shell 。

alias別名

使用alias命令查看當前shell別名
// 
#alias
alias ll='ls -l --corlor=auto'
...
在當前shell中設置臨時別名alias alias_name='origin_name'
// 
#alias vi='vim'
#vi //實際執行vim
刪除別名 unalias alias_name
#unalias vi

-當前用戶永久配置別名 vi ~/.bashrc

#vi ~/.bashrc
// 添加別名,並保存退出
alias vi='vim'
// 重新加載.bashrc文件到當前shell
#source ~/.bashrc
別名生效順序
命令生效順序
執行用絕對路徑或相對路徑的命令 別名 Bash內部命令 $PATH環境變量定義的目錄查找順序找到的第一個命令

注:別名的優先級高於系統中默認命令

常用快捷鍵

Ctrl+C 強制終止當前命令 Ctrl+l 清屏 Ctrl+a 光標移動到命令行首 Ctrl+e 光標移動到命令行首 Ctrl+u 從光標所在位置刪除到行首 Ctrl+z 把命令放入後台 Ctrl+r 在歷史命令中搜索

歷史命令

history [選項] [歷史命令保存文件]

options
-c : 清空歷史命令
-w:把緩存中的歷史命令寫入歷史命令保存文件 ~/.bash_history

注: history中歷史命令為上次登錄時使用的命令,可以使用-w同步寫入這次登錄後使用的命令

歷史命令默認會保存1000條,可以在環境變量配置文件/etc/profile 中修改HISTORYSIZE

歷史命令的調用

使用上、下箭頭調用以前的歷史命令 使用“!n”重復執行第n條歷史命令 使用“!!”重復執行上一條命令 使用“!字串”重復執行最後一條以該字符串開頭的命令

Tab鍵補全

使用Tab鍵補全命令或文件名,一次Tab鍵未補全時,再次Tab鍵顯示多個補全後命令或文件後從中選擇使用的命令或文件,但有時沒有該命令或文件時無法完成補全。

**注:**Tab鍵使用$PATH環境變量中給定的可執行文件的搜索路徑中搜索命令

Bash中其他特殊符號

符號 作用 ” 單引號。在單引號中所有的特殊符號,如’$’和’`’(反引號)都沒有特殊含義。 “” 雙引號。在雙引號中特殊符號都沒有特殊含義,但是”$”、”`”和”\”是例外,擁有“調用變量的值”、“引用命令”、和“轉移符”的特殊含義。 ` ` 反引號。在反引號括起來的內容是系統命令,在Bash中會先執行它,和()作用一樣,推薦使用(),反引號容易看錯。 $() 和反引號作用一樣,用來引用系統命令 # 在shell腳本中,#開頭行代表注釋 $ 用於調用變量的值,如需要調用變量name的值時,需要用$name的方式得到變量的值。 \ 轉移符。跟在\之後的特殊符號將失去特殊含義,變為普通字符。如 \$將輸出 "$"符號,而不當做是變量引用

Shell變量

Shell中變量命名規則

變量名必須以字母或下劃線打頭,名字中間只能由字母、數字和下劃線組成 變量名的長度不得超過255個字符 變量名在有效的范圍內必須是唯一的 在Bash中,變量的默認類型都是字符串型

變量的分類

用戶自定義變量
變量自定義的。 環境變量
主要保存和系統操作環境相關的數據。變量可以自定義,但是對系統生效的環境變量名和變量的作用是固定的。 位置參數變量
主要用來想腳本當中傳遞參數或數據,變量名不能自定義,變量作用是固定的,也是預定義變量的一種。 預定義變量
Bash中已經定義好的變量,變量名不能自定義,變量作用也是固定的

定義變量

// 變量名=變量值
#x=5 // 注:其間不能有空格 例如x= 5、x =5、x = 5等
// 打印變量
#echo $x
#echo ${x}

變量疊加

#x=123
#x="$x"456
#x=${x}789

變量查看

set可以查看系統下所有變量,包括環境變量和用戶變量

// 查看所有變量
#set

// 設置此選項,調用未聲明變量時報錯(默認情況下無任何提示)
#echo $a

#set -u
#echo $a
-bash: a: unbound variable

變量刪除

unset 變量名

// 刪除變量,變量名前不能加$
#unset a

環境變量

環境變量和用戶自定義變量的區別?
用戶自定義變量只能在當前shell中生效
環境變量在當前shell和這個shell的所有子shell中生效

// 進入子shell
# bash
// 查看當前進程樹
# pstree
|-
...
|-bash--bash--pstree
...
// 退出子shell
# exit
# pstree
|-
...
|-bash--pstree
...
// 當前shell中定義a
# a=5
# echo $a
5
// 進入子shell
# bash
# pstree
|-
...
|-bash--bash--pstree
...
// 無法查看父shell中的自定義的變量a
# echo $a

# eixt
// 父 shell 中導出自定義變量 a,子shell可以看到父shell中的變量
# export $a
# bash
// 子shell中查看變量a
# echo $a
5
// 子shell無法刪除父shell定義的變量a
# unset a 
# exit
// 父shell刪除自定義的變量a
# unset a

查看環境變量

set
查看所有變量,包括用戶自定義變量和系統環境變量 env
僅用來查看環境變量

PS1環境變量

PS1變量:命令提示符設置

\d:顯示日期,格式為 “星期 月 日” \H:顯示完整的主機名。如默認的主機名”localhost.localhost” \t:顯示24小時制時間,格式為“HH:MM:SS \A:顯示24小時制時間,格式為“HH:MM” \u:顯示當前用戶名 \w:顯示當前所在目錄的完整名稱 \W:顯示當前所在目錄的最後一個目錄 $:提示符。如果root用戶會顯示提示符為“#”,如果普通用戶會顯示提示符“$”
# echo $PS1
[\u@\h \W]\$

PS2 定義換行提示符如下代碼中的“>”

# ls \
>~

當前語系

locale命令查看當前語系

LANG:定義系統主語系的變量 LC_ALL:定義整體語系的變量
// 查看系統當前語系
# locale
...
# echo $LANG
// 查看Linux系統支持的所有語系
# locale -a |more

查詢系統默認語系

cat /etc/sysconfig/i18n,下次開機啟動後系統進入的是默認語言環境

# cat /etc/sysconfig/i18n
LANG="zh_CN.UTF-8"

Linxu中文支持
前提條件,正確安裝中文字體和中文語系

有圖形界面,可以正確支持中文顯示 第三方遠程工具,只要語系設定正確,就可以支持中文顯示,XShell選擇中文顯示 純字符界面,必須使用第三方插件(如zhcon等)

位置參數變量

// 固定參數個數的求和shell腳本
#/bin/bash
num=$1
num=$2
sum=$(( $num1 + $num2 ))
echo $sum
位置參數變量 作用 $n n為數字,$0代表命令本身,$1-$9代表第一到第九個參數,十個以上的參數需要用大括號包含,如${10} $* 這個變量代表命令行中所有的參數,$*把所有的參數看成一個整體 $@ 這個變量也代表命令行中所有的參數,不過$@把每個參數區分對待 $# 這個變量代表命令行中所有參數的個數
// $*和$@的區別,保存為param.sh
#!/bin/bash
for i in "$*"
    do 
        echo $i
    done
for i in "$@"
    do
        echo $i
    done
# chmod u+x param.sh
# ./param.sh 1 2 3 4
1 2 3 4
1
2
3
4

預定義變量

預定義變量 作用 $? 最後依次執行的命令的返回狀態。如果這個變量值為0,證明上一個命令正確執行;如果這個變量的值為非0,則證明上一個命令執行不正確 $$ 當前進程的進程號 $! 後台運行的最後一個進程的進程號(PID)

read

options
-p “提示信息”:在等待read輸入時,輸出提示信息 -t 秒數:read命令會一直等待用戶輸入,使用此選項可以指定等待時間 -n 字符數:read命令只接受指定字符數,就會執行 -s:隱藏輸入的數據,適用於機密信息的輸入

Shell運算符

shell變量的缺點?

shell變量是弱類型 默認變量都是字符串

declare聲明變量類型

declare來指明聲明的變量類型
declare [+/-][option] 變量名
options:

-:給變量設定類型屬性 +:取消變量的類型屬性 -a:將變量聲明為數組型 -i:將變量聲明為整數型 -x:將變量聲明為環境變量 -r:將變量聲明為只讀變量 -p:顯示指定變量的被聲明的類型
// shell變量默認為字符串
# aa=11
# bb=22 
# cc=$aa+$bb
# echo $cc
11+22

// 明確聲明變量類型
# declare -i cc=$aa+$bb // 自動轉換了$aa、$bb為整型變量參與運算
# echo $cc
33
// 查看指定變量的屬性
# declare -p cc
declare -i cc="33"
// 定義數組,shell腳本能夠自動檢測出這個movie變量是數組
# movie[0]=zp
# movie[1]=tp
# declare -a movie[2]=live 

# echo ${movie}
# echo ${movie[2]}
# echo ${movie[*]}
// export 調用 declare -x 變量 來聲明環境變量
# bb=2
# export bb

// export真正調用是declare -x bb=2
# declare -x bb=2

// 查看所有的環境變量
#declare -p
...
declare -x bb=2
...
// 只讀屬性,變量不能重新賦值、刪除、取消只讀屬性,一般不使用只讀屬性
# declare -rx test=123
# test=456
-bash: test: readonly variable
# unset test
-bash: test: cannot unset: readonly variable
# declare +r test
-bash: declare: test: readonly variable

數值運算方法

// 上節中數值計算的方式求cc的數值比較復雜,可以使用下面方式
# aa=1
# bb=2
# dd=$(expr $aa + $bb) // 注:$aa和$bb和+ 之間有空格
# echo $dd
// 上面的方式也很復雜
# aa=1
# bb=2
# dd=$(($aa+$bb))
# dd=$[$aa+$bb]

運算符的優先級

這裡寫圖片描述

注:這裡數值越大,優先級越高

變量測試

這裡寫圖片描述

注:變量測試方式十分簡潔但邏輯復雜,也不好記,實際工作中可以查閱;可以使用其他方式實現相同測試結果即可。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved