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}