Linux Shell的遇到的知識點1

&後臺執行   && 邏輯與  前邊命令成功才執行後邊命令  || 邏輯或 前邊命令不成功才執行後邊命令 | 
mkdir -p dir  創建該目錄包括父目錄。
grep -c day track.sh 輸出track.sh中包含‘day’的行的數量。
grep -v day track.sh 輸出不包含day的行

hadoop腳本:
SOURCE="${BASH_SOURCE[0]}"  腳本相對於當前目錄的路徑,是相對路徑
BIN_DIR="$( dirname "$SOURCE" )"  dirname得到腳本的目錄名,也是相對路徑。,$()與``功能相似;${var}與$var一般沒啥不一樣;${file:/home/sy.txt}如果沒有file變量則以/home/sy.txt代替。$(($a + $b))做運算
while [ -h "$SOURCE" ] -h用來判斷文件是否存在並且是個符號鏈接
do
SOURCE="$(readlink "$SOURCE")" //輸出符號鏈接所指向的位置  加-f進行遞歸,直接輸出最終文件。
[[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE"
BIN_DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd)"  //-P 如果要切換的目標目錄是一個符號鏈接,直接到指向的目標目錄
done
BIN_DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
LIB_DIR=$BIN_DIR/../lib

在bash shell中,$( )與` `(反引號)都是用來做命令替換(command substitution)用的。
${ }用來作變量替換:一般情況下,$var與${var}作用相同。但是用${ }會比較精確的界定變量名稱的範圍


 shell中$(( ))與$( )還有${ }的區別 http://blog.csdn.net/tg5156/article/details/19406275 
2014-02-18 13:46 1305人閱讀 評論(0) 收藏 舉報
 分類:  shell(5)  
原文地址:http://blog.zol.com.cn/2322/article_2321763.html

$( )與` `(反引號)
在bash shell中,$( )與` `(反引號)都是用來做命令替換(command substitution)用的。
$ echo the last sunday is $(date -d "last sunday" +%Y-%m-%d)
得到上一星期天的日期
用$( )的理由
1. ` `很容易與' '(單引號)搞混。有時在一些奇怪的字形顯示中,兩種符號是一模一樣的(直豎兩點)。
2. 在多層次的複合替換中,` `須要額外的跳脫(\`)處理,而$( )則比較直觀。例如:
command1 `command2 `command3` `
原本的意圖是在command2 `command3`中先將command3替換出來給command2處理,然後再將結果傳給command1 `command2 ...`來處理。
然而,真正的結果在命令行中卻是分成了`command2`與` `兩段。
正確的輸入應該如下:
command1 `command2 \`command3\` `
換成$( )則一目瞭然:
command1 $(command2 $(command3))
$( )的不足
` `基本上可在全部的unix shell中使用,若寫成shell script移植性比較高。而$( )並不是每一種shell都能使用。
${ }用來作變量替換
一般情況下,$var與${var}作用相同。但是用${ }會比較精確的界定變量名稱的範圍,例如:
$ A=B
$ echo $AB
原本是打算先將$A的結果替換出來,然後再補一個B字母於其後,但在命令行上,真正的結果卻是隻會替換變量名稱爲AB的值出來。
使用${ }就沒問題了:
$ echo ${A}B
BB
${ }的一些特異功能
定義一個變量:
file=/dir1/dir2/dir3/my.file.txt
可以用${ }分別替換獲得不同的值:
${file#*/} 拿掉第一個 / 及其左邊的字符串:dir1/dir2/dir3/my.file.txt
${file##*/} 拿掉最後一個 / 及其左邊的字符串:my.file.txt
${file#*.} 拿掉第一個 . 及其左邊的字符串:file.txt
${file##*.} 拿掉最後一個 . 及其左邊的字符串:txt
${file%/*} 拿掉最後一個 / 及其右邊的字符串:/dir1/dir2/dir3
${file%%/*} 拿掉第一個 / 及其右邊的字符串:(空值)
${file%.*} 拿掉最後一個 . 及其右邊的字符串:/dir1/dir2/dir3/my.file
${file%%.*} 拿掉第一個 . 及其右邊的字符串:/dir1/dir2/dir3/my
記憶的方法:
# 去掉左邊(鍵盤上 # 在 $ 的左邊)
% 去掉右邊(在鍵盤上 % 在 $ 的右邊)
單一符號是最小匹配,兩個符號是最大匹配。
${file:0:5} 提取最左邊的 5 個字節:/dir1
${file:5:5} 提取第 5 個字節右邊的連續 5 個字節:/dir2
也可以對變量值裏的字符串作替換:
${file/dir/path} 將第一個 dir 替換爲 path:/path1/dir2/dir3/my.file.txt
${file//dir/path} 將全部 dir 替換爲 path:/path1/path2/path3/my.file.txt
利用${ }還可針對不同的變量狀態賦值(未設定、空值、非空值): 
${file-my.file.txt} 若 $file 未設定,則使用 my.file.txt 作傳回值。(空值及非空值時不作處理) 
${file:-my.file.txt} 若 $file 未設定或爲空值,則使用 my.file.txt 作傳回值。(非空值時不作處理)
${file+my.file.txt} 若 $file 設爲空值或非空值,均使用 my.file.txt 作傳回值。(未設定時不作處理)
${file:+my.file.txt} 若 $file 爲非空值,則使用 my.file.txt 作傳回值。(未設定及空值時不作處理)
${file=my.file.txt} 若 $file 未設定,則使用 my.file.txt 作傳回值,同時將 $file 賦值爲 my.file.txt。 (空值及非空值時不作處理)
${file:=my.file.txt} 若 $file 未設定或爲空值,則使用 my.file.txt 作傳回值,同時將 $file 賦值爲 my.file.txt。 (非空值時不作處理)
${file?my.file.txt} :若 $file 未設定,則將 my.file.txt 輸出至 STDERR。(空值及非空值時不作處理)
${file:?my.file.txt} :若 $file 未設定或爲空值,則將 my.file.txt 輸出至 STDERR。(非空值時不作處理)
以上的理解在於,一定要分清楚 unset 與 null 及 non-null 這三種賦值狀態。
一般而言,與 null 有關,若不帶 : 的話,null 不受影響,若帶 : 則連 null 也受影響。
${#var} 可計算出變量值的長度:
${#file} 可得到 27,/dir1/dir2/dir3/my.file.txt 剛好是 27 個字節。
bash數組(array)處理方法
一般而言,A="a b c def"只是將 $A 替換爲一個單一的字符串,但是改爲 A=(a b c def),則是將 $A 定義爲數組。
bash的數組替換方法可參考如下方法:
${A[@]} 或 ${A[*]} 得到 a b c def(全部數組)
${A[0]} 得到 a (第一個元素),${A[1]} 第二個...
${#A[@]} 或 ${#A[*]} 得到 4 (數組數量)
${#A[0]} 得到 1 (第一個元素 a 的長度),${#A[3]} 得到 3 (第四個元素 def 的長度)
A[3]=xyz 將第四個元素重新定義爲 xyz
$(( ))的用途
用來作整數運算。在 bash 中,$(( ))的整數運算符號大致有這些:
+ - * / 加、減、乘、除
% 餘數運算
& | ^ ! AND、OR、XOR、NOT運算
舉例:
$ a=5; b=7; c=2
$ echo $((a+b*c))
19
$ echo $(((a+b)/c))
6
$ echo $(((a*b)%c))
1
在$(( ))中的變量名稱也可以在其前面加 $ 符號:$(($a+$b*$c))也可以得到 19 的結果。
此外,$(( ))還可以作不同進制(如二進制、八進位、十六進制)運算,只是輸出結果皆爲十進制而已。
echo $((16#2a)) 結果爲 42 (16進位轉十進制)
舉一個實用的例子:
當前的 umask 是 022,新建文件的權限爲:
$ umask 022
$ echo "obase=8; $(( 8#666 & (8#777 ^ 8#$(umask)) ))" | bc
644
事實上,單純用(( ))也可以重定義變量值,或作testing:
a=5; ((a++)) 將 $a 重定義爲 6
a=5; ((a–)) a=4
a=5; b=7; ((a < b)) 會得到 0 (true) 的返回值
常見的用於(( ))的測試符號有以下這些:
< 小於
> 大於
<= 小於或等於
>= 大於或等於
== 等於
!= 不等於

shell腳本編程支持此類運算,包括比較運算、判斷文件是否存在等。基本的if條件命令選項有: - eq —比較兩個參數是否相等(例如,if [ 2 –eq 5 ])
-ne —比較兩個參數是否不相等 
-lt —參數1是否小於參數2 
-le —參數1是否小於等於參數2 
-gt —參數1是否大於參數2 
-ge —參數1是否大於等於參數2 
-f — 檢查某文件是否存在(例如,if [ -f "filename" ]) 
-d — 檢查目錄是否存在 

if ....; then 
  .... 
elif ....; then 
  .... 
else 
  .... 
fi
[ -f "somefile" ] :判斷是否是一個文件 
[ -x "/bin/ls" ] :判斷/bin/ls是否存在並有可執行權限 
[ -n "$var" ] :判斷$var變量是否有值 
[ "$a" = "$b" ] :判斷$a和$b是否相等
    -r file     用戶可讀爲真 
  -w file     用戶可寫爲真 
  -x file     用戶可執行爲真 
  -f file     文件爲正規文件爲真 
  -d file     文件爲目錄爲真 
  -c file     文件爲字符特殊文件爲真 
  -b file     文件爲塊特殊文件爲真 
  -s file     文件大小非0時爲真 
  -t file     當文件描述符(默認爲1)指定的設備爲終端時爲真  
######################################################### 

a=`hdfs dfs -du /user/departmet/ | grep /user/department/gc |awk '{print $1}'`
b=`awk 'BEGIN{printf "%.2f%\n",(c/d)*100}'`

cat /etc/profile | nc -lk 9999 如果把某個文件作爲nc的輸入 ,把文件內容輸入到9999端口
wc -l ** 可以查看文件**的行數

Linux中常常會使用到cut命令來分割字符串,下面說明下cut命令參數的使用:
         -d  指定分隔符,如:按照“:”分割,-d:
         -c  提取第n個字節,如:-c5,表示提取每行的第5個字節,-c5-14,表示提取每行的第5-14個字節,-c1,5,14,表示提取第1、5、14個字節。
         -f  指定輸出的域
         實例:cut  –d:  -f1,2   //按照”:”來分割,並輸出第1和2段
[root@centos ~]# cat test.txt
1:2:3
a:b:c
[root@centos ~]# cut -d: -f1,2 test.txt 後邊只能接文件
1:2
a:b

  split=`echo $user|cut -d ":" -f$i` 字符串使用|這種方式

!shell腳本中的$*,$@和$#
舉例說:
腳本名稱叫test.sh 入參三個: 1 2 3
運行test.sh 1 2 3後
$*爲"1 2 3"(一起被引號包住)
$@爲"1" "2" "3"(分別被包住)
$#爲3(參數數量


!linux後臺運行和關閉、查看後臺任務
fg、bg、jobs、&、nohup、ctrl+z、ctrl+c 命令
一、&
加在一個命令的最後,可以把這個命令放到後臺執行,如
watch  -n 10 sh  test.sh  &  #每10s在後臺執行一次test.sh腳本
二、ctrl + z
可以將一個正在前臺執行的命令放到後臺,並且處於暫停狀態。
三、jobs
查看當前有多少在後臺運行的命令
jobs -l選項可顯示所有任務的PID,jobs的狀態可以是running, stopped, Terminated。但是如果任務被終止了(kill),shell 從當前的shell環境已知的列表中刪除任務的進程標識。
四、fg
將後臺中的命令調至前臺繼續運行。如果後臺中有多個命令,可以用fg %jobnumber(是命令編號,不是進程號)將選中的命令調出。
五、bg
將一個在後臺暫停的命令,變成在後臺繼續執行。如果後臺中有多個命令,可以用bg %jobnumber將選中的命令調出。
六、kill
法子1:通過jobs命令查看job號(假設爲num),然後執行kill %num
法子2:通過ps命令查看job的進程號(PID,假設爲pid),然後執行kill pid
前臺進程的終止:Ctrl+c
七、nohup
如果讓程序始終在後臺執行,即使關閉當前的終端也執行(之前的&做不到),這時候需要nohup。該命令可以在你退出帳戶/關閉終端之後繼續運行相應的進程。關閉中斷後,在另一個終端jobs已經無法看到後臺跑得程序了,此時利用ps(進程查看命令)
ps -aux | grep "test.sh"  #a:顯示所有程序 u:以用戶爲主的格式來顯示 x:顯示所有程序,不以終端機來區分

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