Bash

First Post:

Last Update:

Word Count:
1.4k

Read Time:
7 min

简单的输入输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#! /bin/bash

# 简单的输入输出

#数组
name[0]=Logan
name[1]=Mike

echo "Hello `whoami` !"
echo "Your name is ${name[0]}, and your friend is ${name[1]}"

#input
read -p "What do you like?" like
echo "Yeah I see, you like ${like}"

name

1
2
3
4
5
6
7
8
9
10
#!/bin/bash

read -t 30 -p "Plese input your name:" name
echo "Your name is:"$name
read -t 30 -s -p "Plese input your age" age
echo -e "\nYour age is $age"
read -n 1 -t 30 -p "Please select your sex[m/f]" gender
echo -e "\n"
echo "Sex is $gender"

运算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
echo "Please you input two number!"
num1=$1
num2=$2
num3=$*
num4=$@
num5=$#
total=$(($num1+$num2))
echo -e "\e[1;37m OK: \e[0m"
echo $total
echo $num3
echo $num4
echo $num5

bash内置变量(通识符)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#! /bin/bash

# set 命令为位置参数赋值或重新赋值[1~9]
set a b c d e f
echo $1 $2 $3 $4 $5 $6

echo "use shift to move var"
shift
echo $1 $2 $3 $4 $5

echo "move 2"
shift 2
echo $1 $2 $3

# $#表示上一个命令的参数个数,不包含shell脚本本身
echo -e "\n\$# 参数个数"
echo $#

# $?:表示上一条命令执行后的返回值(也称为“返回码”“退出状态”“退出码”
#等),它是一个十进制数。多数 shell 命令执行成功时,返回值为 0;若执行失败,则返回
#非 0 值。shell 本身返回$?的当前值作为 shell 命令的退出状态
echo -e "\n\$? 上一条命令的返回值"
echo $?


# $$:表示当前进程的进程号. 每个进程都有唯一的进程号(即 PID)
echo -e "\n\$$ 进程号"
echo $$

# $!:表示上一个后台命令对应的进程号,是一个由 1~5 位数字构成的数字串
echo -e "\n\$! 上一个命令的进程号(退出就没有了)"
echo $!

# $-:是由当前 shell 设置的执行标志名组成的字符串. 例如,“set -xv”命令行给
#shell 设置标志-x 和-v(用于跟踪输出)
echo -e "\n\$- 标志名组成的字符串"
echo $-

# $*:表示在命令行中实际给出的所有实参字符串,并不仅限于 9 个实参
echo -e "\n\$* 实参字符串"
echo $*

# $@: 与$*的功能基本相同,表示在命令行中给出的所有实参,但"$@"与"$*"不同
echo -e "\n\$@ 实参字符串"
echo $@

# 证实 $* 与$2不同
echo -e "\n证实 \$* 与\$2不同"

date
set `date`
echo -e "\n\$* print"
echo $*
for i in "$*"
do
echo $i;
done
echo -e "\n\$@ print"
echo $@
for i in "$@"
do
echo $i;
done

echo "end"


打印参数

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
# for i in "$*"
# do
# echo "The parameters is:$i"
# done
x=1
for y in "$@"
do
echo "The parameter$x is:$y"
x=$(($x+1))
done

if else

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#! /bin/bash

echo "Input two numbers"

read x y
((z=x+y))
if [[ z -gt 10 ]] # gt:大于 lt:小于
then
echo "x+y>10"
else
echo "x+y<=10"
fi

((x*=y))
((x%=5))

if [[ x -le 100 || z -ne 0 ]] # or
then
echo "x*y<100 or (x+y)%5!=0"
fi

echo "Your current directory is `pwd`"
echo "Input a filename ->"
read name
filename=${name:=./}

if [[ -r $filename && -f $filename ]] # 是文件就查看当前文件
then
cat $filename
elif [[ -d $filename && -x $filename ]] # 是目录就查看当前目录的文件个数
then
cd $filename
ls -l | wc -l
else # 文件不存在
echo "bad file name"
fi


数组

1
2
3
4
5
6
7
8
#!/bin/bash
# 使用冒泡排序算法将数组[52, 39, 68, 94, 75, 6, 31, 43]进行升序排序

