Shell 编程入门指南:从基础到进阶,轻松掌握 Shell 脚本编程技巧--附有测试题目

$shell编程

set nu 显示行号

生成随机数RANDOM

快速入门

文件 shell脚本文件第一行特殊格式

 #!/bin/bash
echo 跟输出内容

shell脚本执行方式

 # 方式一
sh 文件.sh
# 方式二
./文件.sh   相对路径
# 方式三
/root/文件.sh   绝对路径

shell的数据类型

字符串:建议使用双引号

整数型:计算时需要使用"$((运算式))"或"$[运算式]"

变量

变量名=变量值 =号两侧不能有空格

用户变量

 username="itcast"
echo $username
# 结果
itcast

 

只读变量

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

#!/bin/bash 
jdUrl="http://www.jd.com"
readonly jdUrl

删除变量

使用 unset 命令可以删除变量。

 # 语法
unset variable_name

环境变量

可以使用env命令查看所有的系统环境变量

常见环境变量:
PATH 决定了shell将到哪些目录中寻找命令或程序 
HOME 当前用户主目录 
HISTSIZE 历史记录数 
LOGNAME 当前用户的登录名 
HOSTNAME 指主机的名称 
SHELL 当前用户Shell类型 
LANGUGE  语言相关的环境变量,多语言可以修改此环境变量 
MAIL 当前用户的邮件存放目录 
PS1 基本提示符,对于root用户是#,对于普通用户是$

自定义环境变量

1.vi /etc/profile ,在文件末尾加上要定义的环境变量
2.export 变量名=变量值
3.wq 退出
4.source /etc/profile
5.输入 env 查看环境变量,是否有自己定义的环境变量。
6.使用环境变量.环境变量的使用方式和普通变量是一样的:$环境变量名.

 

特殊变量
变量解释
$#命令行参数的个数
$n$1表示第一个参数,$2表示第二个参数,以此类推
$0当前程序的名称
$?前一个命令或许或函数的返回码
$*以“参数1 参数2 。。。”形式保存所有参数
$@以“参数1”“参数2”。。。形式保存所有参数
$$本程序的(进程ID号)PID
$!上一个命令的PID
字符串
#单引号
name='钱学森'
str='我很崇拜$name'
echo $str
#结果 我很崇拜$name
#双引号
name="钱学森"
str="我很崇拜$name"
echo $str
#结果 我很崇拜 钱学森

双引号的优点:

1) 双引号里可以有变量

2) 双引号里可以出现转义字符

 

拼接字符串
#1.双引号拼接
#!/bin/bash
yourname="吴恩达"
wenhou_1="你好,$yourname ."
wenhou_2="你好,"$yourname" ."
wenhou_3="你好,\"$yourname\" ."
echo $wenhou_1 $wenhou_2 $wenhou_3
#你好,吴恩达 . 你好,吴恩达 . 你好,"吴恩达" .
#2.单引号拼接
#!/bin/bash
yourname="钱学森"
wenhou_4='你好,$yourname.'
wenhou_5='你好,'$yourname.''
wenhou_6='你好,"$yourname" .'
echo $wenhou_3 $wenhou_4 $wenhou_5
#你好,$yourname. 你好,钱学森. 你好,"$yourname" .
获取字符串长度

