1. 程式人生 > >Shell筆記系列一

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 指令碼攻略》