Shell學習筆記

命令格式:command [-potions] param1 param2 ...


echo $LANG    當前語言(zh_CN.UTF-8,en_US,zh_CN.GB18030)環境

set fileformat=unix   

 win編寫sh上傳到linux文件類型爲dos。運行時會出現: /bin/bash^M: badinterpreter: 沒有那個文件或目錄。在vi中 :set fileformat可以查看文件的操作系統類型。需要修改成:setfileformat=unix。

alias hdfs='hadoop fs'  修改命令別名。
read myvar  交互式對變量賦值
basename $0  去掉位置參數的路徑 ./run.sh --> run.sh
dirname $0 
$0 命令本身的名稱,$# 參數的數目,$*和$@相同爲參數本身的列表,但"$*" 和 "$@"(加引號)並不同,"$*"將所有的參數解釋成一個字符串,而"$@"是一個參數數組
後臺進程PID被賦予$!,$$是shell自身的進程ID,$?表示上一次運行命令的返回碼 0表示運行成功。
unset myvar 刪除變量
${#myvar}  變量字符數目
echo ${!myvar}  變量myvar值的變量值
${myvar:-defalutVal},${myvar:=defalutVal}(對往後代碼的此變量有效)   賦予myvar默認值
echo $myvar | tr '[a-z]' '[A-Z]'  把myvar的小寫轉換成大寫
${myvar:3},${myvar:3:2},${myvar: -3}(從尾開始),${myvar#word}(裁剪),${myvar##word}(貪婪),${myvar%word}(從結尾開始),${myvar%%word}   字符串剪切

sed -i s/old/new/g myfile ,echo "$myvar" | sed s/old/new/g (sed s/old/new/2 替換第二個old) 替換字符

sed配合find批量替換:find . -type f -name "*.xml" | xargs sed -i s/old/new/g 替換查找到文件的字符

echo ${myvar/old/new}(替換第一個), ${myvar//old/new},${myvar/#old/new}(開頭是old),${myvar/%old/new}(結尾是old)  變量替換
seq [選項]... 首數 增量 尾數  產生從某個數到另外一個數之間的所有整數
set -f (或者 set -o noglob) 關閉文件名擴展名,+f 開啓
man test,shopt 命令
IFS 是內部的域分隔符 默認值爲:空白(包括:空格,tab, 和新行)
let a=$a+1,a=`expr $a + 1` a=$((1 + 1)) 計算
echo "test" | tee myfile 輸出同時導向stdout與文件。
exec cmd 當前運行的進程替換爲另一個
ls /etc/hosts > out 2> err 
command > file 2>&1 這條命令就將stdout直接送向file, stderr 繼承了FD1管道後,再被送往file,此時,file 只被打開了一次,也只使用了一個管道FD1,它包括了stdout和stderr的內容.
讀取順序:su -  會順序讀取/etc/profile,~/.bashrc,~/.bash_profile ;su 會讀取~/.bashrc
history | tail -7 查看歷史命令
jobs -l 顯示所有作業的PID,作業號,狀態,命令行
fg和bg將指定的作業帶到前後臺。 fg %2(jobs的作業號) 按下Ctrl與z 可以將一個正在前臺執行的命令放到後臺,並且暫停。bg $number 繼續後臺執行。
stat 顯示文件詳細屬性信息
cat -ne file。tac file 翻轉文件
here文檔:
    cat <<EOF > file
    (內容) 
    EOF (當Shell看到"<<"的時候,它就會知道下一個詞是一個分界符。在該分界符以後的內容都被當作輸入,直到shell又看到該分界符(位於單獨的一行)。這個分界符可以是你所定義的任何字符串。)
mktemp 在/tmp下創建文件名唯一的臨時文件,在標準輸出中返回文件名
join -j2 -a1 f1 f2 根據兩個文件中的公共鍵組合文件(條件:兩個文件必須按鍵進行排序,輸入與輸出文件都必須有相同的定界符)
grep -i(不區分大小寫) -l(只列出匹配文件的名稱) -w(只進行全字匹配) -v(反選,僅列出與模式不匹配的行) -e(多個搜索grep -e a -e b file)。
     -A(after 匹配之後) -B(before 匹配之前) -C(context 匹配前後)
     正則表達式
split -b 1m -d file 後綴名 。文件分割
touch -d "2013-01-01" file 更新文件的時間戳,修改inode細節,無法用來修改文件的更改時間。
find / -exec ls -l {} \;  find -exec對匹配的文件運行命令,文件名放在佔位符{}所在位置,以分號結束(\爲轉義)
echo "a:b:c" | cut -d: -f1 。剪切。輸出a
echo -n(不換行) -e(翻譯反斜槓,\n 翻譯爲換行) "abc"
fmt 格式化文本行
od 查看特殊格式的文件內容
paste -d, file1 file2;seq 1 27 | paste -s(每個文件合併成行) -d"\t\t\t\n" - - (對每一個-,從標準輸入中讀一次數據)  與cut相反,將多個文件粘貼在一起。
pr -T -4 file 格式化
printf "%-10s %-20s" "str1" "str2" 字符串左對齊,寬度至少10個字符。
sort -k2n -k6M file 排序
uniq -u -f1 顯示唯一的行,常與sort|uniq組合
dos2unix,unix2dos 
date -d "last-month" +%Y-%m-%d,date -d "1 days" 時間
factor number 生產素數因子
md5sum file,md5sum -c file.md5 文件files和該文件的file.md5文件放在同一個目錄下
xargs   ls | xargs -t -i mv {} {}.bak  -i 選項告訴 xargs 用每項的名稱替換 {}。 
awk '{pattern + action}' pattern 表示 AWK 在數據中查找的內容,就是要表示的正則表達式,用斜槓括起來。,而 action 是在找到匹配內容時所執行的一系列命令
awk -F ',' '/^101/ {print $1"\t"$7}' 
ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size}'
rename 被替換掉的字符串 被替換掉的字符串 匹配要替換的文件模式 例如:rename foo foo0 foo? 
單引號(' ')和雙引號類似,它不允許解釋變量引用,在單引號內,除了字符單引號,每個特殊字符都只是字面的意思
vim scp://username@host//path/to/somefile vi一個遠程文件
curl ifconfig.me 在內網下查看公網ip


if 語句:
    if [];then
        ...
    elif [];then
        ...
    else
        ...
    fi


    if [[ =~(.*)\.txt ]] && [ -r "$filename" ]; 正則表達式。match是 ${BASH_REMATCH[1]}
case 語句:
    case $input in
        s1) ... ;;
        s2) ... ;;
        *) ...;;
    esac
