shell脚本编程(基础)

  • 输出字符串hello world
[root@ruozedata001 learn_shell]# vi test.sh
#!/bin/bash

echo "hello world!"

# 默认是没有可执行权限的
[root@ruozedata001 learn_shell]# ll
总用量 4
-rw-r--r-- 1 root root 34 8月  24 07:53 test.sh

# 修改文件权限 给文件拥有者可执行权限
[root@ruozedata001 learn_shell]# chmod u+x test.sh
# 两种执行方式 1.相对路径 2.绝对路径
[root@ruozedata001 learn_shell]# ./test.sh
hello world!
[root@ruozedata001 learn_shell]# /root/learn_shell/test.sh
hello world!
  • shell debug模式
[root@ruozedata001 learn_shell]# vi debug.sh
#!/bin/bash -x 

echo "hello"
echo "world"
echo "!"
[root@ruozedata001 learn_shell]# chmod u+x debug.sh
[root@ruozedata001 learn_shell]# ./debug.sh 
+ echo hello
hello
+ echo world
world
+ echo '!'
!
  • 变量定义与引用
[root@ruozedata001 learn_shell]# vi variable.sh
#!/bin/bash

HW="hello world"
DATE1="date"
DATE2=`date`

echo $HW
echo ${DATE1}
echo ${DATE2}

[root@ruozedata001 learn_shell]# chmod u+x variable.sh 
[root@ruozedata001 learn_shell]# ./variable.sh 
hello world
date
2019年 08月 24日 星期六 09:07:33 CST

⚠️ 注意点

  1. = 前后不能有空格
  2. 变量名称一般为大写
  3. 调用变量最好使用{} 例如:${date1}
  4. 字符串可用单引号 也可以用双引号 区别是双引号中可以引用变量,如果字符串是连起来的,中间没有空格,也可以不加单引号、双引号
  • 参数传递
[root@ruozedata001 learn_shell]# vi param.sh
#!/bin/bash

echo "第一个参数:"$1  # 获取第一个参数
echo "第二个参数:"$2  # 获取第二个参数
echo "$#"            # 参数的个数
echo "$*"            # 打印所有的参数
echo "PID: $$"       # 执行当前sh的pid
[root@ruozedata001 learn_shell]# chmod u+x param.sh
[root@ruozedata001 learn_shell]# ./param.sh hello world
第一个参数:hello
第二个参数:world
2
hello world
PID: 2469
[root@ruozedata001 learn_shell]# ./param.sh "hello world"
第一个参数:hello world
第二个参数:
1
hello world
PID: 2470
  • 数组
[root@ruozedata001 learn_shell]# vi array.sh
#!/bin/bash

