shell脚本入门

This is about shell

Posted by PsycheLee on 2015-09-08

Shell脚本入门

1. shell脚本创建

1
2
#! /bin/bash 【推荐】
echo "hello world"

2. shell脚本运行

  • 全路径直接运行
  • ./ 运行
1
2
3
4
5
6
7
8
[root@hadoop001 shell]# /root/shell/wordcount.sh  
-bash: /root/shell/wordcount.sh: Permission denied
[root@hadoop001 shell]# ./wordcount.sh
-bash: ./wordcount.sh: Permission denied
####加执行权限
[root@hadoop001 shell]# chmod 654 wordcount.sh
[root@hadoop001 shell]# ./wordcount.sh
hello world
  • sh 命令执行
1
2
3
4
####没有执行权限也可以执行
[root@hadoop001 shell]# sh wordcount.sh
hello world
####调试

3.shell脚本调试

  • 脚本首行 -x
1
2
3
4
5
6
7
8
9
[root@hadoop001 shell]# vi wordcount.sh 

#!/bin/bash -x

echo "hello world"

[root@hadoop001 shell]# ./wordcount.sh
+ echo 'hello world'
hello world
  • sh -x 执行脚本 【推荐】
1
2
3
[root@hadoop001 shell]# sh -x wordcount.sh 
+ echo 'hello world'
hello world

4.变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@hadoop001 shell]# vi variable.sh
#!/bin/bash

name="xiaoming"

date=`date`


echo $name
echo ${date}

[root@hadoop001 shell]# sh variable.sh
xiaoming
Fri Nov 20 21:31:13 CST 2020
[root@hadoop001 shell]# sh variable.sh
xiaoming
Fri Nov 20 21:31:16 CST 2020
  • 静态变量: k=“v” k=‘v’ k=v 【推荐 字符串加双引号】
  • 动态变量: k=`v`

​ =前后不能有空格

  • 引用

    $k ${k} 【推荐加上花括弧】

5.传参

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@hadoop001 shell]# vi parameter.sh
#!/bin/bash

echo $1
echo $2
echo "个数:$#"
echo "传递参数作为一个字符串显示:$*"
echo "PID:$$"

[root@hadoop001 shell]# sh parameter.sh a b
a
b
个数:2
传递参数作为一个字符串显示:a b
PID:12038
  • 参数传递 *.sh 后面的值, 用空格分隔

  • 如果传入的参数要作为一个整体,用""括起来

    1
    2
    3
    4
    5
    6
    [root@hadoop001 shell]# sh parameter.sh "a b"
    a b

    个数:1
    传递参数作为一个字符串显示:a b
    PID:12168

    【PID】重要,杀死进程的时候必须知道准确的PID

6.数组

用括号括起来, 空格分隔

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@hadoop001 shell]# vi array.sh
#!/bin/bash

arr=(xiaoming tom jerry mm)

echo ${arr[*]}
echo ${arr[0]}
echo ${arr[1]}
echo "数组的长度${#arr[*]}"

[root@hadoop001 shell]# sh array.sh
xiaoming tom jerry mm
xiaoming
tom
数组的长度4

* 也可以换成@

7.if判断

  • if后面的[]内前后要有空格 ==前后也要有空格
  • 字符串比较最好加上""
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@hadoop001 shell]# vi if.sh
#!/bin/bash

a="abc"
b="mm"

if [ "$a" == "$b" ];then ###如果then换行 ; 可以不写
echo "相等"
else
echo "不等"
fi


[root@hadoop001 shell]# sh if.sh
不等
####调试模式
[root@hadoop001 shell]# sh -x if.sh
+ a=abc
+ b=mm
+ '[' abc == mm ']'
+ echo 不等
不等

elif

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

a="abc"
b="mm"

if [ $a == $b ]
then
echo "相等"
elif [ "$a" == "abc" ]
then
echo "abc"
else
echo "不等"
fi

[root@hadoop001 shell]# sh -x if.sh
+ a=abc
+ b=mm
+ '[' abc == mm ']'
+ '[' abc == abc ']'
+ echo abc
abc
  • 判断数值

    • 数字判断一些命令:

      -gt是大于

      -lt是小于

      -eq是等于

      -ne是不等于

      -ge是大于等于

      le是小于等于

    1
    2
    3
    4
    5
    6
    7
    8
    [root@hadoop001 shell]# vi number.sh  
    #!/bin/bash
    if [ $1 -gt $2 ]
    then echo "参数$1大于参数$2"
    else echo "参数$1小于参数$2"
    fi
    [root@hadoop001 shell]# sh number.sh 2 4
    参数2小于参数4
  • 判断文件是否存在,是否为空

    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
    #!/bin/sh
    # 说明:判断文件是否存在

    myPath="/root/test"
    myFile="/root/test/1.log"

    # 这里的-x 参数判断$myPath是否存在并且是否具有可执行权限
    if [ ! -x "$myPath" ]; then
    mkdir "$myPath"
    fi
    # 这里的-d 参数判断$myPath是否存在
    if [ ! -d "$myPath" ]; then
    mkdir "$myPath"
    fi

    # 这里的-f参数判断$myFile是否存在
    if [ ! -f "$myFile" ]; then
    touch "$myFile"
    fi

    # 这里的-s参数判断$myFile是否为空
    if [ -s "$myFile" ]; then
    echo "hi"
    else
    echo "empty"
    fi

8.循环

  • for循环
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
[root@hadoop001 shell]# vi for.sh
#!/bin/bash

for x in 1 2 3 4 5
do
echo $x
done

for ((i=1;i<10;i++))
do
echo $i
done
[root@hadoop001 shell]# sh for.sh
1
2
3
4
5
1
2
3
4
5
6
7
8
9
  • while循环

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    [root@hadoop001 shell]# vi while.sh
    #!/bin/bash

    j=1
    while(($j<10))
    do
    echo $j
    let "j++"
    done
    [root@hadoop001 shell]# sh while.sh
    1
    2
    3
    4
    5
    6
    7
    8
    9

9.分隔语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@hadoop001 shell]# vi split.sh
#!/bin/bash

a="mm,tom,jerry,lingling,gg"

OLD_IFS="$IFS"
IFS=","
arr=($a)
IFS="$OLD_IFS"

for x in ${arr[*]}
do
echo $x
done
[root@hadoop001 shell]# sh split.sh
mm
tom
jerry
lingling
gg
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@hadoop001 shell]# vi split1.sh 
#!/bin/bash

a="mm,tom,jerry,lingling,gg"

arr2=(${a//,/ })
for x in ${arr2[*]}
do
echo $x
done
[root@hadoop001 shell]# sh split1.sh
mm
tom
jerry
lingling
gg