格式:${#变量名}

#!/bin/bash
string="jobs"
echo ${string}    # 输出结果: jobs
echo ${#string}   # 输出结果: 4
提取子字符串

格式:${变量名:起始下标值:截取字符串数量}

#!/bin/bash
str="敢于亮剑决不后退"
echo ${str:2:2}    # 输出结果为: 亮剑
查找子字符串位置

格式:`expr index "$变量名" 查找字符`

#!/bin/bash
string="i am a boy"
echo `expr index "$string" am`    # 输出是: 3
算数运算符

val=`expr 2 + 2`

val=$[a+b]

#!/bin/bash 
a=4 
b=20
#加法运算 
each expr $a + $b 
#减法运算 
echo expr $a - $b 
#乘法运算,注意*号前面需要反斜杠 
echo expr $a \* $b 
#除法运算 
echo $a / $b 
#此外,还可以通过$(())、$[]进行算术运算。 
echo "a = $a" 
c=$((a+b)) 
d=$[a+b] 
echo "c = $c" 
echo "d = $d"
语句判断
数字
运算符说明
-eq检测两个数是否相等,相等返回 true。
-ne检测两个数是否不相等,不相等返回 true。
-gt检测左边的数是否大于右边的,如果是,则返回 true。
-lt检测左边的数是否小于右边的,如果是,则返回 true。
-ge检测左边的数是否大于等于右边的,如果是,则返回 true。
-le检测左边的数是否小于等于右边的,如果是,则返回 true。
字符串
判断符说明
-n STRING字符串长度不为零
-z STRING字符串长度为0
=判断两个字符串是否一样
!=判断两个字符串是否不一样
文件
判断符说明
-f存在且是普通文件
-d存在且是目录
-h存在且是符号链接
-e文件存在
–r文件存在并且可读
–w文件存在并且可写
–x文件存在并且可执行
if语句
if
# 语法
if condition
then
    command1 
    command2
    ...
    commandN 
fi
if else
# 语法
if condition
then
    command1
    command2
    ...
    commandN
else
    command
fi
# 案例
#!/bin/bash
read -p "Enter your score(0-100):" n #-p参数表示给出提示信息
if [ $n -ge 85 ] && [ $n -le 100 ] ; then
 echo "优"
elif [ $n -ge 70 ] && [ $n -le 84 ] ; then
 echo "良"
elif [ $n -ge 60 ] && [ $n -le 69 ] ; then
 echo "中"
else
 echo "差" 
fi
for循环
字符串型循环
# for循环一般格式为:
for 变量 in 值1 值2 值3…
do
程序
done
# 顺序输出当前列表中的数字:
#!/bin/bash
for loop in 1 2 3 4 5
do
    echo "The value is: $loop"
done
# 顺序输出字符串中的字符
#!/bin/bash
for str in 'This is a string'
do
    echo $str
done
# 打印/root目录下所有文件的名字 
#!/bin/bash  
for file in $(ls /root)
do 
        echo $file  
done
# 求1-100的和
sum=0
for ((i=1 ;i<=100 ;i++))
do sum=$[sum +i]
done
echo $sum
​
数字性循环
# 该格式的语法如下:
for ((初始值;循环控制条件;变量变化))
do
程序
done
# 案例
#!/bin/bash
for ((i = 0; i <= 5; i++)) 
do
    echo "welcome $i times"
done
while循环
# 语法
while 条件
do
    程序
done
# 案例,求1-100的和
#!/bin/bash
i=1
sum=0
while [ $i -le 100 ]
do
  let sum=sum+$i
  let i++
done
echo $sum
无限循环
# 无限循环语法格式:
while :
do
    command
done
# 或者
while true
do
    command
done
# 或者
for (( ; ; ))
case 语句
# 格式
case 变量名 in
    模式1) 输出内容
    ;;
    模式2) 输出内容
    ;;
    模式3) 输出内容
    ;;
esac
# 案例
read -p "请输入1-4数字:" num
# echo $num
case $num in
1) echo "你选择了1"
;;
2) echo "你选择了2"
;;
3) echo "你选择了3"
;;
4) echo "你选择了4"
;;
*) echo "输入并不正确"
;;
esac  
跳出循环
break
while :
do
    echo -n "输入 1 到 5 之间的数字:"
    
    read aNum
​
    case $aNum in
        1|2|3|4|5) echo "你输入的数字为 $aNum!"
        ;;
        *) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"
            break
        ;;
    esac
done
continue
#!/bin/bash
​
while :
​
do
​
    echo -n "输入 1 到 5 之间的数字: "
​
    read aNum
​
    case $aNum in
​
        1|2|3|4|5) echo "你输入的数字为 $aNum!"
        ;;
        *) echo "你输入的数字不是 1 到 5 之间的!"
            continue
            echo "游戏结束"
        ;;
    esac
done
函数
语法
# 格式
函数名(){
    表达式
}
函数名
# 案例
test(){
    echo "这是一个函数"
}
echo "---函数开始执行---"
test
echo "---函数执行完毕---"
​
函数参数
#!/bin/bash
funWithParam(){
    echo "第一个参数为 $1 !"
    echo "第二个参数为 $2 !"
    echo "第十个参数为 $10 !"
    echo "第十个参数为 ${10} !"
    echo "第十一个参数为 ${11} !"
    echo "参数总数有 $# 个!"
    echo "作为一个字符串输出所有参数 $* !"
}
​
funWithParam 1 2 3 4 5 6 7 8 9 34 73
群组
定义群组

