shell脚本笔记
2017年04月21日

在远端服务器~/bin/下添加修改权限的脚本

#!/bin/bash
chown -R root:root /var/www/html/*
find /var/www/html/ -type d | xargs -i chmod 755 {}
find /var/www/html/ -type f | xargs -i chmod 644 {}

bash tab补全忽略大小写

echo "set completion-ignore-case on" > ~/.inputrc

备份系统

    #livecd
    mount /dev/sdax /mnt/gentoo
    mount /dev/sday /mnt/gentoo/boot
    cd /mnt/gentoo
    
    #除了这几个文件夹和文件其他都备份 
    tar cvpjf backup.tar.bz2 . --exclude=./proc --exclude=./lost+found --exclude=./backup.tar.bz2 --exclude=./mnt
    
    #同样还原的时候也是做以上三部操作
    tar xvpfj backup.tar.bz2 -C .

initrd.img

    #解压initrd.img
    zcat /boot/initrd.img | cpio -id  
    #压缩initrd.img
    find . |  cpio -H newc --create  | gzip -9 > ../initrd.img  

获取文件名(要求文件必须有扩展名, .分隔)

    ${file%\.*}

获取扩展名

    ${file##*.}

批量转换格式

#修改文件默认分隔符为换行符
IFS=$'\n'
path="~/downloads"
#ls -1 每行输出一个文件
for i in `ls -1 ${path}`;do
    if [ ${i##*.} == "cgo" ];then
    	if [ -f `echo ${i%\.*}.mp3` ];then
    		echo "${i%\.*}.mp3 已经存在"
    	else
    		ffmpeg -i $i ${i%\.*}.mp3
    	fi
    fi
done

传递集合

    #{}代表前边的集合
    #{1..5} 输出1 2 3 4 5 
    for ((i=1;i<=50;i++))do echo 1_$i;done | xargs -i cat {} >> 1.wmv
    echo aa bb cc | cat {} >> 1.wmv

所有目录变成小写字母

    for i in `ls $HOME`;do
        new_name=$(echo $i | tr '[A-Z]' '[a-z]')
        mv $HOME/$i $HOME/$new_name
    done

"–"的作用是表示后边的内容当错参数而不是命令的选项,这在grep或者getopt中会看到
例如查找file1文件中包含-o的行

    cat file1 | grep -- -o

getopt


    ARGS=`getopt -o ab:c:: -l along,blong:,clong:: -n 'gitsync.sh' -- "$@"`
    #TEMP=`getopt -q -o p:h -l start,help -- -s -h -w --start --help `
    
    #利用getopt格式化所有参数
    #-q 安静模式
    #-o 包含短参数 例如"-a -b"
    #-l 包含长参数 例如"--help --path"
    #``之间的内容会先被执行,然后把结果赋值给TEMP变量
    #--左边的内容为getopt的选项,右边的内容为getopt的参数
    #-o p:h 短选项包含-s -h,而p选项有参数,类似于"cmd -p /usr/bin"

    eval set -- "$TEMP"
    #将$TEMP的内容重新赋值给$1 $2 ...

    #local代表定义局部变量,作用于在当前函数
    #shift将参数索引向右移动,例如shift 4表示$4现在变成$1(读取$1的值就是$4的值,$2是$5以此类推)
    
    local a=0

    #-n 判断字符串长度大于0
    while [ -n "$1" ];do
        case "$1" in
            -a|--along) 
                echo "Option a";
                a=1
                shift
                
            ;;
            -b|--blong)
                echo "Option b, argument $2";
                shift 2
            ;;
            -c|--clong)
                case "$2" in
                    "")
                        echo "Option c, no argument";
                        shift 2  
                    ;;
                    *)
                        echo "Option c, argument $2";
                        shift 2;
                    ;;
                esac
            ;;
            --)
                shift
                break
            ;;
            *)
                echo "Internal error!"
                exit 1
            ;;
        esac
    done

#处理剩余的参数
    for arg in $@
    do
        echo "processing $arg"
    done
    

getopts

    while getopts ":uihs" arg
    do
        case ${arg} in
            u)
                #option u
                ;;
            i)
                #option i
                ;;
            h)
                #option h
                ;;
            s)
                #option s
                ;;
           ?)
                #捕获所有无效参数
                return 1
                ;;
        esac
    done

getopts只能接收短选项,但是相对getopts操作更简单

后台运行命令

(/path/of/command &)