常用语法

shell数组

  1. #A="a b c def" 這樣的變量只是將 $A 替換為一個單一的字串,但是改為 A=(a b c def) ,則是將 $A 定義為組數
  2. ${A[@]} ${A[*]}
  3. #可得到 a b c def (全部組數)
  4. ${A[0]}
  5. #可得到 a (第一個組數),${A[1]} 則為第二個組數...
  6. ${#A[@]} ${#A[*]}
  7. #可得到 4 (全部組數數量)
  8. ${#A[0]}
  9. #可得到 1 (即第一個組數(a)的長度),${#A[3]} 可得到 3 (第四個組數(def)的長度)
  10. A[3]=xyz
  11. #則是將第四個組數重新定義為 xyz

变量替换

#file=/dir1/dir2/dir3/my.file.txt
${file#*/}:拿掉第一條 / 及其左邊的字串:dir1/dir2/dir3/my.file.txt
${file##*/}:拿掉最後一條 / 及其左邊的字串:my.file.txt
${file%/*}:拿掉最後條 / 及其右邊的字串:/dir1/dir2/dir3
${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} 可得到 27 ,因為 /dir1/dir2/dir3/my.file.txt 剛好是 27 個字節

算术运算

#1. 使用expr,需注意空格,脚本中部分操作符需要使用"\"转义
A=`expr 1 + 5`
#2. 使用方括号"[]",空格无要求
A=$[1+2]
#3. 使用bc
echo "(5+6-1)/2" |bc
#4. 使用let
let A=1+2
#5. 使用declare
declare -i number2=2*3+5*13-32+25 && echo $number2

条件测试

#1. 使用test
if test 1 -eq 1;then
#2. 使用方括号"[]",需在条件两边加上括号
if [ 1 -eq 1 ];then

文件测试

-b filename    当filename 存在并且是块文件时返回真(返回0)
-c filename    当filename 存在并且是字符文件时返回真
-d pathname    当pathname 存在并且是一个目录时返回真
-e pathname    当由pathname 指定的文件或目录存在时返回真
-f filename    当filename 存在并且是正规文件时返回真
-g pathname    当由pathname 指定的文件或目录存在并且设置了SGID 位时返回真
-h filename    当filename 存在并且是符号链接文件时返回真 (或 -L filename)
-k pathname    当由pathname 指定的文件或目录存在并且设置了"粘滞"位时返回真
-p filename    当filename 存在并且是命名管道时返回真
-r pathname    当由pathname 指定的文件或目录存在并且可读时返回真
-s filename    当filename 存在并且文件大小大于0 时返回真
-S filename    当filename 存在并且是socket 时返回真
-t fd    当fd 是与终端设备相关联的文件描述符时返回真
-u pathname    当由pathname 指定的文件或目录存在并且设置了SUID 位时返回真
-w pathname    当由pathname 指定的文件或目录存在并且可写时返回真
-x pathname    当由pathname 指定的文件或目录存在并且可执行时返回真
-O pathname    当由pathname 存在并且被当前进程的有效用户id 的用户拥有时返回真(字母O 大写)
-G pathname    当由pathname 存在并且属于当前进程的有效用户id 的用户的用户组时返回真
file1 -nt file2    file1 比file2 新时返回真
file1 -ot file2    file1 比file2 旧时返回真
f1 -ef f2    files f1 and f2 are hard links to the same file

数字测试

int1 -eq int2    如果int1 等于int2,则返回真
int1 -ne int2    如果int1 不等于int2,则返回真
int1 -lt int2    如果int1 小于int2,则返回真
int1 -le int2    如果int1 小于等于int2,则返回真
int1 -gt int2    如果int1 大于int2,则返回真
int1 -ge int2    如果int1 大于等于int2,则返回真

字符串比较测试

-z string    字符串string 为空串(长度为0)时返回真
-n string    字符串string 为非空串时返回真
str1 = str2    字符串str1 和字符串str2 相等时返回真
str1 == str2    同 =
str1 != str2    字符串str1 和字符串str2 不相等时返回真
str1 < str2    按字典顺序排序,字符串str1 在字符串str2 之前
str1 > str2    按字典顺序排序,字符串str1 在字符串str2 之后

一些例子

多条件查找并删除

#查找删除5天以前的文件
find /data/bilogs_S3_haiwai/userinfo_guildinfo_zip/  -mtime +5 -name "*.*" |xargs  rm -Rf {};

格式化输出printf

http://man.linuxde.net/printf

echo -e "Now is printing server's information\n..."
printf "%-10s %-20s %-20s %-20s %-10s %-10s %-10s %-10s\n" OS TIME IP-in IP-out CPU-num MEM-all MEM-free NET-status > ${server_info_file}
for each_host in ${IP_list};do
    #s_addr_eth0=`ssh root@${each_host} "ifconfig eth0 | awk '/inet addr:/{ print $2 }' |  awk -F: '{print $2 }'"`
    s_os_release=`ssh root@${each_host} "cat /etc/redhat-release"|sed 's/.*release/release/g' |awk '{print $2}'`
    s_addr_eth0=`ssh root@${each_host} "ip addr | grep eth0 | grep inet"|awk '{print $2}' |awk -F/ '{print $1}'`
    s_addr_pub=`ssh root@${each_host} "curl -s http://1212.ip138.com/ic.asp" | egrep -o "(([0-9]{1,3}\.){3}[0-9]{1,3})"`
    s_cpu_core=`ssh root@${each_host} "cat /proc/cpuinfo |grep processor"|wc -l`
    s_mem_total=`ssh root@${each_host} "free -g | grep Mem" |awk '{print \$2}'`
    s_mem_use=`ssh root@${each_host} "free -g | grep Mem" |awk '{print $4}'`
    if [ `ssh root@${each_host} "ping -c5 -q www.baidu.com 2>&1" |grep received |awk -F, '{print $2}' |awk '{print $1}'` -ge 3 ] >/dev/null 2>&1;then net_status='yes' ;else net_status='no' ;fi
    s_net_status=$net_status
    s_date_time=`ssh root@${each_host} "date +%x-%T"`
    printf "%-10s %-20s %-20s %-20s %-10s %-10s %-10s %-10s\n" ${s_os_release:-Null} ${s_date_time:-Null} ${s_addr_eth0:-Null} ${s_addr_pub:-Null} ${s_cpu_core:-Null} ${s_mem_total:-Null} ${s_mem_use:-Null} ${s_net_status:-Null} >> ${server_info_file}
done
echo "Now is Done,The result file path is ${server_info_file}"