Shell脚本快速上手

〇、准备工作

  • Shell种类:

Linux 的 Shell 种类众多,常见的有:

Bourne Shell(/usr/bin/sh或/bin/sh)
Bourne Again Shell(/bin/bash)
C Shell(/usr/bin/csh)
K Shell(/usr/bin/ksh)
Shell for Root(/sbin/sh)
……

执行shell脚本的过程

  • 创建一个脚本文件:

sh0.sh

#!/bin/bash
echo "Hello World !"

脚本的第一行约定了使用哪一种 Shell。

  • 添加可执行权限:
chmod +x ./sh0.sh
  • 执行脚本:
# 执行方式1
./sh0.sh
# 执行方式2
/bin/bash sh0.sh

Shell语法规则总结

可以看完这篇博客了再来看这些规则。

  • 单引号中不能转义字符,也不能使用变量。
  • 赋值的=两侧不能有空格。
  • 使用表达式时,运算符号两侧要有一个空格。

一、变量

sh1-0.sh

#!/bin/bash

# 声明变量
my_name="tracy"
# 使用变量,建议使用{}把变量包裹起来,虽然不用也可以
echo ${my_name}

# 变量可重新赋值
my_name="tracy1"
echo ${my_name}

# 设置变量为只读
read_only_var="read only var"
readonly read_only_var
# 下面这一行会报错
# read_only_var="change var"
echo ${read_only_var}

# 删除变量
unset my_name
# 下面这一行不会打印任何内容,因为访问了一个不存在的变量
echo ${my_name}
  • 命名规则:
    命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
    中间不能有空格,可以使用下划线 _。
    不能使用标点符号。
    不能使用bash里的关键字(见本教程最后一章)。

1.字符串

sh1-1.sh

#!/bin/bash

# 建议使用双引号,支持转义字符和变量
my_name="tracy"
str="Hello, I am \"$my_name\"!"
echo $str

