Linux shell 程序設計
shell 程序設計
主要的學習內容包含基本思路,語法:變量、條件判斷和程序控制,命令列表,函數,命令及執行,調試,grep命令和正則表達式,find命令
什么是shell
適用編寫執行相對簡單任務的小工具。
linux系統中,標準shell是GNU工具集中bash(GNU Bourne—Again Shell)。查看bash版本號
/bin/bash --version
管道和重定向
- 重定向輸出> ls -1 > lsoutput.txt
把ls命令的輸出保存到文件lsoutput.txt中
其中參數 -1代表文件描述符,0代表程序的標準輸入,1代表標準輸出,2代表錯誤輸出。> 把標準輸出重定向到一個文件,覆蓋已經有的文件
ps >> lsoutput.txt
其中>>表示把輸出內容附加到文件后
把標準輸出和標準錯誤輸出都重定向到一個文件中,用>&來結合兩個輸出
kill -1 1234 >killouterr.txt 2>&1
- 管道
利用管道操作符|來連接進程。通過管道連接的進程可以同時運行,并且隨著數據流在它們之間的傳遞可以自動的進行協調
ps -xo comm | sort | uniq | grep -v sh |more
這一命令按照字母順序排序ps命令的輸出,接著用uniq去除相同名字的進程,然后用grep -v sh刪除sh的命令,最后將結果顯示在屏幕上。
程序設計語言的shell
- 交互式程序
即在命令行上直接輸入shell腳本。要繼續輸入時$就變成了>,由shell判斷何時輸入完畢并執行腳本程序
- 創建腳本
- 用文本編輯器創建一個腳本 first2. 運行腳本的方式有兩種
-
/# !后面的參數指的是用來執行本文件的程序。
-
/bin/sh first
-
chmod +x first first(shell的環境變量PATH為要在當前目錄下查找要執行的命令)或者./first(建議使用)
shell的語法
變量
特點是
- 使用時不需要做出聲明,使用時同時創建。
- 區分大小寫
- 通過在變量名前加$來訪問。然后通過echo來顯示。
例子 引號以及read的使用 variable
# !bin/sh
myvar="Hi there"
echo $myvar echo "$myvar" echo '$myvar' echo $myvar
read myvar echo $myvar
輸出為 Hi there Hi there $myvar $myvar
在變量前面加$能顯示變量的內容,使用雙引號不影響變量的替換,使用單引號和\不進行變量的替換,用read從用戶處讀入一個字符串。
環境變量
$HOME : 當前目錄的家目錄
$PATH: 用冒號分隔用來搜索命令的目錄列表
$PS1:
$0:腳本名字
$#:傳遞給腳本的參數個數
$$:腳本的進程號
$1,2,3:腳本的參數
條件
-
test []:shell的布爾判斷命令
if [-f fred.c]
then ..... fi
- test 可以使用的條件類型:字符串比較,算術比較和文件有關的測試
-d file :文件是否為目錄
-e:存在
-f:普通文件
控制結構
- if then elif then fi.
``if condition
then statements elif statements else statements fi
-
for .. in .. do done
-
while do done
#!/bin/sh
echo "password"
read password
while [ "$password" != "secret" ]
do
echo "sorry,try again"
read password
done
exit 0
-
常用寫法 while [ ]; do
-
until
until ..do :循環根據就不需要執行采用util,至少執行一次采用while
- case
- 命令列表
將幾條命令連接成一個序列,執行某個語句之前同時滿足好幾個條件
-
AND列表
state1 && state2 && state3
從左到右順序執行每條命令,只有前一條返回true,它下一條命令才執行。 -
state1 || state2 || state3
函數
function_name() {
statements
}
命令
-
break:用于跳出當前循環,只跳出一層循環
-
:命令是一個空命令,用來簡化邏輯,相當于true的別名。
while :相當于 while true
: $
- .命令
../shell_script 用于在當前shell中執行命令 - eval 命令
像個額外的$,給出一個變量值的值 - exec命令
將當前shell替換為一個不同的程序 - export 命令
一旦一個變量被shell導出,它可以被該shell調用的任何腳本使用,也可以被后續依次調用的任何shell使用
- expr 命令
將它的參數當作一個表達式來求值 可以用$()來替換
-
printf 命令
-
set命令
作用為為shell腳本設置參數變量。 -
shift
把所有參數變量左移一個位置,使$2變成$1
下面代碼實現依次掃描所有的位置參數
\#!/bin/sh
while [ "$1" != "" ]; do
echo "$1"
shift
done
exit 0
- trap命令
用于指定在接收到信號后要采取的行動。
用法: trap command signal
command:接收到信號后要采取的行動。
signal:要處理的信號名。 - unset命令
用于從環境中刪除變量或函數。
正則表達式極其相關的命令
- find 命令
find的完整語法格式:
find [path] [options] [tests] [actions]
path :可以選擇絕對路徑也可以選擇相對路徑。
使用操作符和圓括號的find命令
比如在當前目錄下找出文件中比test_for 更新并且以test_為后綴的文件
例1.
find . \( -name "test_*" -and -newer test_for \) -type f -print
命令解釋:用\轉義(),因為()在shell里面有特殊含義,用-and來連接兩個測試(-or 或 -not )
例2.
find . -newer test_for -type f -exec ls -l {} \;
命令解釋:-exec 執行一條命令,讀取參數直到;為止,{}是-exec的參數,它被當前文件的完整路徑取代。
- gerp命令
grep(General Regular Expression Parser )
find 用來在系統中搜索文件,而grep命令在文件中搜索字符串。
grep [options] PATTERN [FILES]

浙公網安備 33010602011771號