歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> SHELL編程

shell技巧分享

#man  bash
${VAR_NAME#word}
  取得VAR_NAME中路徑的基名,
  這裡的word表示分隔符,而“#”表示是從左往右的方向分割,加一個“#”表示盡量向右匹配,
      所以“*”是在word的左側
      這裡相當於basename  COMMAND,但是這裡可以針對任何變量。

# Path=/etc/rc.d/init.d/network
# echo ${Path#/}
etc/rc.d/init.d/network
# echo ${Path##/}
etc/rc.d/init.d/network
#echo ${Path##*/}  (從左向右,以"/"為分割符,盡量截掉到最右端,常用)
network

${VAR_NAME%word}  常用來取得路徑中文件的路徑,
      這裡的word仍表示分隔符,而%表示從右往左的方向分割,加一個%表示盡量向左。
      所以“*”的匹配需要從word右側。
# echo ${Path%/*}
/etc/rc.d/init.d

${VAR_NAME:-WORD}
    使用默認值
    當變量為空值時,就使用WORD當做默認值顯示。
${VAR_NAME:=WORD}
    設定默認值
    當變量為空值時,就設定WORD當做默認值顯示並保存到變量。
${VAR_NAME:?WORD}
    當變量為Null或者未設置時,就顯示WORD中的錯誤信息。
${VAR_NAME:+WORD}
    使用替換值
    當變量為Null或者未設置時,什麼都不顯示。
    當變量不為空時,就顯示WORD替換原有的內容。

if判讀語句中的取得奇偶數或者某個數的倍數時,需要使用取模運算:
  比如被除數為I,取值范圍{1..999},除數為9,取得9的倍數的數值為ZHI
(1)    ZHI=$(bc  <<<  "scale=0;$I%9“

(2)    ZHI=$[$I%9]

$0 是腳本本身的名字
$1,$2,$3....為位置變量
$#,表示除$0之外的參數的個數。
$@,除$0之外的參數的列表,這個列表時分開的
$* ,除$0之外的參數的列表,但是這個列表是一個整體
$?,命令執行的狀態返回值
$$ 是腳本運行的當前進程ID號
例子:計算參數列表的和
#!/bin/bash
declare -i SUM=0
for I in $@;do
      SUM+=$I
done
echo $SUM
#./sum.sh  1 2 3
#6


在for循環中計算某個命令執行的次數,比如成功增加用戶的次數,這時可以先在前面定義
  declare  -i COUNT=0
  然後再在for循環中命令執行成功或失敗後,執行COUNT+=1

 

for 、until、while中的continue、break
  continue是返回重新循環。

  break是直接打斷循環

在進行bash字符串測試時,除“>"、"<"、“==”
也使用[[  $option1  =~  $option2  ]]進行模式匹配,
              模式:
              一般做行首、行尾錨定;不要加引號;
              但是不能做詞首、詞尾錨定
              可以使用正則表達式
查找 計算機cpu的公司,這裡使用模式匹配
#!/bin/bash
#
Vendor=`grep "vendor_id" /proc/cpuinfo  | uniq | cut -d: -f2`
或者A=$(grep -o "Genuine.*" /proc/cpuinfo | head -1)
if [[ "$Vendor" =~ [[:space:]]*GenuineIntel$ ]]; then
 echo "Intel"
else
 echo "AMD"
fi


cat  <<  EOF
m|M) show memory usages;
d|D) show disk usages;
q|Q) quit
EOF
在執行時就可以執行並顯示上面的信息了!


遍歷文件內容:
while  read  LINE;do
  state  1

  state  2

done  <  /path/to/somefile
使用read讀取文件的一行,然後保存到LINE變量中,然後執行語句,循環後再讀取第二行進行覆蓋。
如果用戶的ID號為偶數,則顯示其名稱和shell;對所有用戶執行此操作
while read LINE; do
  Uid=`echo $LINE | cut -d: -f3`
  if [ $[$Uid%2] -eq 0 ]; then
    echo $LINE | cut -d: -f1,7
  fi
done < /etc/passwd

使用until或者while時,可以將前面沒有進入循環的變量值重新復制,然後納入循環。
每隔5秒查看Hadoop用戶是否登錄,如果登錄,顯示其登錄並退出;
否則,顯示當前時間,並說明hadoop尚未登錄:
#!/bin/bash
who | grep "^hadoop" &> /dev/null
RetVal=$?
while [ $RetVal -ne 0 ]; do
  date
  sleep 5
  who | grep "^hadoop" &> /dev/null  #這裡既是重新對返回值賦值
  RetVal=$?
done
echo "hadoop is here."

Copyright © Linux教程網 All Rights Reserved