一些比较好的shellscript脚本

1. 变量与替换

#!/bin/bash

# 变量替换
# 另外, 变量替换还有许多别的语法
# 例如, b=${a/23/bb} 将 23 替换成 bb 等等, 用到时再找
a=375
hello=$a

# 注意空格
# 如果变量中有空格, 那么变量就需要被双引号括起来
hello="a b c    d"
echo $hello   # 输出 a b c d
echo ${hello} # 输出 a b c d
echo "$hello" # 输出 a b c     d
# -------------------------------------------------

# 变量赋值
# 变量什么时候是"裸体"的即前边没有变量符号, 当它被赋值的时候,
#+而不是被引用的时候.

a=123
# 使用 let 赋值
let a=16+5
# 最好将 let 形式写为如下格式, 因为这样的格式会显示赋值语句是一个整体
let "a=16+5"
echo $a   # 显示结果是21
# 如果不使用let, 直接 a=16+5, 那么echo $a 就是 16+5
# 在 for 循环中的变量赋值
for a in 7 8 9 10
do
    echo -n "$a"
done
echo
echo
# 特殊的变量赋值, 把命令的结果赋值给变量
a=`ls -l`
echo $a
echo "$a"
# 与上边的 `` 含义一样
a=$(uname -m)
echo $a



exit 0

2. 个人推荐的测试结构 test

#!/bin/bash

# [] 单中括号
if [ $UID -ne 0 ]
then
    echo "This is not root."
fi

# [[]] 双中括号
if [[ $comparison = "integer" ]]
then
    echo "test"
fi

# 注意, 使用[[]], 而不是[], 能够阻止脚本中许多逻辑错误, 比如, 尽管在[]中将给出一个错误,
#+但是, &&,||,<>操作还是能够工作在一个[[]]中.
    

# 算数测试使用 (())
((0))   # 返回 1
((1))   # 返回 0, 这才是真
(( 5 > 4 ))  # 返回 0, 这才是真

# 比较这里有很多关键参数, 比如 -e, -eq 等, 用时再确认

# 与或非 下边的等价写法
[[ condition1 && condition2 ]]
if [ "$exp1" -a "$exp2" ]
fi

exit 0

3. 个人推荐的算术表达式

#!/bin/bash

n=100

let "n++"  # 101
echo $n
((n++))    # 102
echo $n

exit 0

4. 清除目录下的文件

#!/bin/bash


# clean up version 1
# ---------------------------------------------------------------------------------
cd /tmp/log
cat /dev/null > testfile

echo "Log clean up."


# clean up version 2
# ---------------------------------------------------------------------------------
LOG_DIR=/tmp/log
cd $LOG_DIR
cat /dev/null > testfile

echo "Log clean up."

exit


#clean up version 3
# ---------------------------------------------------------------------------------
LOG_DIR=/tmp/log
ROOT_UID=0
LINES=10
E_XCD=66
E_NOTROOT=67

if [ "$UID" -ne "$ROOT_UID" ]
then
        echo "Must be root to run this script."
        exit $E_NOTROOT
else
        echo "Yes, you are the god root."
fi

if [ -n "$1" ]
then
        lines=$1
else
        lines=$LINES
fi

# E_WRONGAGRS=65
# case "$1" in
# "") lines=50;;
# *[!0-9]*) echo "Usage: `basename $0` file-to-cleanup"; exit $E_WRONGAGRS;;
# *) lines=$1;;

cd $LOG_DIR

if [ `pwd` != "$LOG_DIR" ]
then:
    echo "Can't change to $LOG_DIR."
    exit $E_XCD
fi

# 更有效的实现上边的内容.
# cd /tmp/log || {
#     echo "Cannot change to necessary directory." >&2
#     exit $E_XCD;
# }

tail -$lines testfile > mesg.temp
mv mesg.temp message

echo "Logs cleaned up."

exit 0

5. 个人推荐的逻辑 与, 或

#!/bin/bash

# 逻辑与
if [ condition1 ] && [ condition2 ]
fi
if [[ condition1 && condition2 ]]
fi

# 逻辑或
if [ condition1 ] || [ condition2 ]
fi
if [[ condition1 || condition2 ]]
fi

6. 最大公约数

#!/bin/bash

# 最大公约数

ARGS=2
E_BADARGS=65

# 参数检查
if [ $# -ne "$ARGS" ]
then
        echo "Usage: `basename $0` first-number second-number"
        exit $E_BADARGS
fi

gcd()
{
    dividend=$1
    divsor=$2

    remainder=1

    until [ "$remainder" -eq 0 ]
    do
            let "remainder=$dividend%$divsor"
            dividend=$divsor
            divsor=$remainder
    done
}

# 另外, 有关函数调用
#+上边定义了一个函数, 然后下边调用, 将参数传递进去的办法如下
gcd $1 $2
echo; echo "GCD of $1 and $2 = $dividend"; echo

exit 0
原文地址:https://www.cnblogs.com/moveofgod/p/4298779.html