ARR=(a b c d)
echo ${ARR[@]}   # 打印所有元素
echo ${ARR[3]}   # 打印指定元素 下角标从0开始
echo ${#ARR[@]}  # 数组长度
[root@ruozedata001 learn_shell]# chmod u+x array.sh 
[root@ruozedata001 learn_shell]# ./array.sh 
a b c d
d
4

⚠️ 注意点

1.数组内部元素 用空格隔开

  • if-else
# if-else
[root@ruozedata001 learn_shell]# vi if.sh 
#!/bin/bash

A="abc"
B="edf"
if [ $A == $B ];then
    echo "=="
else
    echo "!="
fi
[root@ruozedata001 learn_shell]# chmod u+x if.sh 
[root@ruozedata001 learn_shell]# ./if.sh 
!=

# if-elif
[root@ruozedata001 learn_shell]# vi if.sh 
#!/bin/bash

a="abc"
b="edf"
if [ $a == $b ];then
    echo "==$b"
elif [ $a == "abc" ];then
    echo "==abc"
else 
    echo "!="
fi

⚠️ 注意点

  1. if 后面的 [ ] 需要给前后元素留空格

  2. == 前后也需要空格

  3. 注意格式:if 开头 fi 结尾

  • for 循环
[root@ruozedata001 learn_shell]# vi forwhile.sh 
#!/bin/bash

echo "---------------------------for 第一种写法"
for X in 1 2 3 4 5
do
    echo $X
done

echo "---------------------------for 第二种写法"

for ((I=1;I<6;I++))
do 
    echo $I
done

echo "---------------------------while 写法"

A=1
while (($A<6))
do
    echo $A
    let "A++"    # A+1
done
[root@ruozedata001 learn_shell]# chmod u+x forwhile.sh 
[root@ruozedata001 learn_shell]# ./forwhile.sh 
---------------------------for 第一种写法
1
2
3
4
5
---------------------------for 第二种写法
1
2
3
4
5
---------------------------while 写法
1
2
3
4
5
  • 分割
[root@ruozedata001 learn_shell]# vi split.sh 
#!/bin/bash

S="a,b,c,d,e"
# 固定写法
OLD_IFS="$IFS"
IFS=","
ARR=($S)
IFS="$OLD_IFS"

for X in ${ARR[*]}
do 
    echo $X
done
[root@ruozedata001 learn_shell]# chmod u+x split.sh 
[root@ruozedata001 learn_shell]# ./split.sh 
a
b
c
d
e
  • awk
[root@ruozedata001 learn_shell]# vi test.log 
a b c
1 2 3

# 打印第一列
[root@ruozedata001 learn_shell]# cat test.log | awk '{print $1}'
a
1

# 打印第一、第二列
[root@ruozedata001 learn_shell]# cat test.log | awk '{print $1,$2}'
a b
1 2

# 打印第一、第二拼接列
[root@ruozedata001 learn_shell]# cat test.log | awk '{print $1$2}'
ab
12

# 打印第一行
[root@ruozedata001 learn_shell]# cat test.log | awk 'NR==1{print}'
a b c

# 打印第一行的第一列
[root@ruozedata001 learn_shell]# cat test.log | awk 'NR==1{print $1}'
a

# 打印除了第一行以外的
[root@ruozedata001 learn_shell]# cat test.log | awk 'NR>1{print}'
1 2 3

# 根据指定分隔符 打印第一列
# 修改下test.log
[root@ruozedata001 learn_shell]# vi test.log
a,b,c
1,2,3
# 打印
[root@ruozedata001 learn_shell]# cat test.log | awk -F "," '{print $1}'
a
1
  • sed

一般用作替换

# 替换第一个
[root@ruozedata001 learn_shell]# cat test.log
a,b,c
1,2,3
[root@ruozedata001 learn_shell]# sed -i 's/a/aa/' test.log
[root@ruozedata001 learn_shell]# cat test.log
aa,b,c
1,2,3

# 全局替换
[root@ruozedata001 learn_shell]# vi test.log
aa,b,c,aa
1,2,3
[root@ruozedata001 learn_shell]# sed -i 's/aa/ii/g' test.log
[root@ruozedata001 learn_shell]# cat test.log 
ii,b,c,ii
1,2,3
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一.编程基本概念 编程逻辑处理方式: 顺序执行 循环执行 选择执行 shell编程:过程式、解释执行编程语言的基...
    楠人帮阅读 5,202评论 0 1
  • bash中变量的种类 局部变量:生效范围为当前shell进程,对当前shell之外的其它shell进程,包括当前s...
    毛利卷卷发阅读 3,318评论 0 1
  • 1.脚本解释器的选择,根据编程需要或个人习惯,选择合适的解释器,常见的是/bin/sh和 /bin/bash 2....
    遇酒无缘阅读 1,648评论 0 0
  • 基础篇 一、输出信息 大部分 Shell 命令都会生成自己的输出信息,在脚本运行时打印到终端屏幕上。但是很多时候,...
    rollingstarky阅读 3,717评论 0 1
  • 故事的开头总是那么一目了然,仿佛让人在一眼之间就看到了结局。可这个今天的这个故事,我却只猜对了开头,却没猜中结局...
    梦雨兰欣阅读 3,984评论 3 2

友情链接更多精彩内容