Shell筆記系列一
echo
用於終端列印的最基本命令。預設情況下,echo在每次呼叫後都會新增一個換行符,echo列印的文字,一種是被雙引號包括的文字,一種是被單引號包括的文字,還可以不適用雙引號和單引號。區別是:使用雙引號包括的文字中,如果文字中含有特殊字元,會被解釋,而單引號中對特殊字元不做任何處理。對於轉義字元,可以使用\來進行轉義
[[email protected] workspace]$ echo "hello world $0"
hello world bash
[[email protected] workspace]$ echo 'hello world $0'
hello world $0
[ [email protected] workspace]$ echo hello world $0
hello world bash
[[email protected] workspace]$ echo hello world \!
hello world !
printf
printf接受飲用文字或由空格分隔的引數,可以使用格式控制符來對輸出進行控制,和C語言的printf函式相似,%s %d %f都是格式控制符,定義瞭如何帶引後續引數,%-4s指明格式為左對齊且寬度為4的字串替換,沒有-號為右對齊,對於s來說,寬度指明保留某個字串的字元數量,不足以空格填充,對於浮點數,整數部分指明整個浮點數的寬度,小數部分指明保留幾位小數。
[[email protected] workspace]$ printf "%4s %4d %3.2f\n" liu 23 3.1445
liu 23 3.14
變數賦值
varName=value 注意: 等號的左右兩邊沒有空格。varName是變數名,value是要賦予的值,如果value不包含任何空白字元,就不需要將其放入到引號中,否則必須使用單引號或雙引號。
[[email protected] workspace]$ name=ld
[[email protected] workspace]$ name=ld d
bash: d: command not found...
[[email protected] workspace]$ name="ld d"
變數的獲取使用$varName 或者 ${varName}
[[email protected] workspace]$ echo $name
ld d
[[email protected] workspace]$ echo ${name}
ld d
Shell內建特性:
獲取字串的長度,以及識別當前所使用的shell.
[[email protected] workspace]$ echo ${#name}
4
[[email protected] workspace]$ echo $SHELL
/bin/bash
修改Bash的提示字串
當我們開啟終端或執行shell時,看到型別的ld#localhost path $提示字串,不同的GNU/Linux釋出版中的提示字串和顏色各不相同,可以利用PS1環境變數來定義主提示字串,預設的提示字串在檔案~/.bashrc中的某一行設定。
# User specific aliases and functions
PS1="FIGHTING..."
FIGHTING... ls
app Documents hadoopHello.jar Pictures Templates tetConfiguration.jar WindowsTB
Desktop Downloads Music Public test.txt Videos workspace
FIGHTING...
shell進行數學運算
⑴使用let命令⑵使用操作符[]⑶使用操作符(())⑷使用expr
FIGHTING...num=5
FIGHTING...let num++
FIGHTING...echo $num
6
FIGHTING...num=$[ num + num ]
FIGHTING...echo $num
12
FIGHTING...num=$(( num + num ))
FIGHTING...echo $num
24
FIGHTING...num=`expr 6 + 6`
FIGHTING...echo $num
12
檔案描述符與重定向
檔案描述符是與輸入和輸出相關聯的整數。檔案描述符有標誌輸入,標準輸出,標準錯誤,stdin,stdout,stderr.我們可以將檔案描述符重定向到另一個檔案描述符中。
預設情況下,正常輸出和錯誤輸出都會顯示在螢幕上,檔案描述符是與某個開啟的檔案或資料流相關聯的整數。檔案描述符0,1,2對應標準輸入,標準輸出,標註錯誤。
重定向:
使用>,將輸出的文字儲存在後面的檔案中,如果後面檔案已經存在,則大於號會清空該檔案中先前的內容
使用>>,將輸出的文字追加到後面的檔案中。
使用<,使用stdin那樣從檔案中讀取資料。
FIGHTING...cat test.txt
hello world
===========
-- name : liudong
FIGHTING...echo ">>>>>" > test.txt
FIGHTING...cat test.txt
>>>>>
FIGHTING...echo "<<<<<>>>>>>" >> test.txt
FIGHTING...cat test.txt
>>>>>
<<<<<>>>>>>
FIGHTING...
注意:當命令成功執行後,它會返回為0的退出狀態,退出狀態可以從特殊變數$?中獲得。當一個命令發生錯誤並退出時,它會返回一個非0的退出狀態。
重定向和檔案描述符結合:
使用2>xxx,會將stderr重定向到xxx檔案中;
使用1>xxx,會將stdout重定向到xxx檔案中;
FIGHTING...cmd 2>stderr.txt 1>stdout.txt
FIGHTING...cat stderr.txt
bash: cmd: command not found...
Similar command is: 'mcd'
FIGHTING...cat stdout.txt
也可以使用管道實現重定向資料到檔案,還可以提供一份重定向資料的副本作為管道中後續命令的stdin.
command | tee File1 File2 | othercommand
陣列
FIGHTING...array=(1,2,4,5,6)
FIGHTING...echo $array
1,2,4,5,6
FIGHTING...echo ${array[0]}
1,2,4,5,6
FIGHTING...array2[1]=1
FIGHTING...array2[2]=2
FIGHTING...echo ${array2[0]}
FIGHTING...echo ${array2[1]}
1
FIGHTING...echo ${array2[*]}
1 2
FIGHTING...echo ${array2[@]}
1 2
FIGHTING...echo ${#array2[*]}
2
FIGHTING...
別名
alias new_command='command sequence'
alias命令的效果暫時的,一旦關閉當前終端,所有設定過的別名就失效了,為了使別名在所有的shell中都可用,可以將其放入~/.bashrc檔案中,每當互動式shell程序生成時,都會執行~/.bashrc中的命令。
注意:建立一個和願生命令同名的別名很容易,如果有人惡意修改別名為重要的命令,則可以轉義要使用的命令,忽略當前定義的別名:\command
日期
Unix紀元時定義為從世界標準時間UTC(1970年1月1日0時0分0秒起至當前時刻的總秒數,不包括閏秒)
讀取日期: date
列印紀元時: date %s
用帶有字首+的格式化字串作為date命令的引數: date "+%d %B %Y"
函式
函式的定義包括function命令,函式名,開閉括號以及包含一對花括號中的函式體。
#!bin/bash
function test()
{
echo "this is a function "
}
test
test2()
{
echo "this is a function2"
}
test2
test3()
{
echo $1,$2;
echo "[email protected]";
echo "$*";
return 0;
}
test3 zhang san li si
FIGHTING...bash std.sh
this is a function
this is a function2
zhang,san
zhang san li si
zhang san li si
FIGHTING...
參考《Linux Shell 指令碼攻略》