$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 num1echo "请输入第二个数字:"
read num2echo "请选择运算符(+、-、*、/):"
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"
标签:bin,文件,Shell,--,编程,echo,num,done,bash From: https://blog.csdn.net/hulknnn/article/details/137143334