#定义数组
array=(52 39 68 94 75 6 31 43)
# 获取长度
len=${#array[@]}
echo $len

排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#! /bin/bash
# 实现功能为冒泡排序

arr=(52 39 68 94 75 6 31 43)
len=${#arr[@]}
for (( i=0; i<$[$len - 1]; i=i+1)); do
for (( j=0; j<$[$len - $i - 1]; j=j+1)); do
if [ ${arr[$j]} -gt ${arr[$[$j+1]]} ]; then
temp=${arr[$j]}
arr[$j]=${arr[$[$j+1]]}
arr[$[$j+1]]=$temp
fi
done
done

# 打印排序后的arr
for i in "${arr[@]}"; do
echo -n "$i "
done

case

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#! /bin/bash
case "$1" in
1)
month=January;;
2)
month=February;;
3)
month=March;;
4)
month=April;;
5)
month=May;;
6)
month=June;;
7)
month=July;;
8)
month=Aguest;;
9)
month=September;;
10)
month=October;;
11)
month=November;;
12)
month=December;;
*)
month=error;;
esac

echo "Month is $month"

for

1
2
3
4
5
6
7
#!/bin/bash

# seq 是制定数的范围进行打印
for i in `seq 1 100`;do
echo -e "\033[32m$i\033[0m"
done

expr 求和运算

1
2
3
4
5
6
7
8
9
10
#! /bin/bash
# expr 求和运算
# 采用 sh -x for2.sh 可以看执行过程
sum=0
for ((i=1; i <=100; i++))
do
sum=`expr $i + $sum`
done
echo "1 + ... + 100 = $sum"

文件打包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#! /bin/bash
# 实现以当前.sh 文件打包

for i in `find . -name "*.sh"`
do
#echo $i
tar -czf $i.tgz $i
done

if (($1 == 0));then
for j in `find . -name "*.tgz"`;do
rm $j
done
fi

计算小于100的所有正偶数的和

1
2
3
4
5
6
7
8
9
10
11
12
13
#! /bin/bash
# 计算小于100的所有正偶数的和

sum=0

for ((i=2; i<100; i=i+1)); do
if [ $((i%2)) -eq 0 ]; then
sum=$((sum + i))
fi
done

echo "sum: $sum"

打印1~150之间的素数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#! /bin/bash
# 打印1~150之间的素数
asdf=334
for (( i=2; i<=150; i=i+1 )); do
is_found=true
for ((j=2; j<i; j=j+1 )); do
if [ $((i%j)) -eq 0 ]; then
is_found=false;
break
fi
done
if $is_found; then
echo $i
fi
done

select

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#! /bin/bash

while true
do
select menuItem in Show List File Exit
do
case "$menuItem" in
Show)
date
pwd
break;;

List)
who
break;;

File)
ls -al;;

Exit)
exit;;
*)
;;
esac
done
done


实例

mysql备份

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/bin/bash
# Auto backup mysql database
# define backup path

BACK_DIR=./mysql/backup/`date +%Y%m%d`
MYSQL_DB=ltalk
MYSQL_USER=ltalk
MYSQL_PASSWD=123456
MYSQL_CMD=/usr/bin/mysqldump

if [ $UID -ne 0 ]; then
echo "Must be root exec shell script"
exit
fi


if [ ! -d $BACK_DIR ];then
mkdir -p $BACK_DIR
else
echo "This { $BACK_DIR } is existed!"
fi

# Mysql backup
$MYSQL_CMD -u$MYSQL_USER -p$MYSQL_PASSWD -d $MYSQL_DB > $BACK_DIR/$MYSQL_DB.db

# Print result info
if [ $? -eq 0 ];then
echo -e "\033[32mThe mysql backup [$MYSQL_DB Successfully!\033[0m"
else
echo -e "\033[32mThe mysql backup [$MYSQL_DB Failed!\033[0m"
fi

treesize

1
2
3
#! /bin/bash
# 以文件大小进行升序排序
du -sb * | sort -n
打赏点小钱
支付宝 | Alipay
微信 | WeChat