for 循環語句:
    for file in test{1,2,3}.txt 
    for fruit in $fruit   (#注:fruit="a b c")
    do
        ...
    done
    
    for (( i=1;i<10;i++ )) (#注:for i in `seq 1 10`)
    do
        ...
    done
while 循環語句:
    while [ ... ]
    do
        ... break(or continue) 2 (#注:不寫默認break(continue)爲1層循環)
    done
    
    while read m1 m2
    do
        ...
    done < $file1
    
    while : 無限循環
    do
        ...
    done
until 循環語句:(#測試條件和while相反)
    until [ .. ]
    do
        ...
    done
select 循環語句:
    PS3="choose your item" (#默認提示符爲:'#?',可以通過PS3變量)
    select item in one two  
    do
        $REPLY,$item (#REPLY爲用戶輸入的任何合法或者非法值,如果非法item爲空,合法item爲one,two其中的一個)
    done
函數:
myfunction() {   (#return返回是字節,只能表示0~255)
    echo $1
    local myvar 加上local告訴bash變量和外部的同名變量是不同的(#變量就是一個簡單的linux變量,沒有作用域的概念。)
}
trap myfunction 1 2 3 6 9 函數陷阱,用於捕獲信號。
. ./lib 引用lib函數庫。庫引用庫可繼承
while getopts 'i:b:q' argv 傳遞參數
do
    case $argv in
        i) $OPTARG (參數值)
        b) ..
        q) ..
        ?) ..
    esac
done
數組賦值:
  一次一個:
    arr[1]=1
    arr[2]=2
  一次全部:
    arr=(1 2)
  按索引:
    arr=([0]=1 [1]=2 [3]=4)
  其他:
    arr=( $(cat a.txt) ),arr=( `cat a.txt` )   
    arr=( *.txt )
    arr1=( "${arr[@]}" )
    arr1+=( "${arr[@]}" )
    read -a arr
    while IFS=: read -a arr (#IFS和read寫在一行,IFS只對read有效,不影響其他命令)
    do
    done < filename
數組訪問:   
    ${arr[0]} 省略索引,默認訪問第一個元素
    ${#arr[@]},${#arr[*]} 數組元素個數
    ${#arr[1]} arr[1]字符個數
    ${arr[@]:3},${arr[@]:3:2} 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章