array_name=(value1 ... valuen)

#!/bin/bash
​
my_array=(A B "C" D)
​
#我们也可以使用下标来定义数组:
array_name[0]=value0
array_name[1]=value1
array_name[2]=value2
读取数组

读取数组元素值的一般格式是:${array_name[index]}

test_num=("a" "b" "c" "d" "e")
echo "提取第一个元素 ${test_num[0]}"
echo "提取第四个元素 ${test_num[4]}" 
# 提取全部元素
echo "提取全部元素 ${test_num[*]}"
获取数组的长度
echo "数组元素个数为:${#test_num[*]}
echo "数组元素个数为:${#test_num[@]}
遍历数组
# 方式一
test_num=(aa bb cc dd)
for num in ${test_num[*]}
do echo $num
done
# 方式二
test_num_2=(aa bb cc dd ee)
test_num_2_num=${#test_num_2[*]}
for ((i=0 ; i<test_num_2_num ;i++));
do
 echo "----------"
 echo ${test_num_2[$i]}
done
​
加载其他文件的变量
# 第一步 创建 vim test1.sh 文件
#!/bin/bash
my_arr=(aa bb cc)
# 第二步 创建 vim test2.sh 文件
#!/bin/bash
source ./test1.sh
for var in ${my_arr[*]}
do
echo $var
done
​
​
1. 测试题目一:计算器程序

编写一个 Shell 脚本,实现一个简单的四则运算计算器程序,要求用户输入两个数字和一个运算符(加法、减法、乘法、除法),然后输出计算结果。

#!/bin/bash

# 提示用户输入两个数字和运算符
echo "请输入第一个数字:"
read num1

echo "请输入第二个数字:"
read num2

echo "请选择运算符(+、-、*、/):"
read operator

# 根据用户输入的运算符进行计算
case $operator in
    +)
        result=$((num1 + num2))
        ;;
    -)
        result=$((num1 - num2))
        ;;
    *)
        echo "无效的运算符。"
        exit 1
        ;;
esac

# 输出计算结果
echo "计算结果:$num1 $operator $num2 = $result"
 

2. 测试题目二:文件信息查看器

编写一个 Shell 脚本,实现一个文件信息查看器,用户输入一个文件名(包括路径),脚本能够判断该文件是文件还是目录,以及该文件的大小和权限信息,并输出这些信息给用户。

#!/bin/bash

# 提示用户输入文件名(包括路径)
echo "请输入要查看的文件名(包括路径):"
read filename

# 检查文件是否存在
if [ ! -e "$filename" ]; then
    echo "文件不存在!"
    exit 1
fi

# 判断文件类型
if [ -f "$filename" ]; then
    filetype="文件"
elif [ -d "$filename" ]; then
    filetype="目录"
else
    filetype="未知"
fi

# 获取文件大小
filesize=$(du -h "$filename" | cut -f1)

# 获取文件权限信息
filepermissions=$(ls -l "$filename" | cut -d ' ' -f 1)

# 输出文件信息
echo "文件类型: $filetype"
echo "文件大小: $filesize"
echo "权限信息: $filepermissions"
 

3.测试题目:文件重命名脚本

编写一个 Shell 脚本,实现将指定目录下的所有.txt文件批量重命名为.txt.bak的功能。

 

#!/bin/bash

# 指定目录
directory="/your/directory/path"

# 将指定目录下的所有.txt文件重命名为.txt.bak
for file in $directory/*.txt; do
    mv "$file" "${file%.txt}.txt.bak"
done
 

4.测试题目:文件搜索脚本

编写一个 Shell 脚本,实现在指定目录及其子目录中搜索包含指定关键字的文件,并输出这些文件的路径。

#!/bin/bash

# 指定搜索的目录
search_dir="/your/directory/path"

# 指定搜索的关键字
keyword="your_keyword"

# 在指定目录及其子目录中搜索包含关键字的文件
grep -r -l "$keyword" "$search_dir"
 

 

 

  • 27
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值