# 获取字符串长度
echo "字符串长度:"${#str}

# 提取子串,从第5个字符开始,提取5个字符
echo "提取子串:"${str:13:5}

# 查找字符e或者n的位置,那个先出现就先计算哪个
echo "查找字符e或n:"`expr index "$str" en`

2.数组

sh1-2.sh

#!/bin/bash

# 声明数组
array=(1 2 3 4 5)
# 单个元素赋值
array[5]=6

# 访问数组元素array[0]
echo ${array[0]}

# 取得数组元素个数 #array[@] 或者 #array[*]
length=${#array[@]}
echo "数组长度"$length
length=${#array[*]}
echo "数组长度"$length

# 获取数组中所有的元素
echo "数组中的所有的元素:"${array[*]}
echo "数组中的所有的元素:"${array[@]}

# 获取数组中所有的键
echo "数组中的所有的键:"${!array[*]}
echo "数组中的所有的键:"${!array[@]}

# 取得数组单个元素的长度
length=${#array[3]}
echo "第3个元素的长度"$length

# 使用key-value形式的数组,相当于字典
declare -A site=(["google"]="www.google.com" ["runoob"]="www.runoob.com" ["taobao"]="www.taobao.com")
# 访问元素
echo ${site["google"]}

3.注释

sh1-3.sh

#!/bin/bash

# 这是单行注释

# 下面是多行注释,EOF可以替换成单引号、感叹号
:<<EOF
多行注释...
多行注释...
多行注释...
EOF

二、传递参数

  • 首先,在执行脚本时传入一个参数列表:
./sh2.sh 1 2 3 4 5
  • 在脚本中获取并处理参数:

sh2.sh

#!/bin/bash

# 获取参数
echo "获取参数:";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";

# 获取参数个数
echo "参数个数为:$#"

# 获取所有参数
echo "所有参数:$*"
echo "所有参数:$@"

# 获取脚本运行的当前进程ID号
echo "当前进程ID号:$$"

# 获取后台运行的最后一个进程的ID号
echo "最后一个进程ID号:$!"

三、运算符

sh3.sh

#!/bin/bash

a=10
b=20

echo "---算术运算符---"

val=`expr $a + $b`
echo "a + b : $val"

val=`expr $a - $b`
echo "a - b : $val"

val=`expr $a \* $b`
echo "a * b : $val"

val=`expr $b / $a`
echo "b / a : $val"

val=`expr $b % $a`
echo "b % a : $val"

val=`expr $b == $a`
echo "b == a : $val"

val=`expr $b != $a`
echo "b != a : $val"

echo "---关系运算符---"

if [ $a -eq $b ]
then
   echo "$a -eq $b : a 等于 b"
else
   echo "$a -eq $b: a 不等于 b"
fi
if [ $a -ne $b ]
then
   echo "$a -ne $b: a 不等于 b"
else
   echo "$a -ne $b : a 等于 b"
fi
if [ $a -gt $b ]
then
   echo "$a -gt $b: a 大于 b"
else
   echo "$a -gt $b: a 不大于 b"
fi
if [ $a -lt $b ]
then
   echo "$a -lt $b: a 小于 b"
else
   echo "$a -lt $b: a 不小于 b"
fi
if [ $a -ge $b ]
then
   echo "$a -ge $b: a 大于或等于 b"
else
   echo "$a -ge $b: a 小于 b"
fi
if [ $a -le $b ]
then
   echo "$a -le $b: a 小于或等于 b"
else
   echo "$a -le $b: a 大于 b"
fi


echo "---布尔运算符---"

if [ $a != $b ]
then
   echo "$a != $b : a 不等于 b"
else
   echo "$a == $b: a 等于 b"
fi
if [ $a -lt 100 -a $b -gt 15 ]
then
   echo "$a 小于 100 且 $b 大于 15 : 返回 true"
else
   echo "$a 小于 100 且 $b 大于 15 : 返回 false"
fi
if [ $a -lt 100 -o $b -gt 100 ]
then
   echo "$a 小于 100 或 $b 大于 100 : 返回 true"
else
   echo "$a 小于 100 或 $b 大于 100 : 返回 false"
fi
if [ $a -lt 5 -o $b -gt 100 ]
then
   echo "$a 小于 5 或 $b 大于 100 : 返回 true"
else
   echo "$a 小于 5 或 $b 大于 100 : 返回 false"
fi



echo "---逻辑运算符---"

if [[ $a -lt 100 && $b -gt 100 ]]
then
   echo "返回 true"
else
   echo "返回 false"
fi

if [[ $a -lt 100 || $b -gt 100 ]]
then
   echo "返回 true"
else
   echo "返回 false"
fi

四、打印命令

%s 输出一个字符串,%d 整型输出,%c 输出一个字符,%f 输出实数,以小数形式输出。

%-10s 指一个宽度为 10 个字符(- 表示左对齐,没有则表示右对齐),任何字符都会被显示在 10 个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。

%-4.2f 指格式化为小数,其中 .2 指保留2位小数。

sh4.sh

#!/bin/bash

echo "echo命令示例:"
echo -e "OK! \n" # -e 开启转义
echo -e "OK! \c" # -e 开启转义 \c 不换行
echo '$name\"' # 单引号原样输出字符串,不转义
echo `date` # 显示命令执行结果

# printf格式化打印
echo "printf命令示例:"
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg  
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876

五、文件测试

在这里插入图片描述

sh5.sh

#!/bin/bash

cd /usr/local
if test -e ./bash
then
    echo '文件已存在!'
else
    echo '文件不存在!'
fi

六、流程控制

sh6.sh

#!/bin/bash


echo -e "\n---单行的if else---\n"

a=1
b=2

if (($a == $b)); then echo "true"; else echo "false"; fi

echo -e "\n---多行的if else---\n"

if [ $(ps -ef | grep -c "ssh") -gt 1 ]; 
then
	echo "true"; 
else
	echo "false"; 
fi


echo -e "\n---elif---\n"

a=10
b=20
if [ $a == $b ]
then
   echo "a 等于 b"
elif [ $a -gt $b ]
then
   echo "a 大于 b"
elif [ $a -lt $b ]
then
   echo "a 小于 b"
else
   echo "没有符合的条件"
fi

echo -e "\n---for循环---\n"

for loop in 1 2 3 4 5
do
    echo "The value is: $loop"
done

for str in This is a string
do
    echo $str
done

echo -e "\n---while循环---\n"

int=1
while(( $int<=5 ))
do
    echo $int
    let "int++"
done

echo -e "\n---until do循环---\n" # 相当于java的do while

a=0

until [ ! $a -lt 10 ]
do
   echo $a
   a=`expr $a + 1`
done

echo -e "\n---case ... esac---\n" # 相当于java的switch case

num=2

case "$num" in
   1) echo "您选择了1"
   ;;
   2) echo "您选择了2"
   ;;
   3) echo "您选择了3"
   ;;
esac

echo -e "\n---break用于跳出循环---\n"

for loop in 1 2 3 4 5
do
	if (($loop == 3))
	then
    	break
	fi
	echo "The value is: $loop"
done

echo -e "\n---continue用于跳过这轮循环---\n"

for loop in 1 2 3 4 5
do
	if (($loop == 3))
	then
    	continue
	fi
	echo "The value is: $loop"
done

七、函数

sh7.sh

#!/bin/bash

# 定义函数
fun(){
	echo "fun"
	# 获取传入的参数
	echo "传入的第一个参数:$1"
}

# 调用
fun 1

八、输入输出到文件

sh8.sh

#!/bin/bash

echo -e "\n---将输出重定向到users文件(写入)---\n"
echo "tracy" > users
cat users

echo -e "\n---将输入重定向到users文件---\n"
# wc -l显示users文件的行数
wc -l < users
cat users

echo -e "\n---将输入重定向到users文件(追加)---\n"
# wc -l显示users文件的行数
echo "tracy1" >> users
cat users

bash关键字

Bash是一种常用的Unix和Linux操作系统的命令行解释器和脚本语言。以下是Bash中的一些关键字(keywords):

  1. if:条件语句的关键字,用于执行基于条件的分支。

  2. then:与if语句配合使用的关键字,用于指定条件成立时要执行的命令。

  3. else:与if语句配合使用的关键字,用于指定条件不成立时要执行的命令。

  4. elif:与if语句配合使用的关键字,用于指定多个条件的判断。

  5. fi:与if语句配合使用的关键字,用于结束条件语句块。

  6. for:循环语句的关键字,用于执行基于列表的循环。

  7. while:循环语句的关键字,用于执行基于条件的循环。

  8. until:循环语句的关键字,用于执行基于条件的循环,条件为假时继续执行。

  9. do:与循环语句配合使用的关键字,用于指定循环体的开始。

  10. done:与循环语句配合使用的关键字,用于结束循环体。

  11. case:条件语句的关键字,用于根据不同的条件执行不同的命令。

  12. esac:与case语句配合使用的关键字,用于结束case语句块。

  13. function:定义函数的关键字。

  14. return:从函数中返回的关键字。

  15. break:跳出循环或case语句的关键字。

  16. continue:跳过当前循环的剩余部分并继续下一次循环的关键字。

  17. declare:声明变量或函数的关键字。

  18. export:导出变量为环境变量的关键字。

  19. local:声明局部变量的关键字。

  20. readonly:声明只读变量的关键字。

这些关键字在Bash中具有特殊的含义和功能,用于控制程序流程、定义函数、声明变量等。使用这些关键字可以编写复杂的脚本和命令,实现各种任务和逻辑。

  • 11
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
shell脚本编程实战手册》中包含了100个拿来就用的《shell脚本案例》[1]。这些实战案例涵盖了各种常见的Shell脚本编程场景,可以帮助读者更好地学习和理解Shell脚本编程。每个案例都有详细的代码示例和解释,让读者能够迅速上手并应用到实际项目中。无论是初学者还是有一定经验的开发者,都能从这些实战案例中获得实用的技巧和经验。除了100个实战案例,手册中还包含了Shell脚本编程的基础知识、流程控制、函数、数组、字符串处理等内容,全面而详实。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [100个超实用的Shell拿来就用脚本示例](https://blog.csdn.net/Dou_Hua_Hua/article/details/121356771)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [shell编程100例](https://blog.csdn.net/admans/article/details/125617465)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TracyCoder123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值